Программирование на Ассемблере

       

Передача параметров через регистры


Для задания параметров или их адресов используются регистры.

Пример 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. Количество регистров ограничено.

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



Содержание раздела