Передача параметров через регистры
Для задания параметров или их адресов используются регистры.
Пример 1. Составить вызывающую программу и функцию для вычисления наибольшего общего делителя для двух целых положительных чисел с помощью алгоритма Эвклида.
Для данной программы исходными данными являются 2 целых числа, результатом является значение наибольшего общего делителя. Параметрами являются значения 2-х чисел и адрес результата. Пусть исходные данные передаются через регисты EAX, EBX, а адрес результата через регистр ECX
IDEAL
p586
MODEL FLAT
extrn ExitProcess:proc
DATASEG
X DD 150
Y DD 120
Z DD ?
CODESEG
begin:
mov eax, [X]
mov ebx, [Y]
mov ecx, offset Z
call gcd
call ExitProcess
; Процедура
proc gcd
push edx
; if (x<y) swap(x, y);
cmp eax, ebx
jge short m1
xchg eax, ebx
; if (y==0) return x
m1:
test ebx, ebx
je short break
; while(1)
for:
xor edx, edx
div ebx
test edx, edx
je short break
mov eax, ebx
mov ebx, edx
jmp for
break:
mov [ecx], ebx
pop edx
ret
endp gcd
end begin
Достоинство способа - наиболее быстрый способ. Недостаток - недостаточное число регистров.
Пример 2. Составить процедуру для вычисления длины строки с нулевым завершителем. Пусть адрес начала строки в регистре EBX, а
адрес длины строки возвращается через регистр EAX.
; Процедура для вычисления длины строки с нулевым
; завершителем. Пусть адрес начала строки в регистре
; EBX, а адрес длины строки - через регистр EAX.
ideal
P486
MODEL flat
extrn ExitProcess:proc
DATASEG
str1 db 'Это первая строка', 0
str2 db 'А это вторая', 0
n dd ?, ?
CODESEG
begin:
lea ebx, [str1]
lea eax, [n]
call strlen
lea ebx, [str2]
lea eax, [n+4]
call strlen
call ExitProcess
proc strlen
push ecx edx
xor ecx, ecx
for:
mov dl, [ebx] ; while (str[i])ax++;
and dl, dl
je short lend; конец строки
inc ecx
inc ebx
jmp for
lend:
mov [eax], ecx
pop edx ecx
ret
endp strlen
end begin
Недостатки использования регистров для передачи параметров:
1. Можно использовать только для передачи данных длиной 1, 2, 4 байта или адресов:
2. Количество регистров ограничено.
Для преодоления недостатков можно все параметры записать в структуру и передать адрес начала структуры в единственном регистре или использовать для передачи параметров стек.