Посчитать количество байт в массиве - Assembler

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

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

Дан массив из 6 байт. Посчитать количество байт, число единиц в которых не превышает 3.

Решение задачи: «Посчитать количество байт в массиве»

textual
Листинг программы
  1. .model small
  2. .stack 100h
  3. .data
  4. a db 1,2,3,15,15,14
  5. len dw $-a
  6. .code
  7. begin:
  8. mov     ax,     @data
  9. mov     ds,     ax
  10. mov     es,     ax  
  11.  
  12. mov     cx,     len     ; помещаем в СХ длину массива  
  13. lea     si,     a       ; в SI адрес массива
  14. xor     bx,     bx      ; BX - счётчик байтов, где не более 3 единиц
  15. c1:    
  16. mov     al,     a[si]   ; загружаем в AL очередной элемент массива
  17. xor     dx,     dx      ; DX = 0, счётчик единиц в байте
  18. c2:    
  19. test    al,     al      ; сравниваем с нулём. test - побитовое & без сохранения результата. Команда воздействует на флаги
  20. je      skp1            ; Если = 0 -> goto skp1 (выходим из цикла, т.к. сдвигать больше нечего)
  21. shr     al,     1       ; если != 0, сдвигаем вправо на 1 разряд. Ушедший разряд попадает в CF (Carry Flag)
  22. adc     dx,     0       ; DX = DX + 0 + CF
  23. jmp     c2              ; Возвращаемся к С2
  24. skp1:            
  25. cmp     dx,     3       ; сравниваем DX с 3
  26. jg      skp2            ; если DX > 3 - goto skp2
  27. inc     bx              ; Увеличиваем bx на 1
  28. skp2:
  29. inc     si              ; увеличиваем индекс на 1
  30. loop    c1
  31.  
  32. mov     dx,     bx      ; выводим результат
  33. add     dx,     '0'
  34. mov     ah,     2
  35. int     21h      
  36.  
  37. mov     ah,     4ch
  38. int     21h
  39. end begin

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

  1. Объявление модели и размера стека
    • .model small
    • .stack 100h
  2. Объявление переменных
    • a db 1,2,3,15,15,14 (массив a)
    • len dw $-a (переменная len, содержащая длину массива a)
  3. Начало сегмента кода
    • begin:
  4. Установка указателей на сегмент данных и сегмент кода
    • mov ax, @data
    • mov ds, ax
    • mov es, ax
  5. Инициализация регистров cx и si для цикла перебора массива
    • mov cx, len
    • lea si, a
  6. Инициализация регистров bx и dx для подсчета байтов
    • xor bx, bx
    • xor dx, dx
  7. Цикл перебора массива
    • c1:
  8. Загрузка значения текущего элемента массива в регистр al
    • mov al, a[si]
  9. Цикл проверки битов в байте
    • c2:
  10. Проверка бита в регистре al
    • test al, al
  11. Если бит равен 0, переход к метке skp1
    • je skp1
  12. Сдвигаем бит вправо на 1 разряд
    • shr al, 1
  13. Прибавляем значение CF к регистру dx
    • adc dx, 0
  14. Переход к метке c2
    • jmp c2
  15. Метка skp1 в случае, если бит равен 0
    • skp1:
  16. Сравнение значения dx с 3
    • cmp dx, 3
  17. Если dx больше 3, переход к метке skp2
    • jg skp2
  18. Увеличение значения bx на 1
    • inc bx
  19. Метка skp2
    • skp2:
  20. Увеличение индекса массива на 1
    • inc si
  21. Проверка завершения цикла
    • loop c1
  22. Вывод результата
    • mov dx, bx
    • add dx, '0'
    • mov ah, 2
    • int 21h
  23. Завершение программы
    • mov ah, 4ch
    • int 21h
  24. Конец сегмента кода
    • end begin

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


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

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

8   голосов , оценка 4.25 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы