Краткие теоретические сведения
Современные системы программирования включают в себя и средства для написания и отладки ассемблерных программ - как в виде вставок в программы, так и в виде автономных модулей. При этом вставка ассемблерных фрагментов в программу выполняется с помощью директивы _asm в двух вариантах: вариант 1: _asm mov ax, bx _asm add ax, 33h _asm and ax,l вариант 2: _asm { movax, bx add ax, 33h and ax, 1 } При этом, естественно должны соблюдаться соглашения по использованию регистров, принятые для данного компилятора и данной модели памяти. Часто ассемблерные подпрограммы оформляются в виде автономного программного модуля. В этой случае они размещаются в файле с расширением .asm и могут компилироваться и отлаживаться отдельно. Для упрощения программирования используется набор встроенных псевдокоманд.
Пример автономной программы на Ассемблере: TITLE HELLO CR EQU 13 ;определение констант LF EQU 10 .MODEL TINY;генерировать .СОМ - файл .STACK lOOh ;стек 256 байт .DATA ;начало сегмента данных msg DB "Hello, world.", CR, LF, "$" ; текст для вывода .CODE ;начало кодовогосегмента .STARTUP;инициализировать сегмент данных и задать SS=DS mov ah, 9h ;обращение к DOS, функция 9 mov dx, OFFSET msg ;загрузить в DS смещение строки (сегмент уже в DS) int 21.h ;вывести строку .EXIT О ;выход с кодом возврата 0 end ;конец текста программы
При компиляции и отладке этой программы следует правильно установить режим работы QC: Options –Make - Compiler flags - Memory model - Small Options – Make - Linker flags - Generate COM-file Пример оформления этой программы в виде Си-функции
TITLE HELLO CR EQU 13;определение констант LF ECU 10 .MODEL SMALL,С .DATA ;начало сегмента данных msg DB "Hello, world.", CR, LF, "$" ; текст для вывода .CODE ;начало кодового сегмента hello PROC NEAR, С ;начало процедуры mov ah, 9h ;обращение к DOS, функция 9 mov dx, OFFSET msg ;загрузить в DS смещение строки (сегмент уже в DS) int 21h ;вывести строку ret ;возврат из процедуры hello ENDP
Перед компиляцией следует отключить режим генерации СОМ-файла (см. выше), поскольку QC не поддерживает эту возможность. Пример этого же фрагмента в виде ассемблерной вставки:
char msg[] = "Hello, world.\r\n$ "; _asm { mov ah, 9h ;обращение к DOS, функция 9 movdx, OFFSET msg ;загрузить в DS смещение строки (сегмент уже в DS) int 21h ;вывести строку } При использовании таких ассемблерных вставок желательно сохранять в стеке и затем восстанавливать используемые регистры. Методические указания При выполнении работы можно использовать регистры AX, BX, CX, DX и регистровый и непосредственный методы адресации. Для задания констант используйте директиву EQU. При пошаговой отладке программы и подпрограмм контролировать содержимое регистров можно в окне Registers, которое включается с помощью цепочки команд: View - Windows - Register Длясвязи ассемблерных подпрограмм с Си следует использовать директивы EXTRN и GLOBAL. 4. Порядок выполнения работы 4.1. Написать автономную программу на Ассемблере, выполняющую арифметические и логические операции над словами и байтами по вариантам согласно Заданий. Исходные данные задать с помощью директивы EQU. Результаты работы поместить в ячейки памяти. Проконтролировать правильность работы программы в пошаговом режиме. 4.2. Оформить эту же программу в виде Си-функции. В качестве исходных данных использовать значения глобальных переменных из головной Си-программы. Результат работы поместить в те же глобальные переменные. Ввод и вывод данных оформить в головной программе. 4.3. Оформить эту же программу в виде ассемблерного фрагмента в головной программе. Исходные данные и результат поместить в локальные переменные, описанные в головной программе. ©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.
|