2011-04-16 45 views
1

好了,所以我必须在我试图使用内联汇编Microsoft内联汇编和引用或为什么BYTE PTR [ByteRef]在这种情况下不起作用?

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 
    } 
} 

这应该工作在C++函数,对不对?由于Byte是一个引用(它本质上是一个常量指针),因此它必须被取消引用来访问数据......但它不起作用!

在调试以下代码:

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

我不明白为什么这会发生在所有。

回答

1

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

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

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