Найти количество отрицательных элементов массива - 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 будет содержать число отрицательных

Объяснение кода листинга программы

  1. Lea ESI, mas — в данном коде это означает, что мы берем адрес нашего массива и сохраняем его в регистре ESI.
  2. xor eax, eax — это означает, что мы обнуляем значение регистра EAX, который будет использоваться как счетчик для прохождения по массиву.
  3. xor edx, edx — это означает, что мы обнуляем значение регистра EDX, который также будет использоваться для прохождения по массиву, но уже с использованием шага в 4 байта.
  4. xor ebx, ebx — это означает, что мы обнуляем значение регистра EBX, который будет использоваться для подсчета количества отрицательных чисел.
  5. Mov ecx, 0Ah — это означает, что мы устанавливаем значение регистра ECX равным 10 (0Ah в шестнадцатеричной системе), так как у нас массив из 10 элементов.
  6. *add eax, [esi][edx4]** — это означает, что мы прибавляем к текущему значению EAX значение элемента массива, адрес которого находится в ESI, и смещение от этого адреса, равное произведению EDX на 4 (так как у нас 4 байта на элемент).
  7. *cmp dword ptr [esi][edx4],0** — это означает, что мы сравниваем значение элемента массива, адрес которого находится в ESI, и смещение от этого адреса, равное произведению EDX на 4, с нулем.
  8. jge @2 — это означает, что если значение элемента массива больше или равно нулю, то мы переходим к метке @2.
  9. inc ebx — это означает, что если значение элемента массива меньше нуля, то мы увеличиваем значение EBX на единицу, что означает увеличение количества отрицательных чисел.
  10. inc edx — это означает, что мы увеличиваем значение EDX на единицу, что означает переход к следующему элементу массива.
  11. loop @1 — это означает, что мы выполняем цикл, пока значение регистра ECX больше нуля. Если ECX равен нулю, то мы выходим из цикла.
  12. mov rez, eax — это означает, что мы сохраняем значение EAX в переменную rez, которая, вероятно, используется для хранения результата вычислений.
  13. mov numneg, ebx — это означает, что мы сохраняем значение EBX в переменную numneg, которая, вероятно, используется для хранения количества отрицательных чисел. Таким образом, в этом коде выполняется подсчет количества отрицательных чисел в массиве.

ИИ для рефератов и докладов


  • Экспорт Word по ГОСТу
  • Минимум 80% уникальности текста
  • Поиск релевантных источников в интернете
  • Готовый документ за 2 минуты

Оцени полезность:

11   голосов , оценка 4 из 5
Похожие ответы