Сколько раз в массиве повторяется максимальный элемент - Assembler
Формулировка задачи:
Здравствуйте, не могли бы помочь с программой, не идет и все..
Program abczdarova
Uses crt;
Const N=10
Var A:array[1..N] of integer;
i:1..N;
Begin
Randomize;
For i:1 to N do
Begin
A[i]:=random(10);
Writeln(A[i]:4);
Write('Massiv A:');
Write(A[i]);
End;
Asm
LEA SI, A
Mov AX, [SI]
Mov DX, 1
Mov CX, N
Mov BX, 0
@1: CMP AX, [SI+DX]
JLE @2
Mov AX, [SI+DX]
Mov BX, 0
Inc DX
Loop @1
@2: inc DX
Inc BX
CMP AX, [SI+BX]
JLE @2
Mov AX, [SI+DX]
Mov BX, 0
JMP @1
End;
For i:=1 to N do
Writeln('макс элемент' AX 'встречается ' BX 'раз');
Readln;
end.
а как исправить?
Решение задачи: «Сколько раз в массиве повторяется максимальный элемент»
textual
Листинг программы
program abczdarova;
uses
crt;
const
N = 10;
var
A: array[1..N] of integer;
i: 1..N;
Count, Max: integer;
begin
Randomize;
for i := 1 to N do
begin
A[i] := random(10);
Writeln(A[i]: 4);
Write('Massiv A:');
Write(A[i]);
end;
writeln;
asm
LEA SI, A
MOV AX, [SI]
MOV DX, 1
MOV CX, N
DEC CX
ADD SI, 2
@1:
CMP AX, [SI]
JNE @2
INC DX
JMP @3
@2:
JG @3
MOV AX, [SI]
MOV DX, 1
@3:
ADD SI, 2
LOOP @1
MOV Count,DX
MOV Max, AX
end;
Writeln('макс элемент ', Max, ' встречается ', Count, ' раз');
Readln;
end.
Объяснение кода листинга программы
- Объявляется переменная
Nи инициализируется значением 10. - Объявляется массив
Aтипа integer со значениями от 1 до N. - Объявляется переменная
iтипа 1..N для использования в цикле. - Объявляются переменные
CountиMaxтипа integer для хранения количества повторений максимального элемента и его значения. - Производится инициализация генератора случайных чисел.
- В цикле от 1 до N для каждого элемента массива:
- Генерируется случайное значение и помещается в массив A[i].
- Значение A[i] выводится на экран.
- Используется ассемблерный блок:
- При помощи инструкции LEA адрес массива A помещается в SI.
- AX инициализируется значением первого элемента массива.
- Устанавливается начальное значение счетчика повторений DX в 1.
- CX устанавливается в N, количество элементов массива.
- В цикле происходит сравнение текущего значения с максимальным элементом и увеличивается счетчик DX при равенстве.
- При нахождении большего элемента, AX инициализируется этим значением и счетчик DX устанавливается в 1.
- Происходит увеличение адреса массива SI и проверка на конец цикла.
- Данные из ассемблерного блока копируются в переменные Count и Max.
- Выводится на экран число
Max(максимальный элемент массива) и количество его повторенийCount. P.S. Код написан на Pascal с использованием вставок на ассемблере.