- •Include directory
- •Include имя_файла_с_путём
- •Include dop1.Asm
- •Операции
- •Взаимодействие с языками высокого уровня.
- •II equ word ptr ll ; Равно 5678h
- •I2 equ word ptr c2 ; Равно …
- •Irp формальный_аргумент,
- •Irpc формальный_аргумент,строка_символов
- •Irpc rg,
- •Id_table label byte
- •Id_table label byte
- •IFxxx логическое_выражение_или_аргументы
- •If(e) логическое_выражение
- •If(n)def символическое_имя
- •Ifndef sw ;если sw не определено, то выйти из макроса
- •If(n)b аргумент
II equ word ptr ll ; Равно 5678h
Схема размещения в памяти IBM PC переменной LL типа unsigned long (младшие разряды числа в байте с меньшим адресом).
-
0x1E190FFC
адреса байтов
1000
0FFF
0FFE
0FFD
0FFC
1
2
3
4
5
6
7
8
CC
II
LL
C2 DB 12h,34h,56h,78h
I2 equ word ptr c2 ; Равно …
L2 EQU DWORD PTR C2 ; Равно …
Особенности организации связей в языках C и Pascal.
Заполнение стека для программы типа pascal |
|
Заполнение стека для программы типа С |
||||||||
|
|
|
|
|
|
|
||||
|
Первый аргумент |
|
|
|
Последний аргумент |
|
||||
|
Второй аргумент |
|
|
|
. . . |
|
||||
|
. . . |
|
|
|
Второй аргумент |
|
||||
|
Последний аргумент |
|
|
|
Первый аргумент |
|
||||
|
|
|
|
|
|
|
||||
Стек освобождается подпрограммой |
|
Стек освобождается только головной программой |
||||||||
|
|
|
|
|
|
|
||||
Ассемблерная подпрограмма, которая должна работать …
… в среде типа С видит на верхушке стека первый аргумент, а при выборке аргументов не должна освобождать стек;
… в среде типа pascal видит на верхушке стека последний аргумент, а при выборке аргументов должна освобождать стек.
Параметры могут передаваться в подпрограмму
по значению (в стек помещается значение аргумента), либо
по адресу (в стек помещается адрес аргумента). Адрес может быть двух или четырехбайтовым, в зависимости от модели памяти. В последнем случае, смещение находится в более младших байтах.
Подпрограмма не может передавать головной программе результаты свой работы через стек, поскольку он освобождается после выхода из подпрограммы. Для возврата результатов используются механизмы:
При вызове, возвращаемый параметр задаётся по адресу, т.е. в стек помещается адрес того места, куда подпрограмма должна положить вычисленный результат.
В Turbo C, результаты вычислений функций типов с плавающей точкой, возвращаются через верхушку стека сопроцессора – регистр st(0). Результаты вычисления целочисленных функций возвращаются в регистре AX(AL), либо в паре регистров AX,DX.
В Microsoft C, результаты вычислений функций помещаются в память, а подпрограмма помещает в регистр AX указатель-смещение этой области памяти. Если же она не в сегменте, на который указывает DS, то дополнительно, подпрограмма помещает в регистр DX адрес сегмента.
Отметим, что язык C допускает ассемблерные вставки:
asm
инструкции ассемблера
end;
но вы не должны использовать этот приём в лабораторных работах.
Макросредства.
Макроопределения:
имя_макро MACRO формальные_параметры
LOCAL список_имён ; Локализация имён макро
тело макроопределения, инструкции и директивы
ENDM
Формальные параметры заменяются на фактические.
Имена, фигурирующие в списке LOCAL заменяются на “??номер”.
В макроопределении могут использоваться специальные операторы ассемблера:
&формальный_параметр – оператор присоединения параметра к строке символов, не являющихся ограничителями
<текст> - текстовый оператор литерала позволяет рассматривать текст на следующем уровне генерации как неделимый атомарный объект, включая ограничители, и использовать его как фактический параметр.
!символ – символьный оператор литерала, позволяет использовать ограничитель как фактический параметр
%текст – оператор выражения трактует следующий текст перед макрооперацией, как выражение, значение которого замещает формальный параметр
;;текст – макрокомментарий, не отображаемый в макрорасшинении
Внутри макроопределения может находиться оператор EXITM, который обеспечивает выход из генерации текущего макрорасширения до достижения директивы ENDM.
Директивы WHILE и REPT.
Директивы WHILE и REPT применяют для повторения определенное количество раз некоторой последовательности строк.
Эти директивы имеют следующий синтаксис:
WHILE константное_выражение
последовательность_строк
ENDM
REPT константное_выражение
последовательность строк
ENDM
Обратите внимание, что последовательность повторяемых строк в обеих директивах ограничена директивой ENDM.
При использовании директивы WHILE макрогенератор транслятора будет повторять последовательность_строк до тех пор, пока значение константное_выражение не станет равно нулю. Это значение вычисляется каждый раз перед очередной итерацией цикла повторения (то есть значение константное_выражение должно подвергаться изменению внутри последовательность_строк в процессе макрогенерации).
Директива REPT, подобно директиве WHILE, повторяет последовательность_строк столько раз, сколько это определено значением константное_выражение. Отличие этой директивы от WHILE состоит в том, что она автоматически уменьшает на единицу значение константное_выражение после каждой итерации.
В качестве примера рассмотрим листинг, в котором демонстрируется применение директив WHILE и REPT для резервирования области памяти в сегменте данных. Имя идентификатора и длина области задаются в качестве параметров для соответствующих макросов def_sto_1 и def_sto_2.
;Использование директив повторения
def_sto_1 macro id_table,ln:=<5>
;макрос резервирования памяти длиной len.
;Используется WHILE
