Как найти сумму массива на ассемблере?
не могу правильно написать программу
var
i:integer;
x:array[1..10] of integer;
begin
for i:=1 to 10 do
begin
x[i]:=trunc(201*random-100);
end;
for i:=1 to 10 do
begin
write(' ', x[i]);
write;
end;
asm
mov bx, offset x
mov ax, [bx]
@1
add bx, ax
loop @1
mov ax, bx
mov sum, ax
end;
end.
Ответы (1 шт):
Автор решения: MBo
→ Ссылка
Перед loop (точнее, перед меткой начала) нужно поместить в cx количество шагов
Если в bx поместили адрес массива, то с помощью [bx] получают данные по текущему адресу. Отмечу, что регистр bx использован зря, можно обойтись dx. (иначе bx нужно сохранять и восстанавливать)
На каждом шаге bx нужно увеличивать на 2
Как инициализировать регистр для суммирования и проводить в нем суммирование на каждом шаге цикла - должно быть очевидной из обычной программистской логики.
Проверил в Delphi с edx вместо dx (поскольку 32-разрядная система)
asm
mov dx, offset x
xor ax, ax
mov cx, 10
@@1:
add ax, [dx]
add dx, 2
loop @@1
mov sum, ax
end
Ещё вариант (не проверял)
asm
lds si, x {адрес массива}
xor dx, dx
mov cx, 10
@@1:
lodsw {загрузить слово в ax из [si]}
add dx, ax
loop @@1
mov sum, dx
end