Основы программирования



              

Вычисление наибольшего общего делителя - часть 2


В частности, команда деления всегда использует в качестве делимого длинное восьмибайтовое целое число, содержащееся в паре регистров (EDX, EAX), где старшие байты в регистре EDX. В результате выполнения команды деления вычисляется как частное, так и остаток от деления: частное помещается в регистр EAX, остаток — в регистр EDX.

В данной программе на языке RTL остаток от деления помещается в регистр R2. Поэтому регистр R2 удобно отобразить на регистр EDX, это позволит избежать лишних пересылок результата из одного регистра в другой. Итак, зафиксируем следующее распределение регистров:

R0 — EAX R1 — EBX R2 — EDX FP — EBP SP — ESP

После того как распределены регистры, остается только переписать каждую строку RTL программы на конкретный Ассемблер. Для этого необходимо знать ограниченный набор команд, реализующих операции языка RTL в конкретном Ассемблере. Например, в нашем случае операция пересылки из одного регистра в другой или из памяти в регистр реализуется командой mov, операция деления реализуется командой div и т.д. Программа на языке Ассемблера Intel 80386 записывается следующим образом:

.386 .model flat, stdcall .code

gcd: ; Вход в функцию: push EBP ; сохраним старое значение EBP mov EBP, ESP ; определим новое значение EBP push EBX ; сохраним значения EBX push EDX ; и EDX. ; mov EAX, [EBP+8] ; EAX := x mov EBX, [EBP+12] ; EBX := y L1: ; метка начала цикла cmp EBX, 0 ; сравнить EBX с нулем je L2 ; если результат равен нулю, ; то перейти на метку L2 mov EDX, 0 ; div EBX ; EDX := EAX % EBX mov EAX, EBX ; EAX := EBX mov EBX, EDX ; EBX := EDX jmp L1 ; перейти на метку L1 L2: ; метка конца цикла ; ответ уже содержится в EAX ; выход из функции: pop EDX ; восстановим значения EDX pop EBX ; и EBX pop EBP ; восстановим значение EBP ret ; возврат из функции

public gcd end




Содержание  Назад  Вперед