質問

課題の最後の部分に問題があります。ビットなどのストリームを取得します。ストリームは、テキスト部分に1の数を持つ整数です。その整数と正しい24を取得し、取得したテキストデータをループして、そこにあるすべての1をカウントしようとします。しかし、私のprocは常にゼロを返します。

適切にループしていることを確認できました。

テキスト= Hello これは16の1で、ここにテキストをループしてその中の1の数をカウントするためのprocがあります。

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はプッシュ/ポップのみです。これが実際にしたいことは、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    

ここでは、ビットをまったくテストしません。代わりにdhを追加すると、dhは最上位ビットをキャリーにシフトし、1つの命令でshl dh、1と同じことを行います。

addc ax、0は、キャリーをAXに追加するだけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top