Читайте также:
|
|
push ВР; устанавливаем фрейм стека, как обычно
mov BP,SP
sub SP,4; корректируем указатель стека. Теперь наши
;переменные не будут случайно изменены
;Вся работа выполняется здесь
add SP,4; перед уничтожением фрейма стека надо восстановить
; исходное значение указателя стека
pop ВР
; уничтожаем фрейм стека,
; восстанавливая регистр ВР
Директива LOCAL
Заметьте, что в Листинге 2.4 мы изменили значение регистра SP не только в начале процедуры, но и в конце (перед тем как восстановить регистр ВР). Эта техника обычно используется для размещения переменных в ассемблерных процедурах при их вызовах из языков высокого уровня.
В листинге 2.4 это делалось вручную. А вот MASM 5.1 и более поздние версии имеют встроенную директиву, которая выполняет это автоматически. Это директива LOCAL и она имеет следующий синтаксис:
LOCAL variable name: type, variable name: type,...
(Любопытно. MASM все больше становится похож на Си. К чему бы это?) Давайте теперь напишем программу с использованием директивы LOCAL. Она называется Timer и требует одного параметра — time, который затем помещает в локальную переменную asm time. Из Си этот вызов будет выглядеть так:
Timer(25);
Листинг 2.5 показывает реализацию программы Timer на ассемблере, используя все директивы, которые мы обсудили в этой главе.
Дата добавления: 2015-07-12; просмотров: 88 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Листинг 2.3. Модифицированная версия Add_Int. | | | Листинг 2.5. Программа Timer. |