Подсчитать количество элементов массива, равных трем - 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. — Конец программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д