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

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