- •Source Directory
- •IncludEимя_файла_с_путём
- •Include dop1.Asm
- •Операции
- •Взаимодействие с языками высокого уровня.
- •II equ word ptr ll ; Равно5678h
- •I2 equ word ptr c2 ; Равно…
- •Id_table label byte
- •Id_table label byte
- •Irp формальный_аргумент,
- •Irpc формальный_аргумент,строка_символов
- •Irpc rg,
- •IFxxx логическое_выражение_или_аргументы
- •If(e) логическое_выражение
- •If(n)def символическое_имя
- •Ifndef sw ;если sw не определено, то выйти из макроса
- •If(n)b аргумент
II equ word ptr ll ; Равно5678h
Схема размещения в памяти IBMPCпеременной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видит на верхушке стекапоследнийаргумент, а при выборке аргументовдолжнаосвобождать стек.
Параметры могут передаваться в подпрограмму
по значению (в стек помещается значение аргумента), либо
по адресу (в стек помещается адрес аргумента). Адрес может быть двух или четырехбайтовым, в зависимости от модели памяти. В последнем случае, смещение находится в более младших байтах.
Подпрограмма не может передавать головной программе результаты свой работы через стек, поскольку он освобождается после выхода из подпрограммы. Для возврата результатов используются механизмы:
При вызове, возвращаемый параметр задаётся по адресу, т.е. в стек помещается адрес того места, куда подпрограмма должна положить вычисленный результат.
В TurboC, результаты вычислений функций типов с плавающей точкой, возвращаются через верхушку стека сопроцессора – регистрst(0). Результаты вычисления целочисленных функций возвращаются в регистреAX(AL), либо в паре регистровAX,DX.
В MicrosoftC, результаты вычислений функций помещаются в память, а подпрограмма помещает в регистр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