문제

임무의 마지막 부분에 문제가 있습니다. 우리는 비트 등의 스트림 등을 얻습니다. 스트림에는 텍스트 부분에 1의 수가있는 정수가 있습니다. 나는 그 정수와 그 24가 올바르게 얻습니다. 이제 나는 얻는 텍스트 데이터를 고려하고 거기에 1을 모두 계산하려고합니다. 그러나 내 Proc은 항상 0을 반환하고 있습니다.

나는 그것이 제대로 반복되고 있는지 확인할 수 있었다.

텍스트 = hello 인 hello는 16 1입니다. 여기에 해당 텍스트를 통해 반복을위한 프로토리가 있습니다.

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

Proc의 나머지 부분은 단지 푸시/팝입니다. 실제로 이것을 원하는 것은 테스트를 사용하여 1000000000을 바이트와 비교하는 것입니다. 1 Inc Ax가 마스크를 1 씩 바로 돌리고 전체 바이트를 다음 바이트로 돌리고 다시 수행하는 것입니다.

도움이 되었습니까?

해결책

'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와 동일합니다.

Addc Ax, 0은 캐리를 도끼에 추가합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top