Найти количество отрицательных элементов массива - Assembler (225976)
Формулировка задачи:
найти кол-во отрицательных элементов массива. Нужно доделать...
procedure TForm5.Button1Click(Sender: TObject);
var i, a, b:integer;
begin
randomize;
for i := 0 to 9 do
begin
a:=random(2);
if a=0 then b:=-1 else b:=1 ;
StringGrid1.Cells [i,0]:=inttostr(b*random(10));
end;
end;
procedure TForm5.Button2Click(Sender: TObject);
var mas:array[0..9] of integer;
i,rez,min,a:integer;
begin
for i:=0 to 9 do
mas:=strtoint(stringgrid1.cells[i,0]);
asm
// Сумма элементов массива
Lea ESI, mas // Взятие адреса массива
xor eax, eax
xor edx, edx
Mov ecx, 0Ah // Заносим число элементов
@1: add eax, [esi][edx*4]
inc edx
loop @1 // ECX=ECX-1, и если ECX не равен нулю, то переход по метке
mov rez, eax
//Кол-во отрицательных элементов массива
............................................
// Вывод результатов
memo1.Lines.add('Сумма элементов массива: '+ inttostr(rez));
memo1.Lines.add('Кол-во отрицательных элементов массива: '+inttostr(min));
end;
end.Решение задачи: «Найти количество отрицательных элементов массива»
textual
Листинг программы
// Сумма элементов и количество отрицательных Lea ESI, mas // Взятие адреса массива xor eax, eax xor edx, edx xor ebx, ebx Mov ecx, 0Ah // Заносим число элементов @1: add eax, [esi][edx*4] cmp dword ptr [esi][edx*4],0 jge @2 inc ebx @2: inc edx loop @1 // ECX=ECX-1, и если ECX не равен нулю, то переход по метке mov rez, eax mov numneg, ebx // переменная numneg будет содержать число отрицательных
Объяснение кода листинга программы
- Lea ESI, mas — в данном коде это означает, что мы берем адрес нашего массива и сохраняем его в регистре ESI.
- xor eax, eax — это означает, что мы обнуляем значение регистра EAX, который будет использоваться как счетчик для прохождения по массиву.
- xor edx, edx — это означает, что мы обнуляем значение регистра EDX, который также будет использоваться для прохождения по массиву, но уже с использованием шага в 4 байта.
- xor ebx, ebx — это означает, что мы обнуляем значение регистра EBX, который будет использоваться для подсчета количества отрицательных чисел.
- Mov ecx, 0Ah — это означает, что мы устанавливаем значение регистра ECX равным 10 (0Ah в шестнадцатеричной системе), так как у нас массив из 10 элементов.
- *add eax, [esi][edx4]** — это означает, что мы прибавляем к текущему значению EAX значение элемента массива, адрес которого находится в ESI, и смещение от этого адреса, равное произведению EDX на 4 (так как у нас 4 байта на элемент).
- *cmp dword ptr [esi][edx4],0** — это означает, что мы сравниваем значение элемента массива, адрес которого находится в ESI, и смещение от этого адреса, равное произведению EDX на 4, с нулем.
- jge @2 — это означает, что если значение элемента массива больше или равно нулю, то мы переходим к метке @2.
- inc ebx — это означает, что если значение элемента массива меньше нуля, то мы увеличиваем значение EBX на единицу, что означает увеличение количества отрицательных чисел.
- inc edx — это означает, что мы увеличиваем значение EDX на единицу, что означает переход к следующему элементу массива.
- loop @1 — это означает, что мы выполняем цикл, пока значение регистра ECX больше нуля. Если ECX равен нулю, то мы выходим из цикла.
- mov rez, eax — это означает, что мы сохраняем значение EAX в переменную rez, которая, вероятно, используется для хранения результата вычислений.
- mov numneg, ebx — это означает, что мы сохраняем значение EBX в переменную numneg, которая, вероятно, используется для хранения количества отрицательных чисел. Таким образом, в этом коде выполняется подсчет количества отрицательных чисел в массиве.