Подсчитать количество элементов массива, равных трем - Assembler
Формулировка задачи:
Помогите, пожалуйста разобраться с задачей по встроенному в TURBO PASCAL ассемблеру, никак не пойму, что не так. Дан массив (последовательность данных, размещённая каким-либо способом в сегменте DS) байтов. Подсчитать количество элементов, а) равных трем, б) кратных трем. Звучит не очень сложно, но я никак не могу понять как ее сделать. Подскажите, как при помощи встроенного ассемблера в TURBO PASCAL ее решить.
под буквой "а" у меня получилось вот так:
Может я что-то напутал с загрузкой элемента, или со сравнением, и почему он все-таки на метку @@5 не переходит?Помогите, пожалуйста,кто в ассемблере разбирается.
const
N = 7;
Massiv : array[1..n] of Integer = (1, 3, 3, 4, 5, 3, 7);
function Max (var Mas; N : Integer) : Integer;
var z: integer;
begin
z:=0;
asm
LDS SI, Mas {адрес массива}
MOV dx,0
MOV AX, 3
MOV BX,8001h {минимальное целое число}
MOV CX,N {кол-во элементов}
CMP CX,0 {сравниваем c 0}
je @@3 {==0 - выходим}
{jne @@1} {<>0 - идем дальше}
@@1: LODSW {загрузка элемента массива}
CMP bx,3
jne @@2 {<>}
je @@5 {==}
@@5: inc z {никак не могу перейти на эту метку (даже если убрать знак метки, оставив обычным действием - неработает), в ответе печатает то число, которое занесено в z изначально}
{MOV bx,z}
@@2: LOOP @@1
@@3: {xor dx,dx}
mov dx,z
MOV @Result,dx
end
end;
begin
WriteLn (' kolvo- elementov =3 : ' , Max(Massiv, N));
ReadLn
end.Решение задачи: «Подсчитать количество элементов массива, равных трем»
textual
Листинг программы
Const N = 7;
Massiv : Array[1..n] of Integer = (1, 3, 3, 4, 5, 3, 7);
Function Max(var Mas; N : Integer) : Integer;
Begin
Asm
lds si, Mas
mov cx, N
xor dx, dx
jcxz @@@
cld
@: lodsw
cmp ax, 3
jne @@
inc dx
@@: loop @
@@@: mov @Result,dx
End
End;
Begin
WriteLn('Kolvo elementov = 3 : ' , Max(Massiv, N))
End.
Объяснение кода листинга программы
- Const N = 7; — Определяет размер массива
- Massiv : Array[1..n] of Integer = (1, 3, 3, 4, 5, 3, 7); — Создает массив с семью элементами, включая числа 1, 3, 3, 4, 5, 3, 7
- Function Max(var Mas; N : Integer) : Integer; — Определяет функцию с именем Max для поиска максимального значения в массиве
- Begin — Начало функции
- Asm — Код функции написан на ассемблере
- lds si, Mas — Загрузка указателя на массив в регистр SI
- mov cx, N — Загрузка размера массива в регистр CX
- xor dx, dx — Начальное значение регистра DX равно 0
- jcxz @@@ — Если размер массива не равен нулю, то перейти к блоку с меткой @@
- cld — Указатель на массив увеличивается на 2 при каждом вызове функции
- lodsw — Загрузка двух байт из массива в регистры AX и DX (при этом AX содержит старший байт, а DX — младший)
- cmp ax, 3 — Сравнение старшего байта регистра AX со значением 3
- jne @@ — Если старший байт не равен 3, то перейти к следующему элементу массива
- inc dx — Увеличение значения регистра DX на 1 при каждом вызове функции
- loop @@ — Пока размер массива больше нуля, повторять предыдущий блок
- mov @Result,dx — Сохранение значения регистра DX в переменную, на которую указывает метка @Result
- End; — Конец функции
- Begin — Начало основной программы
- WriteLn('Kolvo elementov = 3 : ' , Max(Massiv, N)) — Вывод на экран количества элементов массива, равных 3
- End. — Конец программы