У меня проблема с последней частью моего задания. Мы попадаем в поток битов и т. д. И т. Д., В потоке есть целое число с количеством единиц в текстовой части. Я получаю это целое число и его 24, что является правильным, теперь я просматриваю текстовые данные, которые получаю, и пытаюсь подсчитать все единицы там. Но моя процедура всегда возвращает ноль.
Я смог убедиться, что цикл работает правильно, и это так.
Текст = Привет что составляет 16 единиц, вот моя процедура для перебора этого текста, чтобы подсчитать количество единиц в нем.
sub AX,AX
sub SI,SI
mov bx,[bp+6] ;get message offset
@@mainLoop:
mov cx,8
mov dh,80h
cmp byte ptr [bx + si],0
je @@endChecker
@@innerLoop:
test byte ptr [bx + si],dh
jz @@zeroFound
inc AX
@@zeroFound:
shr bh,1
loop @@innerLoop
@@continue:
inc si
jmp @@mainLoop
остальная часть процесса - это просто push / pops. На самом деле я хочу, чтобы это было сделано с помощью TEST, чтобы сравнить 100000000 с байтом, если это 1 inc AX, иначе сдвинуть маску вправо на 1 и зациклить весь байт, чем inc до следующего байта и повторить.





«shr bh, 1», вероятно, должно быть «shr dh, 1», не так ли?
Просто чтобы дать вам альтернативную и более короткую реализацию вашего внутреннего цикла:
mov cx, 8
mov dh, byte ptr [bx+si]
@@innerLoop:
add dh, dh
adc ax, 0
loop @@innerLoop
Здесь мы вообще не тестируем биты. Вместо этого add dh, dh сдвигает самый верхний бит в перенос, а также делает то же самое, что и shl dh, 1 в одной инструкции.
Addc ax, 0 просто добавляет перенос к AX.