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



              

Суммирование массива - часть 2


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

Программа переписывается таким образом:

.386 .model flat, stdcall .code

sum: ; Вход в функцию: push EBP ; сохраним старое значение EBP mov EBP, ESP ; определим новое значение EBP push EBX ; сохраним значения регистров EBX, push ECX ; ECX push EDX ; и EDX. ; mov EAX, 0 ; EAX := 0 mov EBX, [EBP+8] ; EAX := a mov ECX, [EBP+12]; ECX := n L1: ; метка начала цикла cmp ECX, 0 ; сравнить ECX с нулем jle L2 ; если результат ‹ = 0, ; то перейти на метку L2 mov EDX, [EBX] ; EDX := очередной эл-т массива add EAX, EDX ; EAX := EAX+EDX add EBX, 4 ; EBX := EBX+4 (адрес след. эл-та) dec ECX ; ECX := ECX-1 (счетчик) jmp L1 ; перейти на метку L1 L2: ; метка конца цикла ; ответ содержится в регистре EAX ; выход из функции: pop EDX ; восстановим значения EDX, pop ECX ; ECX pop EBX ; и EBX. pop EBP ; восстановим значение EBP ret ; вернемся в вызывающую программу

public sum end

Отметим, что мы использовали команду уменьшения значения регистра на единицу dec (от слова decrement) для реализации следующей строки RTL:

R2 := R2 - 1; // уменьшим счетчик необр. эл-тов

В Ассемблере Intel 80386 она записывается как

dec ECX; ECX := ECX-1

Команда увеличения регистра на единицу обычно записывается как inc (от слова increment). Эти команды, как правило, присутствуют в наборе инструкций любого процессора.




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