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

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

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

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

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

textual
Листинг программы
.model small
.stack 100h
.data
a db 1,2,3,15,15,14
len dw $-a
.code
begin:
mov     ax,     @data
mov     ds,     ax
mov     es,     ax  
 
mov     cx,     len     ; помещаем в СХ длину массива  
lea     si,     a       ; в SI адрес массива
xor     bx,     bx      ; BX - счётчик байтов, где не более 3-х единиц
c1:     
mov     al,     a[si]   ; загружаем в AL очередной элемент массива
xor     dx,     dx      ; DX = 0, счётчик единиц в байте
c2:     
test    al,     al      ; сравниваем с нулём. test - побитовое & без сохранения результата. Команда воздействует на флаги
je      skp1            ; Если = 0 -> goto skp1 (выходим из цикла, т.к. сдвигать больше нечего)
shr     al,     1       ; если != 0, сдвигаем вправо на 1 разряд. Ушедший разряд попадает в CF (Carry Flag)
adc     dx,     0       ; DX = DX + 0 + CF 
jmp     c2              ; Возвращаемся к С2
skp1:            
cmp     dx,     3       ; сравниваем DX с 3
jg      skp2            ; если DX > 3 - goto skp2 
inc     bx              ; Увеличиваем bx на 1
skp2:
inc     si              ; увеличиваем индекс на 1
loop    c1
 
mov     dx,     bx      ; выводим результат
add     dx,     '0'
mov     ah,     2
int     21h       
 
mov     ah,     4ch
int     21h
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
Похожие ответы