.data
...
szformat1 db "Число: %X",13,"Кол-во 0: %u",13,"Кол-во 1: %u",0
result db 20 dup(0)
title db "Результат:",0
.code
...
invoke wsprintf,result,szformat1,eax,count0,count1
invoke MessageBox,0,result,title,MB_OK
include 'encoding\win1251.inc'
calcBitsLoop:
shr al,1 ;младший бит в С
jc add_1 ;бит = 1?
add_0:
inc dl ;считаем 0
jmp calcNext
add_1:
inc dh ;считаем 1
calcNext:
dec bl ;по всем битам hex-цифры
jnz calcBitsLoop
calcBitsLoop:
shr al,1
;
adc edi,0;счетчик единиц
inc esi;общий счетчик бит
;
dec bl
jnz calcBitsLoop
mov ecx,eax ;длина строки
lea esi,[hex] ;адрес строки
xor ebx,ebx ;счетчик единиц
xor edx,edx ;счетчик нулей
lea edi,[bin] ;адрес строки, где сформируем строку бит
calcLoop:
lodsb ;очередной символ
;проверим на допустимость
cmp al,'0'
jb PrintError ;меньше '0' - ошибка
cmp al,'9'
jbe calcHex ;цифра - в работу
or al,20h ;букву сделаем маленькой
sub al,'a'-10 ;'a'-'f' -> 0ah-0fh
jl PrintError ;'9'< al < 'a' - ошибка
cmp al,0fh
ja PrintError ;> 'f' - ошибка
calcHex:
mov ah,4 ;число бит
;Чтобы одновременно сформировать и строку бит, сдвинем влево на 4 бита
shl al,4 ;будем идти от старшего к младшему
calcBitsLoop:
shl al,1 ;старший бит в С
;сформируем символ-бит
push eax ;сохраним остальные биты, чтобы не потерялись
mov al, '0' ;формируем символ-бит
adc al,0 ;добавим к '0' бит С (получим или '0', или '1')
stosb ;пишем по адресу [edi]
shr al,1 ;вернем бит в С, сдвинув на 1 вправо, младший (наш!) уйдет в С
pop eax ;восстановим остальные биты
adc ebx,0 ;счетчик единиц, добавим к счетчику 0+С, фактически считаем единицы
inc edx ;общий счетчик бит
dec ah ;по всем 4 битам hex-цифры
jnz calcBitsLoop
loop calcLoop ;по всем цифрам строки
sub edx,ebx ;число нулей = общий счетчик бит - число единиц
mov al,0
stosb ;закроем строку символов-бит нулем
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.