Количество элементов в массиве до первого нулевого элемента (Ассемблерная вставка в коде pascal) - Assembler
Формулировка задачи:
Задание такое: Написать программу, вычисляющую количество элементов в массиве до
первого нулевого элемента, в случае если нулевого элемента нет, должно
возвращаться количество элементов в массиве.
И вот именно обработку нужно сделать на ассемблере. Ниже я прикрепляю код программы, которая получилась, но где-то в ассемблерной вставке ошибка, вылетает за границы массива программка. Поможете исправить?
var
a:array [1..10]of integer;
i,k:integer;
label m,n;
begin
randomize;
for i:=1 to 10 do
begin
a[i]:=random(10);
write(a[i],' ');
end;
k:=0;
for i:=1 to 10 do
begin
asm
mov ax,k
lea ebx,a
m: mov cx,[ebx+i]
cmp cx,0
jz n
inc k
inc i
loop m
jmp m
n:hlt
end
end;
writeln(' ');
write(k);
readln;
end.Решение задачи: «Количество элементов в массиве до первого нулевого элемента (Ассемблерная вставка в коде pascal)»
textual
Листинг программы
{$asmmode Intel}
type
integer=smallint;
var
a:array [1..10]of integer;
i,k:integer;
label m,n;
begin
randomize;
for i:=1 to 10 do
begin
a[i]:=random(10);
write(a[i],' ');
end;
k:=0;
asm
pushad
lea ebx,a
mov esi, 0
mov ecx, sizeof(a)/2
m:
mov ax,[ebx+esi*2]
cmp word ptr [ebx+esi*2],0
jz n
inc k
add si,1
loop m
n:
popad
end;
writeln;
writeln(k);
//readln;
end.
Объяснение кода листинга программы
Код выполняет следующие действия:
- Инициализирует переменную
iзначением 1, перебирает массивaдо элемента с индексом 10. - Заполняет массив
aслучайными значениями от 0 до 9. - Выводит содержимое массива
aна экран. - Инициализирует переменную
kзначением 0, которая будет использоваться для подсчета количества элементов массива до первого нулевого элемента. - Переходит к ассемблерному блоку кода, который выполняет следующие действия:
- Инициализирует регистр
esiзначением 0, который используется в качестве индекса для массиваa. - Выполняет цикл, который перебирает элементы массива
aдо тех пор, пока не будет найден нулевой элемент. - Если текущий элемент массива равен нулю, то увеличивается значение переменной
kи индексesiувеличивается на 1. - После завершения цикла, значение переменной
kбудет содержать количество элементов массива до первого нулевого элемента. - В конце программы выводится значение переменной
kна экран.