Для передачи результата процедуры обычно используется регистр 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