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