【问题标题】:Microsoft inline assembly and references or Why does BYTE PTR [ByteRef] not work in this situation?Microsoft 内联汇编和引用或为什么 BYTE PTR [ByteRef] 在这种情况下不起作用?
【发布时间】:2011-04-16 19:42:48
【问题描述】:

好的,所以我有一个 C++ 函数,我试图在其中使用内联汇编

void ToggleBit(unsigned char &Byte, unsigned int Bit)
{
    /* In C:
    *    Byte ^= (1<<Bit);
    */
    __asm
    {
        push edx
        push ecx
        mov  ecx, Bit
        xor  edx, edx
        mov  edx, 1
        sal  dl, cl
        xor  BYTE PTR [Byte], dl
        pop  ecx
        pop  edx
    }
}

这应该可行,对吧?由于 Byte 是一个引用(本质上是一个常量指针),所以必须解除对它的引用才能访问数据……但它不起作用!

调试以下代码:

mov  edx, Byte           
;edx = 0x0040f9d3
mov  bl, BYTE PTR [Byte]
;bl = 0xd3

我完全不明白为什么会发生这种情况。

【问题讨论】:

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


    【解决方案1】:

    正如您所说,引用与汇编中的指针相同。要访问引用/指针,您必须首先读取指针值,然后取消引用它:

    mov ecx, Byte      ; Or  mov ecx, [Byte]  which is the same thing
    xor [ecx], dl
    

    当您访问BYTE PTR [Byte] 处的值时,它访问的是指针值的第一个字节(指向的地址)而不是指向的值。

    【讨论】:

      猜你喜欢
      • 2015-03-05
      • 1970-01-01
      • 2017-11-26
      • 2010-12-29
      • 1970-01-01
      • 2021-08-05
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多