Нужно доработать код - Assembler
Формулировка задачи:
Дан массив из 10 байт. Посчитать количество байт, число единиц в которых не превышает 6.
Программа считает байты только с 6 единицами - не знаю как сделать, чтоб считал все байты с количеством единиц до 6.
data segment kol db ? mass db 10111101b, 01110111b, 01111111b, 11111111b, 00000000b, 10000000b, 00010011b, 00111100b, 10010010b; data ends code segment assume cs: code, ds:data start: mov ax,data; mov ds,ax; загрузить сегментный адрес данных mov cx, 10; число повторений lea bx,mass; загрузить адрес смещения массива xor dx,dx; обнуление dx deg: push cx; сохранение cx mov al,[bx]; первый элемент массива помещаем в al mov cl,8; число повторений beg: test al,bl; начало метки beg, перемещение первого элемента jz nol; если 0 inc kol; следующий элемент nol: shr al,1; сдвиг регистра loop beg; возвращение к beg cmp kol,6; сравнение jnz bolshe; если нет 0 inc dx; добавление в регистров dx 1 bolshe: mov kol,0; перемещение 0 в kol inc bx; следующий элемент pop cx; обнуление cx loop deg; возвращение к begin и вычитание единицы с счетчика mov ax,4c00h; завершение программы int 21h; номер функции прерывания code ends; end start; конец
Решение задачи: «Нужно доработать код»
textual
Листинг программы
.data kol db 0 mass db 76,20,1,250,74,19,93,17,8,11,57,3,6,56,40,32 len = $ - mass .code start: mov si,mass ; адрес массива mov bx,len ; ..его длина cycle: xor ax,ax ; AH будет счётчиком единиц mov cx,8 ; всего бит в байте lodsb ; берём очередной элемент find: shr al,1 ; выталкиваем с него бит jnc next ; прыг, если флаг CF=0 inc ah ; считаем биты next: loop find ; сл.бит.. cmp ah,6 ; проверяем счётчик ja fuck ; прыг, если больше inc [kol] ; иначе: количество +1 fuck: dec bx ; весь массив проверили? jnz cycle ; mov al,[kol] ; AL = счётчик aam ; or ax,3030h ; переводим его в символы xchg ah,al ; int 29h ; xchg ah,al ; int 29h ; выводим не экран
Объяснение кода листинга программы
Список элементов, которые встречаются в коде:
- Переменная «kol» типа db (длина 1 байт).
- Переменная «mass» типа db (длина 76 байт).
- Переменная «len» (длиной 2 байта) вычисляется как смещение от начала сегмента данных до начала переменной «mass».
- Сегмент данных (обычно это сегмент code).
- Переменная «si» (индекс источника).
- Переменная «bx» (индекс байта).
- Переменная «ax» (содержит два 8-битных значения: ah и al).
- Переменная «cx» (индекс счётчика).
- Переменная «al» (содержит 8-битное значение).
- Переменная «ah» (содержит 8-битное значение).
- Команда lodsb (загрузка байта).
- Команда shr (побитовое исключающее ИЛИ).
- Флаг CF (Carry Flag).
- Команда inc (увеличить значение на 1).
- Команда loop (повторение цикла).
- Команда cmp (сравнение).
- Команда ja (переход, если больше).
- Команда inc (увеличить значение на 1).
- Команда dec (уменьшить значение на 1).
- Команда jnz (переход, если значение не равно нулю).
- Команда mov (перемещение).
- Команда aam (декодирование смещения в секции).
- Команда or (побитовое ИЛИ).
- Команда xchg (обмен).
- Команда int (ввод/вывод).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д