Нужно доработать код - 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              ; выводим не экран

Объяснение кода листинга программы

Список элементов, которые встречаются в коде:

  1. Переменная «kol» типа db (длина 1 байт).
  2. Переменная «mass» типа db (длина 76 байт).
  3. Переменная «len» (длиной 2 байта) вычисляется как смещение от начала сегмента данных до начала переменной «mass».
  4. Сегмент данных (обычно это сегмент code).
  5. Переменная «si» (индекс источника).
  6. Переменная «bx» (индекс байта).
  7. Переменная «ax» (содержит два 8-битных значения: ah и al).
  8. Переменная «cx» (индекс счётчика).
  9. Переменная «al» (содержит 8-битное значение).
  10. Переменная «ah» (содержит 8-битное значение).
  11. Команда lodsb (загрузка байта).
  12. Команда shr (побитовое исключающее ИЛИ).
  13. Флаг CF (Carry Flag).
  14. Команда inc (увеличить значение на 1).
  15. Команда loop (повторение цикла).
  16. Команда cmp (сравнение).
  17. Команда ja (переход, если больше).
  18. Команда inc (увеличить значение на 1).
  19. Команда dec (уменьшить значение на 1).
  20. Команда jnz (переход, если значение не равно нулю).
  21. Команда mov (перемещение).
  22. Команда aam (декодирование смещения в секции).
  23. Команда or (побитовое ИЛИ).
  24. Команда xchg (обмен).
  25. Команда int (ввод/вывод).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5