Подсчитать количество единичных битов в массиве чисел (для Х86) - Assembler

Узнай цену своей работы

Формулировка задачи:

Добрый! Очень тяжело освоить ассемблер, но сдавать как-то нужно. Если арифметическими опреациями разобралась, то эта задача поставила в тупик. Помогите, пожалуйста кто понимает (пишу в С++ с ассемблерной вставкой). Задача. Задан массив из 10 произвольных чисел (десятичных) Найти количество единичных битов в этом массиве чисел. Спасибо. Буду благодарна и за советы и за помощь.

Решение задачи: «Подсчитать количество единичных битов в массиве чисел (для Х86)»

textual
Листинг программы
        lodsd
    mov ebx,eax
    shr ebx,1
    and ebx,77777777h;n=(х >> 1) & 0x77777777 Подсчет битов
    sub eax,ebx      ;x=x-n                   в 4-х битовых
        shr ebx,1          ;                       полях
    and ebx,77777777h;n=(n >> 1) & 0x77777777
    sub eax,ebx      ;x=x-n
        shr ebx,1
    and ebx,77777777h;n=(n >> 1) & 0x77777777
    sub eax,ebx      ;x=x-n
    mov ebx,eax
    shr ebx,4
    add eax,ebx
    and eax,0F0F0F0Fh;x=(x+(x >> 4))& 0xF0F0F0F вычисление сумм
    imul eax,1010101h;x=x * 0x1010101           сложение байтов
    shr eax,24
        add count,eax

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

  1. lodsd — загрузка однобайтового числа из памяти в регистр EAX.
  2. mov ebx,eax — перенос значения из регистра EAX в регистр EBX.
  3. shr ebx,1 — сдвиг значения в регистре EBX вправо на один бит и помещение результата в тот же регистр.
  4. and ebx,77777777h — помещение в регистр EBX количества единичных битов, сдвинутых на два разряда влево.
  5. sub eax,ebx — вычитание из значения в регистре EAX значения из регистра EBX.
  6. shr ebx,1 — сдвиг значения в регистре EBX вправо на один бит и помещение результата в тот же регистр.
  7. and ebx,77777777h — помещение в регистр EBX количества единичных битов, сдвинутых на два разряда влево.
  8. sub eax,ebx — вычитание из значения в регистре EAX значения из регистра EBX.
  9. shr ebx,1 — сдвиг значения в регистре EBX вправо на один бит и помещение результата в тот же регистр.
  10. and ebx,77777777h — помещение в регистр EBX количества единичных битов, сдвинутых на два разряда влево.
  11. sub eax,ebx — вычитание из значения в регистре EAX значения из регистра EBX.
  12. mov ebx,eax — перенос значения из регистра EAX в регистр EBX.
  13. shr ebx,4 — сдвиг значения в регистре EBX вправо на четыре разряда и помещение результата в тот же регистр.
  14. add eax,ebx — сложение значения в регистре EAX с значением из регистра EBX.
  15. and eax,0F0F0F0Fh — помещение в регистр EAX суммы байтов, полученной после вычисления суммы четырех младших байтов.
  16. imul eax,1010101h — умножение значения в регистре EAX на 0x1010101.
  17. shr eax,24 — сдвиг значения в регистре EAX вправо на 24 разряда и помещение результата в тот же регистр.
  18. add count,eax — сложение значения в регистре EAX с переменной count.

ИИ для рефератов и докладов


  • Экспорт Word по ГОСТу
  • Минимум 80% уникальности текста
  • Поиск релевантных источников в интернете
  • Готовый документ за 2 минуты

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

12   голосов , оценка 4.083 из 5
Похожие ответы