关于比特比较的x86问题

时间:2008-10-24 02:19:40

标签: assembly x86 tasm

我的作业的最后一部分有问题。我们得到一个比特流等,在流中是一个整数,文本部分的数字是1。我得到那个整数和它的24这是正确的,现在我循环通过我得到的文本数据,我试图计算那里的所有1。但我的处理总是返回零。

我能够确保它正确循环并且确实如此。

text = 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的其余部分只是push / pops。我想要实际做的是使用TEST将100000000与一个字节进行比较,如果它是1 inc AX,则将掩码向右移动1并循环整个字节,而不是inc到下一个字节再做一次。

2 个答案:

答案 0 :(得分:2)

'shr bh,1'应该是'shr dh,1',不是吗?

答案 1 :(得分: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。