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