Как найти сумму массива на ассемблере?

не могу правильно написать программу

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
→ Ссылка