Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по ямп.docx
Скачиваний:
10
Добавлен:
01.04.2025
Размер:
161.76 Кб
Скачать

40.Процедуры в языке ассемблера. Возврат результата. Локальные данные.

Передача результата процедуры

Для передачи результата процедуры обычно используется регистр EAX. Этот способ используется не только в программах на языке ассемблера, но и в программах на языке С++. Объекты, имеющие размер не более 8 байт, могут передаваться через регистровую пару EDX:EAX. Вещественные числа передаются через вершину стека вещественных регистров. Если эти способы не подходят, то следует передать в качестве параметра адрес ячейки памяти, куда будет записан результат.

; Передача параметров через стек, возврат результата через регистр EAX

.686

.model flat, c

option casemap: none

include \masm32\include\windows.inc

include \masm32\include\kernel32.inc

includelib \masm32\lib\kernel32.lib

.data

a dd 76

b dd -8

c dd ?

.code

program:

push b ; Кладём параметры в стек

push a

call Procedure

add esp, 8 ; Освобождаем 8 байт стека

mov c, eax ; c = a – b

push 0

call ExitProcess

Procedure proc

mov eax, [esp + 4] ; Заносим в регистр EAX первый параметр

mov edx, [esp + 8] ; Заносим в регистр EDX второй параметр

sub eax, edx ; В регистре EAX получилась разность параметров

ret

Procedure endp

end program

; Передача параметров через стек, возврат результата по адресу

.686

.model flat, c

option casemap: none

include \masm32\include\windows.inc

include \masm32\include\kernel32.inc

includelib \masm32\lib\kernel32.lib

.data

a dd 76

b dd -8

c dd ?

.code

program:

push offset c ; Кладём в стек адрес переменной, куда будет записан результат

push b

push a

call Procedure

add esp, 8 ; Освобождаем 8 байт стека

push 0

call ExitProcess

Procedure proc

mov eax, [esp + 4] ; Заносим в регистр EAX первый параметр

mov edx, [esp + 8] ; Заносим в регистр EDX второй параметр

sub eax, edx ; В регистре EAX получилась разность параметров

mov edx, [esp + 12] ; Заносим в регистр EDX третий параметр – адрес результата

mov [edx], eax ; Записываем результат по адресу в регистре EDX

ret

Procedure endp

end program

Локальные данные процедур

Процедуры часто нуждаются в локальных данных. Локальные переменные размещаются в стеке. Для того чтобы отвести место под локальные переменные в процедуре на языке ассемблера, достаточно просто вычесть из регистра ESP размер требуемой памяти. После этого все вызываемые процедуры будут «знать», что место в стеке занято, и размещать свои данные в незанятой части стека.

При вызове других процедур, а также в ходе выполнения текущей процедуры в стек могут быть положены другие данные. При этом значение регистра ESP изменится. Поэтому регистр ESP не является надёжной точкой отсчёта для адресов локальных переменных. Для того чтобы получить такую точку отсчёта, значение регистра ESP переписывают в регистр EBP, предварительно сохранив значение регистра EBP в стеке. В этом случае регистр EBP отмечает часть стека, занятую на момент начала работы процедуры (отсюда происходит название регистра EBP – указатель базы кадра стека). При таком подходе первый параметр процедуры всегда находится по адресу [EBP + 8]. Адреса локальных переменных отсчитываются от регистра EBP с отрицательным смещением. По окончании работы процедуры значение регистра ESP восстанавливается по регистру EBP, а значение регистра EBP – из стека.