Количество элементов в массиве до первого нулевого элемента (Ассемблерная вставка в коде 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
на экран.