Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MProc / M2 / Лекция 2.doc
Скачиваний:
41
Добавлен:
16.04.2013
Размер:
207 Кб
Скачать
☆

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