2

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

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

テキスト = 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 を次のバイトに移動してもう一度実行します。

4

2 に答える 2

2

'shr bh,1' はおそらく 'shr dh,1' のはずですよね?

于 2008-10-24T02:22:13.353 に答える
1

内部ループの代替のより短い実装を提供するためだけに:

        mov    cx, 8
        mov    dh, byte ptr [bx+si] 
@@innerLoop:
        add    dh, dh    
        adc    ax, 0
        loop   @@innerLoop    

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

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

于 2008-10-24T08:49:20.217 に答える