Подсчитать количество элементов массива, равных трем - Assembler

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

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

Помогите, пожалуйста разобраться с задачей по встроенному в TURBO PASCAL ассемблеру, никак не пойму, что не так. Дан массив (последовательность данных, размещённая каким-либо способом в сегменте DS) байтов. Подсчитать количество элементов, а) равных трем, б) кратных трем. Звучит не очень сложно, но я никак не могу понять как ее сделать. Подскажите, как при помощи встроенного ассемблера в TURBO PASCAL ее решить. под буквой "а" у меня получилось вот так:
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.
Может я что-то напутал с загрузкой элемента, или со сравнением, и почему он все-таки на метку @@5 не переходит?Помогите, пожалуйста,кто в ассемблере разбирается.

Решение задачи: «Подсчитать количество элементов массива, равных трем»

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.

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

  1. Const N = 7; — Определяет размер массива
  2. Massiv : Array[1..n] of Integer = (1, 3, 3, 4, 5, 3, 7); — Создает массив с семью элементами, включая числа 1, 3, 3, 4, 5, 3, 7
  3. Function Max(var Mas; N : Integer) : Integer; — Определяет функцию с именем Max для поиска максимального значения в массиве
  4. Begin — Начало функции
  5. Asm — Код функции написан на ассемблере
  6. lds si, Mas — Загрузка указателя на массив в регистр SI
  7. mov cx, N — Загрузка размера массива в регистр CX
  8. xor dx, dx — Начальное значение регистра DX равно 0
  9. jcxz @@@ — Если размер массива не равен нулю, то перейти к блоку с меткой @@
  10. cld — Указатель на массив увеличивается на 2 при каждом вызове функции
  11. lodsw — Загрузка двух байт из массива в регистры AX и DX (при этом AX содержит старший байт, а DX — младший)
  12. cmp ax, 3 — Сравнение старшего байта регистра AX со значением 3
  13. jne @@ — Если старший байт не равен 3, то перейти к следующему элементу массива
  14. inc dx — Увеличение значения регистра DX на 1 при каждом вызове функции
  15. loop @@ — Пока размер массива больше нуля, повторять предыдущий блок
  16. mov @Result,dx — Сохранение значения регистра DX в переменную, на которую указывает метка @Result
  17. End; — Конец функции
  18. Begin — Начало основной программы
  19. WriteLn('Kolvo elementov = 3 : ' , Max(Massiv, N)) — Вывод на экран количества элементов массива, равных 3
  20. End. — Конец программы

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


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

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

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