2008-10-24 85 views
2

我的任务的最后一部分存在问题。我们得到一串比特等,在这个流中是一个整数,文本部分中的数字是1。我得到这个整数和它的24是正确的,现在我循环通过我得到的文本数据,并且我尝试计算所有的1在那里。但是我的proc总是返回零。有关比特比较的x86问题

我能够确保它正确地循环,它是。

该文本=你好 这是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只是推/弹出。实际上我想要做的是使用TEST将100000000与一个字节进行比较,如果它的值为1 inc,则AX将掩码右移1并循环一个字节,然后再循环到下一个字节并再次执行。

回答

2

'shr bh,1'应该是'shr dh,1',否?

+0

哇,这是一个白痴,就是这样,thx。 – chicken 2008-10-24 02:25:11

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。

+0

thx为提示。 – chicken 2008-10-24 16:10:43