Подсчитать количество единичных битов в массиве чисел (для Х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
Объяснение кода листинга программы
lodsd— загрузка однобайтового числа из памяти в регистр EAX.mov ebx,eax— перенос значения из регистра EAX в регистр EBX.shr ebx,1— сдвиг значения в регистре EBX вправо на один бит и помещение результата в тот же регистр.and ebx,77777777h— помещение в регистр EBX количества единичных битов, сдвинутых на два разряда влево.sub eax,ebx— вычитание из значения в регистре EAX значения из регистра EBX.shr ebx,1— сдвиг значения в регистре EBX вправо на один бит и помещение результата в тот же регистр.and ebx,77777777h— помещение в регистр EBX количества единичных битов, сдвинутых на два разряда влево.sub eax,ebx— вычитание из значения в регистре EAX значения из регистра EBX.shr ebx,1— сдвиг значения в регистре EBX вправо на один бит и помещение результата в тот же регистр.and ebx,77777777h— помещение в регистр EBX количества единичных битов, сдвинутых на два разряда влево.sub eax,ebx— вычитание из значения в регистре EAX значения из регистра EBX.mov ebx,eax— перенос значения из регистра EAX в регистр EBX.shr ebx,4— сдвиг значения в регистре EBX вправо на четыре разряда и помещение результата в тот же регистр.add eax,ebx— сложение значения в регистре EAX с значением из регистра EBX.and eax,0F0F0F0Fh— помещение в регистр EAX суммы байтов, полученной после вычисления суммы четырех младших байтов.imul eax,1010101h— умножение значения в регистре EAX на 0x1010101.shr eax,24— сдвиг значения в регистре EAX вправо на 24 разряда и помещение результата в тот же регистр.add count,eax— сложение значения в регистре EAX с переменной count.