【问题标题】:BSF Opcode is not workingBSF 操作码不工作
【发布时间】:2011-04-15 13:07:32
【问题描述】:

我正在使用 Visual Studio 2010 专业版,我刚刚在调试模式下检查 BSF 不起作用我尝试了很多组合,但没有一个起作用!

__asm
{   
    mov ebx, 0ffffffh;
    bsf ecx, ebx;
};

上面的代码至少给了我一些结果,但我在 ecx 寄存器上得到了 0(我使用的是 64 位 win7,应用程序是 32 位)

以下是英特尔对 BSF 的评价:

搜索源操作数(第二个 操作数)对于最不重要的集合 位(1 位)。如果一个最不重要的 1 找到位,存储其位索引 在目标操作数中(首先 操作数)。源操作数可以是 寄存器或内存位置;这 目标操作数是一个寄存器。这 位索引是一个无符号偏移量 源操作数的位 0。如果 源操作数的内容为 0, 目标操作数的内容 未定义。

有人有什么想法吗?谢谢大家...

【问题讨论】:

    标签: c++ visual-studio-2010 assembly x86


    【解决方案1】:

    您将 ecx 设置为 0,因为值 0xffffff 中的最低有效(最低?)1 位 位 0。其二进制数是 0000 .... 1111 1111 1111 1111 1111 1111 .

    换句话说,你看到的结果是正确的。

    如果您要在 0xfc 上尝试,例如(二进制 1111 1100),您应该得到 2。这是因为最低有效位在二进制数的最右边:

    Hex        F    C
    Binary   1111 1100
    Bit#     7654 3210
                   ^
                   |
                   +-- rightmost (least significant) 1-bit
    

    【讨论】:

    • +1,部分是为了正确答案(我相信),但主要是为了发明“最不重要”这个词...... ;-)
    • @MCA:是的,我做到了。您抱怨它说 0xffffff 中最右边的 1 位是位 0。我不确定 为什么 您在抱怨,因为这确实是正确的值。如果您想以一种不那么迟钝的方式告诉我您认为我哪里错了,我很乐意重新检查答案。
    • 哦,是的,你是对的 :) 猜我看得太累了!你应该说结果是正确的:)
    【解决方案2】:

    不要使用内联汇编,使用编译器内在函数:_BitScanForward

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      • 2015-07-05
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多