Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по технологиям программирования.pdf
Скачиваний:
53
Добавлен:
02.06.2015
Размер:
4.73 Mб
Скачать

Каркас программы

.MODEL FLAT, STDCALL

.DATA

<инициализируемыеданные>

.DATA?

<неинициализиpуемыеданные>

.CONST

<константы>

.CODE

<метка>proc < код> <метка>endp

END

 

 

Интерфейс с языками высокого уровня

 

Возврат значений из процедур ассемблера

 

 

 

Размер

 

Регистр (регистровая пара), в котором возвращается значение

 

 

 

 

 

 

 

 

 

 

1 байт

 

AL

 

 

 

 

2 байта

 

AX

 

 

 

 

4 байта

 

EAX

 

 

 

 

более 4 байт

 

процедура должна зарезервировать место для возвращаемого значения и

 

 

 

 

передать его адрес в регистровой паре EDX:EAX.

 

 

 

 

 

 

 

 

 

 

Директивы передачи параметров

 

 

 

 

 

 

 

 

 

 

 

 

Директива

 

 

Передача параметров

Очистка стека

Использование

 

 

 

 

 

 

 

регистров

 

 

 

 

 

 

 

 

 

 

fastcall (register)

 

 

Слева направо

Процедура

еax,edx,ecx (pascal)

 

 

 

 

 

 

 

еcx,edx (VC++)

 

 

 

 

 

 

 

 

 

 

pascal

 

 

Слева направо

Процедура

нет

 

 

 

 

 

 

 

 

 

 

cdecl

 

 

Справа налево

Вызывающая

нет

 

 

 

 

 

 

программа

 

 

 

 

 

 

 

 

 

 

 

stdcall

 

 

Справа налево

Процедура

нет

 

 

 

 

 

 

 

 

 

Вход в подпрограмму

Младшие адреса

 

ESP

 

ESP+4

ESP+8

 

 

 

 

 

 

?

Адрес

Param1

Param2

 

возврата

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

void _stdcall Myproc (int param1,int param2) int AddTwo (int,int)

Выход из подпрограммы

Младшие адреса

 

 

 

 

ESP

ESP+4

?

 

?

 

Param1

Param2

 

 

 

 

 

 

 

stdcall

ret 8

 

 

C

ret

 

stdcall

_имя@nn

_Myproc@8 Myproc(10,15);

push 15; Второй аргумент push 10 ; Первый аргумент call _Myproc@8

C

_AddTwo

int c=AddTwo(10,15);

push 15; Второй аргумент push 10 ; Первый аргумент call _AddTwo

add esp 8

Стековый фрейм

Для создания стековогофрейма программадолжна выполнить перечисленные нижедействия:

поместить аргументы в стек;

вызвать процедуру командой CALL, в результате чегоадрес возврата помещается в стек;

в начале выполнения процедуры сохранить в стеке регистр ЕВР;

загрузить в регистр EBP текущийуказатель стека из регистра ESP.

Пример вызова функции extern "C" int razn(inta, int b); void main()

{

inta,b,c; a=20; b=10; c=razn(a,b);

cout << c <<"\n";

.MODEL FLAT , C

.CODE

raznproc a:dword, b:dword ;push ebp

;mov ebp,esp

mov eax,word ptr[ebp+8] movebx,word ptr[ebp+12] subeax,ebx ;movesp,ebp

;pop ebp ret

raznendp end

}Структура стекового фрейма функции razn

Адрес в SP

Содержимое

 

 

 

 

 

 

0x0000FFE6

xxxx

Предыдущее

BP

 

 

значение BP

 

 

 

0x0000FFEA

xxxx

Адрес возврата в

BP+4

 

 

main

 

0x0000FFEE

0014

Значение

BP+8

 

 

переменной "a"

 

 

 

0x0000FFF2

000A

Значение

BP+12

 

 

переменной "b"

 

 

 

Пример вызовапроцедуры

extern "C" void sum(int a, int b, int & c); void main()

{

int a,b,c; a=10; b=20; sum(a,b,c);

cout << c <<"\n";

}

Содержимое BP регистра BP

Адрес возврата в BP+4 main

Значение BP+8 переменной "a"

Значение BP+12 переменной "b"

Адрес переменной BP+16 "с" в процедуре

main

.MODEL FLAT,C ;

.CODE

sumproca:dword, b:dword,cp:ptrdword push ebp

movebp,esp push eax pushebx push esi

moveax,dwordptr[ebp+8];

movebx,dwordptr[ebp+12]; add eax,ebx

movesi, dwordptr[ebp+16]; mov[esi],eax ;

popesi pop ebx pop eax movesp,ebp popebp ret

sum endp end

Вызов функции с локальными переменными

С=(А+B)+(B-A)* B*A

 

extern "C" int calc(inta, int b);

.MODEL FLAT,C

 

 

.CODE

 

 

 

void main()

 

 

 

 

 

 

 

calc proc

a:dword, b:dword

 

{int a,b,c;

 

 

push ebp

 

 

 

a=10;

 

 

movebp,esp

 

 

 

 

subesp,8 ;

 

 

b=20;

 

 

 

 

 

 

push ebx

 

 

 

c = calc(a,b);

 

 

moveax,dword ptr[ebp+8] ; a

 

cout << c <<"\n";

 

 

movebx,dword ptr[ebp+12] ; b

 

 

 

add eax,ebx

 

}

 

 

; a+b

 

 

movdword ptr[ebp-4],eax

 

Содержимое

 

 

moveax,dword ptr[ebp+8]

 

 

 

 

 

 

 

 

subebx,eax

 

 

 

 

 

 

 

 

 

 

movdword ptr[ebp-8],ebx ; b-a

 

место для 2-ой локальной.

BP-8

 

переменной

 

 

movebx,dword ptr[ebp+12]

 

 

место для 1-ой локальной.

BP-4

mulebx

; a*b

 

 

переменной

 

 

mul dword ptr[ebp-8] ; a*b*(b-a)

 

Содержимое регистра BP

BP

add eax,dword ptr[ebp-4]

; ab(b-a)+(a+b)

 

 

 

 

popebx

 

 

 

Адрес возвратав main

 

 

 

 

 

 

 

mov esp,ebp

 

 

 

 

 

 

 

Значениепеременной "a"

BP+8

popebp

 

 

 

 

 

 

ret

 

 

 

Значениепеременной "b"

BP+12

 

 

 

calcendp

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

end

 

 

Введение