【问题标题】:x86 question about bit comparisons关于位比较的 x86 问题
【发布时间】:2008-10-24 02:19:40
【问题描述】:

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

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

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

【问题讨论】:

    标签: assembly x86 tasm


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      只是为了给你一个替代和更短的内部循环实现:

              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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-24
        • 1970-01-01
        • 1970-01-01
        • 2011-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多