Определить среднее арифметическое четных чисел, находящихся после максимального значения массива - Assembler

Узнай цену своей работы

Формулировка задачи:

добрый день, помогите пожалуйста друзья , перевести в ассемблер Определить среднее арифметическое четных чисел находящихся после максимального значения в массиве D[1...N]
const n=10;
var
  d:array[1..n] of real;
  s:real;
  i,j:integer;
begin
  write('Введите ',n,' элементов массива:');
  s:=0.0;
  for i:=1 to n do begin
    read(d[i]);
    if (i=1) or (d[i]>d[j]) then begin s:=0.0;j:=i;end else s:=s+d[i];
  end;
  if i-j=0 then writeln('Максимальный элемент последний!') else
  writeln('<S>=',s/(i-j):0:4);
end.

Решение задачи: «Определить среднее арифметическое четных чисел, находящихся после максимального значения массива»

textual
Листинг программы
ORG 100h
JMP start
 
mass   DB   5,19,200,31,50,64,159,11,7,80
size   =    $ - mass     ; длина массива
max    DW   0            ; буфер максимального
pos    DW   0            ; буфер его позиции в массиве
 
start:
;================ ПОИСК МАКСИМАЛЬНОГО ================//
;================ ..И ЕГО ПОЗИЦИИ В МАССИВЕ ==========//
   MOV   SI,mass         ; адрес массива
   MOV   CX,size         ; его размер
   XOR   AH,AH           ; обнуляем старший байт АХ
@@:                      ;
   LODSB                 ; берём байт с массива
   CMP   AX,[max]        ; сравниваем его с переменной
   JB    next            ; меньше? пропускаем его
   MOV   [max],AX        ; сохраняем текущее число
   MOV   [pos],SI        ;     ..и его позицию в массиве
next:                    ;
   LOOP  @b              ; сл.байт...
 
;================ ПОИСК ЧЁТНЫХ ЧИСЕЛ =================//
;================ ..И ИХ СРЕДНЕ/АРИФМЕТИЧЕСКОГО ======//
   MOV   SI,[pos]        ; SI = адрес сл., после макс.
   MOV   CX,SI           ; расчитаем, сколько эл.осталось
   SUB   CX,mass         ;
   SUB   CX,size         ; получили отрицательное число
   NEG   CX              ; СХ = кол-во оставшихся элементов
   PUSH  0   0   0       ;
   POP   AX  BX  DX      ; очищаем нужные регистры
@@:                      ;
   LODSB                 ; берём байт из SI
   TEST  AL,1            ; число чётное?
   JNZ   miss            ; нет - едем дальше..
   ADD   BX,AX           ; да - суммируем его с BX
   INC   DX              ;    ..и увеличиваем счётчик.
miss:                    ;
   LOOP  @b              ; сл.байт..
 
   PUSH  DX              ; DX = кол-во чётных чисел в массиве
   MOV   AX,BX           ; AX = их сумма
   XOR   DX,DX           ;
   POP   BX              ; разделим сумму на количество
   DIV   BX              ; АХ = средне/арифметическое!
 
exit:                    ;
   XOR   AX,AX           ;
   INT   16h             ;
   INT   20h             ;

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

[Пояснения к коду]

  1. Массив представлен в виде строки DB 5,19,200,31,50,64,159,11,7,80
  2. Переменные max и pos используются для хранения максимального значения и его позиции в массиве.
  3. Код сначала находит максимальное значение в массиве и его позицию с помощью цикла while.
  4. Затем он переходит к поиску четных чисел, которые находятся после максимального значения. Для этого он использует переменные SI и CX.
  5. Переменная CX изначально содержит размер массива, вычитаемый из SI, чтобы получить количество оставшихся элементов.
  6. Код затем проверяет каждый байт в массиве, начиная с SI, чтобы определить, является ли он четным числом.
  7. Если число четное, оно добавляется к BX, а счетчик DX увеличивается на 1.
  8. После прохода по всем элементам массива, DX содержит количество четных чисел, а BX содержит их сумму.
  9. Среднее арифметическое вычисляется путем деления суммы на количество, используя операцию DIV.
  10. Код затем завершается с помощью функции INT 20h.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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