Язык ассемблера для процессоров
INTEL, 5-е издание
Кип Р. Ирвин
Глава 8: Передача параметров
Слайды подготовил: Кип Р. Ирвин
Редакция: С.Б. Мусин
(c) Pearson Education, 2006-2007. All rights reserved. You may modify and copy this slide show for your personal use, or for use in the classroom, as long as this copyright statement, the author's name, and the title are not changed.
Обзор
•Стековые фреймы
•Рекурсия
•Директива .MODEL
•Директивы INVOKE, ADDR, PROC, and PROTO
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 2
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
|
Стековые фреймы |
|
|
Стековый фрейм процедуры |
|
||
|
|
|
|
|
• Stack frame стековый фрейм (кадр) |
|
|
• Передача параметров в стеке |
|
|
запись активации (activation record) |
|
|||
|
|
• Область в стеке зарезервированная при вызове |
|
||||
• |
Локальные переменные |
|
|
|
|||
|
|
процедуры для хранения адреса возврата, |
|
||||
• Команды ENTER и LEAVE |
|
|
передаваемых параметров, регистров и |
|
|||
• |
Директива LOCAL |
|
|
|
локальных переменных |
|
|
• |
Процедура WriteStackFrame |
|
|
• Создание стекового фрейма: |
|
|
|
|
|
|
|
|
• Вызывающая процедура помещает аргументы в |
|
|
|
|
|
|
|
стек и запускает вызываемую процедуру. |
|
|
|
|
|
|
|
• Вызванная процедура помещает EBP в стек, и |
|
|
|
|
|
|
|
устанавливает в EBP значение из ESP. |
|
|
|
|
|
|
|
• Если необходимы локальные переменные, из ESP |
|
|
|
|
|
|
|
вычитается константа, в результате резервируется |
|
|
|
|
|
|
|
необходимое для их хранения место в стеке. |
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
3 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
4 |
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
|
|
|
|
|
|
|
|
|
Передача параметров в стеке
•Более удобна, чем передача в регистрах
•Сравните:
pushad |
push TYPE array |
mov esi,OFFSET array |
push LENGTHOF array |
mov ecx,LENGTHOF array |
push OFFSET array |
mov ebx,TYPE array |
call DumpMem |
call DumpMem |
|
popad |
|
Передача параметров по значению
•Поместить передаваемые значения в стек
•(В защищенном режиме для того чтобы сохранить выравнивание стека следует помещать только двойные слова)
•Запустить вызываемую процедуру
•Для функций, возвращаемое значение в EAX
•Убрать параметры из стека, если их не убрала вызываемая процедура
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
5 |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
6 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
1
|
|
Пример |
|
|
|
|
|
Передача параметров по ссылке |
|
|
|
|
|
|
|
|
|
• Поместить в стек смещения параметров |
|
||
|
|
|
|
|
|
|
|
процедуры |
|
|
.data |
DWORD 5 |
(val2) |
6 |
|
|
|
• |
Вызвать процедуру |
|
|
val1 |
|
|
|
|
|
|
|
|||
val2 |
DWORD 6 |
(val1) |
5 |
ESP |
|
|
• |
Для функций, возвращаемое значение находится |
|
|
.code |
|
|
|
|
|
|
|
в EAX |
|
|
push val2 |
|
|
|
|
|
• Убрать параметры из стека, если их не убрала |
|
|||
push val1 |
Содержимое стека до |
|
|
|
||||||
|
|
|
|
|
вызываемая процедура |
|
|
|||
|
|
выполнения CALL |
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
||
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
7 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
8 |
||||
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
|
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
Пример
.data |
DWORD |
5 |
(offset val2) |
00000004 |
val1 |
(offset val1) |
00000000 |
||
val2 |
DWORD |
6 |
ESP |
|
|
|
|
|
|
.code |
|
|
|
|
push OFFSET val2 |
|
|
||
push OFFSET val1 |
Содержимое стека до |
|||
|
|
|
выполнения CALL |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 9
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Передача массива по ссылке (1 - 2)
•Процедура ArrayFill заполняет массив 16-битными случайными числами
•Вызывающая программа передает адрес массива, а также количество элементов в массиве:
.data count = 100
array WORD count DUP(?)
.code
push OFFSET array push COUNT
call ArrayFill
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 11
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Содержимое стека после выполнения CALL
ESP
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 10
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Передача массива по ссылке (2 - 2)
При доступе к элементам массива уже не используется имя массива:
ArrayFill PROC push ebp mov ebp,esp pushad
mov esi,[ebp+12] mov ecx,[ebp+8]
.
.
ESI указывает на начало массива, доступ к элементам массива осуществляется в цикле. ArryFill.asm .
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 12
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
2
Доступ к параметрам в стеке (C/C++)
• Функции C и C++ осуществляют доступ к параметрам в стеке путем задания константных смещений от EBP1.
• Пример: [ebp + 8]
• EBP называется указателем базы (base pointer, frame pointer) так как содержит базовый адрес стекового фрейма.
• EBP не изменяется пока выполняется функция.
• Значение EBP должно быть восстановлено при возврате из функции.
1 BP в реальном режиме адресации
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 13
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Кому убирать в стеке?
Вызывающая |
Вызываемая |
|
||
функция (C) |
...... или ...... |
(STDCALL): |
|
|
|
AddTwo PROC |
|
||
push val2 |
|
push ebp |
|
|
push val1 |
|
mov |
ebp,esp |
|
call AddTwo |
|
mov |
eax,[ebp+12] |
|
add esp,8 |
|
add |
eax,[ebp+8] |
|
|
|
pop |
ebp |
|
|
|
ret |
8 |
|
Директива MODEL указывает соглашение о вызовах |
|
|||
(рассматривается далее) |
|
|
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site |
Examples |
15 |
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 |
http://ppl.yohng.com. |
|
|
|
Команда RET
•Возврат из подпрограммы
•Извлекает значение из стека и помещает его в (EIP или IP). Управление передается на целевой адрес.
•Синтаксис:
•RET
•RET n
•Необязательный операнд n позволяет прибавить n байт к указателю стека, после того как EIP (или IP) было присвоено значение.
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 14
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Задача. . .
•Создайте процедуру Difference которая вычитает первый аргумент из второго. Пример вызова:
push 14 |
; first argument |
|
push 30 |
; second argument |
|
call Difference |
; EAX = 16 |
|
Difference PROC |
|
|
push ebp |
|
|
mov |
ebp,esp |
; second argument |
mov |
eax,[ebp + 8] |
|
sub |
eax,[ebp + 12] |
; first argument |
pop |
ebp |
|
ret |
8 |
|
Difference ENDP
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 16
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Передача байтов и слов
•В стек нельзя помещать байт
•Если в стек поместить слово, то может произойти ошибка «отсутствие страницы» (page fault), либо проблема выравнивания ESP
•Несовместимость с функциями WinAPI
•Используйте MOVZX или MOVSX для расширения
до двойного слова:
.data
charVal BYTE 'x'
.code
movzx eax,charVal push eax
call Uppercase
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 17
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Передача нескольких слов
•Сначала в стек следует помещать старшее значение
•Получаем прямой порядок байтов (little-endian)
•Пример:
.data |
|
|
longVal DQ 1234567800ABCDEFh |
|
|
.code |
DWORD PTR longVal + 4 |
; high doubleword |
push |
||
push |
DWORD PTR longVal |
; low doubleword |
call |
WriteHex64 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 18
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
3
Сохранение и восстановление значений регистров в стеке
•Помещайте регистры в стек сразу за установкой
ESP в EBP
•локальные регистры (local registers) изменяеются внутри процедуры
MySub PROC |
|
|
|
|
push |
ebp |
|
|
|
mov |
ebp,esp |
; save local registers |
|
|
push |
ecx |
|
||
push |
edx |
|
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
19 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Влияние на стек оператора USES
MySub1 PROC USES ecx edx ret
MySub1 ENDP
•Оператор USES генерирует код для сохранения и восстановления регистров:
MySub1 PROC push ecx push edx
pop edx pop ecx
ret
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 20
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Локальные переменные
•Область видимости находится внутри процедуры
Пример:
int x=10, y=20;
|
|
|
EBP |
MySub PROC |
|
|
[ebp-4] |
ebp |
|
[ebp-8] |
|
push |
|
|
|
mov |
ebp,esp |
;create 2 DWORD variables |
|
sub |
esp,8 |
||
mov |
DWORD PTR [ebp-4],10 ; initialize x=10 |
||
mov |
DWORD PTR [ebp-8],20 ; initialize y=20 |
||
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
21 |
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 |
http://ppl.yohng.com. |
|
|
Команда LEA
•LEA возвращает смещения прямых и косвенных операндов
•Оператор OFFSET возвращает только константные смещения, стековый фрейм не обязательно начинается в одном и том же месте памяти
•LEA необходима для получения смещения параметров в стеке и локальных переменных
•Пример
CopyString PROC, count:DWORD
LOCAL temp[20]:BYTE
mov edi,OFFSET count |
; invalid operand |
|
mov esi,OFFSET temp |
; invalid operand |
|
lea edi,count |
; ok |
|
lea esi,temp |
; ok |
22 |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Пример |
|
|
|
Локальная переменная [ebp-8] |
|
|
|
Для получения в ESI ее адреса |
|
|
|
Нельзя: |
|
; error |
|
mov esi, OFFSET [ebp-8] |
|
|
|
Следует использовать LEA: |
|
|
|
lea esi,[ebp-8] |
|
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site |
Examples |
23 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Команда ENTER
•ENTER размер_области, уровень_вложенности
•ENTER создает
•помещает EBP в стек
•устанавливает в EBP адрес базы стекового фрейма
•резервирует пространство для локальных переменных
•Пример:
MySub PROC enter 8,0
• Эквивалент:
MySub PROC push ebp mov ebp,esp sub esp,8
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 24
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
4
Команда LEAVE
Уничтожить стековый фрейм.
|
|
Эквивалентные операции |
||
MySub PROC |
push |
ebp |
|
|
enter 8,0 |
mov |
ebp,esp |
|
|
... |
sub |
esp,8 |
; 2 local DWORDs |
|
... |
|
|
|
|
... |
mov |
esp,ebp |
; free local space |
|
leave |
||||
ret |
pop |
ebp |
|
|
MySub ENDP |
|
|
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site |
Examples |
25 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Директива LOCAL
•Директива LOCAL объявляет список локальных переменных
•следует непосредственно за директивой PROC
•указывается тип каждой переменной
•Синтаксис:
LOCAL varlist
Пример:
MySub PROC
LOCAL var1:BYTE, var2:WORD, var3:SDWORD
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 26
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Использование LOCAL
Примеры:
LOCAL flagVals[20]:BYTE |
; array |
of bytes |
|
|
LOCAL pArray:PTR WORD |
; pointer to an array |
|
||
myProc PROC, |
; procedure |
|
||
LOCAL t1:BYTE, |
; local |
variables |
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
27 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Пример (1 - 2)
BubbleSort PROC
LOCAL temp:DWORD, SwapFlag:BYTE
. . .
ret BubbleSort ENDP
MASM генерирует следующий код:
BubbleSort PROC |
|
|
push ebp |
|
|
mov |
ebp,esp |
; add -8 to ESP |
add |
esp,0FFFFFFF8h |
|
. . . |
esp,ebp |
|
mov |
|
|
pop |
ebp |
|
ret |
|
|
BubbleSort ENDP
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 28
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
|
|
|
|
Пример (2 - 2) |
|
|
Размер локальных переменных |
|
|||
Стековый фрейм процедуры BubbleSort: |
|
|
• Директива LOCAL резервирует в стеке: |
|
|||||||
|
|
|
|
|
|
|
|
|
• BYTE: следующий доступный байт |
|
|
|
|
|
|
|
|
|
|
|
• WORD: следующее слово , выровненное по четной |
||
|
|
|
|
|
|
|
|
|
границе |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
• DWORD: следующее двойное слово |
|
|
|
|
|
|
|
|
|
|
|
• Пример: |
|
|
|
|
|
|
|
|
|
|
|
Example1 PROC |
|
|
|
|
|
|
|
|
|
|
|
LOCAL var1:BYTE |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
mov al,var1 |
|
|
|
|
|
|
|
|
|
|
|
ret |
|
|
|
|
|
|
|
|
|
|
|
Example1 ENDP |
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
29 |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
30 |
|||||
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
|
|
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com. |
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
5
Процедура WriteStackFrame
•Отображает содержимое текущего стекового фрейма
•Прототип:
WriteStackFrame PROTO, |
; number of passed parameters |
|||
numParam:DWORD, |
||||
numLocalVal: DWORD, |
; |
number |
of |
DWordLocal variables |
numSavedReg: DWORD |
; |
number |
of |
saved registers |
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 31
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Пример использования
WriteStackFrame
main PROC
mov eax, 0EAEAEAEAh mov ebx, 0EBEBEBEBh
INVOKE aProc, 1111h, 2222h exit
main ENDP
aProc PROC USES eax ebx, x: DWORD, y: DWORD LOCAL a:DWORD, b:DWORD PARAMS = 2
LOCALS = 2 SAVED_REGS = 2 mov a,0AAAAh mov b,0BBBBh
INVOKE WriteStackFrame, PARAMS, LOCALS, SAVED_REGS
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 32
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Рекурсия
Процедура CalcSum рекурсивно вычисляет сумму массива целых чисел. Принимает: ECX = count. Возвращает: EAX = sum
CalcSum PROC |
; check counter value |
cmp ecx,0 |
|
jz L2 |
; quit if zero |
add eax,ecx |
; otherwise, add to sum |
dec ecx |
; decrement counter |
call CalcSum |
; recursive call |
L2: ret |
|
CalcSum ENDP |
|
Стековый |
см cSum.asm |
|
|
|
|
фрейм: |
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
33 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Расчет факториала (2 - 3)
Factorial PROC |
|
|
push ebp |
|
|
mov |
ebp,esp |
; get n |
mov |
eax,[ebp+8] |
|
cmp |
eax,0 |
; n < 0? |
ja |
L1 |
; yes: continue |
mov |
eax,1 |
; no: return 1 |
jmp |
L2 |
|
L1: dec |
eax |
; Factorial(n-1) |
push |
eax |
|
call |
Factorial |
|
;Instructions from this point on execute when each
;recursive call returns.
ReturnFact: |
; get |
n |
|
|
mov |
ebx,[ebp+8] |
eax * ebx |
||
mul |
ebx |
; eax |
= |
|
L2: pop |
ebp |
; return EAX |
||
ret |
4 |
; clean |
up stack |
Factorial ENDP
См. Fact.asm
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 35
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Расчет факториала (1 - 3)
Функция вычисляет факториал числа n. Новое значение n сохраняется в стековом фрейме:
int function factorial(int n)
{
if(n == 0) return 1;
else
return n * factorial(n-1);
}
На каждой итерации возвращаемое значение произведения умножается на значение n полученное на предыдущем шаге.
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 34
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Расчет факториала (3 - 3)
Расчет 12!
На рисунке изображены четыре первых стековых фрейма созданных рекурсивными вызовами функции
Каждый рекурсивный вызов занимает 12 байт в стеке.
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 36
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
6
Директива .MODEL
•Позволяет задать модель памяти, описатель языка (language specifier).
•Синтаксис:
.MODEL memorymodel [,modeloptions]
•memorymodel:
•tiny, small, medium, compact, large, huge, flat
•modeloptions:
• |
способ именования процедур |
|
описатель |
||
• соглашения о передаче параметров |
языка |
|
|||
|
|
||||
• |
модификатор стека |
|
|
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site |
Examples |
37 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Модели памяти
•Модель памяти программы определяет количество и размер сегментов данных и кода.
•В реальном режиме адресации поддерживаются tiny, small, medium, compact, large, huge.
•Защищенный режим поддерживает модель flat.
Small : code < 64 KB, data (+ stack) < 64 Кб, Offset = 16 бит.
Flat : code + data < 4 GB. Offset 32 бита.
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 38
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Описатель языка
•C:
•все PUBLIC имена начинаются с символа ‘_’
•параметры помещаются в стек в обратном порядке (справа налево)
•вызывающая процедура очищает стек
•STDCALL
•Формат имени: _name@nn
•параметры помещаются в стек в обратном порядке (справа налево)
•вызываемая очищает стек
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 39
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
INVOKE, ADDR, PROC, and PROTO (8.5)
•Директива INVOKE
•оператор ADDR
•Директива PROC
•Директива PROTO
•Parameter Classifications
•Пример: Обмен значений
•Debugging Tips
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 40
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Директива INVOKE
•Директива INVOKE заменяет команду ЦП CALL и позволяет передавать параметры через стек
•Синтаксис:
INVOKE procedureName [, argumentList]
•ArgumentList список параметров
•В качестве параметров можно использовать:
•непосредственные значения и выражения
•переменные
•адреса и указатели
•регистры
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 41
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Пример
.data
byteVal BYTE 10 wordVal WORD 1000h
.code
; direct operands:
INVOKE Sub1,byteVal,wordVal
;address of variable: INVOKE Sub2,ADDR byteVal
;register name, integer expression: INVOKE Sub3,eax,(10 * 20)
;address expression (indirect operand): INVOKE Sub4,[ebx]
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 42
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
7
Оператор ADDR
•Возвращает ближний или дальний указатель на переменную,
взависимости от используемой модели памяти:
•Small: смещение16-бит
•Large: сегмент/смещение 32-бита
•Flat : смещение 32-бита
•Пример:
.data
myWord WORD ?
.code
INVOKE mySub,ADDR myWord
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 43
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Директива PROC (1 - 2)
•Директива PROC позволяет объявить процедуру.
•Синтаксис:
label PROC [paramList]
•paramList список параметров разделенных запятой. Синтаксис параметра:
paramName : type
type стандартный тип ЯА (BYTE, SBYTE, WORD, etc.) или указатель на значение стандартного типа.
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 44
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Директива PROC (2 - 2)
•Альтернативный формат позволяет начать запись параметров со следующей строки:
label PROC, нужна запятая paramList
• Однострочное объявление списка параметров: param-1:type-1, param-2:type-2, . . ., param-n:type-n
• Многострочное объявление: param-1:type-1,
param-2:type-2,
. . ., param-n:type-n
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 45
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Примеры (1 - 2)
•Процедура AddTwo принимает два числа и возвращает сумму в EAX.
AddTwo PROC,
val1:DWORD, val2:DWORD
mov eax,val1 add eax,val2
ret AddTwo ENDP
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 46
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Примеры (2 - 3)
FillArray принимает указатель на массив байтов, значение, которым будет заполнен массив и длину массива.
FillArray PROC,
pArray:PTR BYTE, fillVal:BYTE arraySize:DWORD
mov ecx,arraySize mov esi,pArray mov al,fillVal
L1: mov [esi],al inc esi loop L1
ret FillArray ENDP
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 47
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Примеры (3 - 3)
Swap PROC, pValX:PTR DWORD, pValY:PTR DWORD
. . .
Swap ENDP
ReadFile PROC, pBuffer:PTR BYTE
LOCAL fileHandle:DWORD
. . .
ReadFile ENDP
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 48
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
8
Директива PROTO
•Прототип процедуры
•Синтаксис:
•label PROTO paramList
•Каждая процедура для вызова которой
используется INVOKE должна иметь прототип
•Полное объявление тоже прототип
•Пример
ArraySum PROTO, |
; points to the array |
|
ptrArray:PTR DWORD, |
|
|
szArray:DWORD |
; array size |
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
49 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
Директива PROTO
•Стандартная конфигурация: PROTO в начале листинга программы, INVOKE в сегменте кода далее объявление процедуры:
MySub PROTO |
; procedure prototype |
|
|
.code |
; procedure call |
|
|
INVOKE MySub |
|
||
MySub PROC |
; procedure implementation |
|
|
. |
|
|
|
. |
|
|
|
MySub ENDP |
|
|
|
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. |
Web site Examples |
50 |
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
The End
void weird()
{
int a;
*(&a + 2) += 7;
}
int x = 0; weird(); x = 1;
printf("%d\n",x);
Irvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. Web site Examples 51
Мусин С.Б., каф. ПОИТ, БГУИР, 2007 http://ppl.yohng.com.
9