2

我的作业的最后一部分有问题。我们得到一个比特流等,在流中是一个整数,文本部分中有 1 的个数。我得到那个整数和它的 24 是正确的,现在我遍历我得到的文本数据,并尝试计算其中的所有 1。但我的过程总是返回零。

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

文本 = Hello,它是 16 个 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 将最高位移入进位,并且在一条指令中也与 shl dh,1 相同。

addc ax,0 只是将进位添加到 AX。

于 2008-10-24T08:49:20.217 回答