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