x86 вопрос о битовых сравнениях - PullRequest
2 голосов
/ 24 октября 2008

У меня проблема с последней частью моего задания. Мы получаем поток битов и т. Д., И т. П. В потоке есть целое число с числом единиц в текстовой части. Я получаю это целое число и его 24, что является правильным, теперь я перебираю текстовые данные, которые я получаю, и я пытаюсь посчитать все 1 там. Но мой процесс всегда возвращает ноль.

Я смог убедиться, что он зацикливается правильно, и это так.

Текст = Привет это 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 с байтом, если его AX еще на 1 дюйм сместит маску вправо на 1 и зациклит целый байт, чем inc на следующий байт и сделает снова.

Ответы [ 2 ]

2 голосов
/ 24 октября 2008

shr bh, 1 ', вероятно, должно быть' shr dh, 1 ', нет?

1 голос
/ 24 октября 2008

Просто чтобы дать вам альтернативную и более короткую реализацию вашего внутреннего цикла:

        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, 0 просто добавляет перенос в AX.

...