2011-04-16 43 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]訪問值,它訪問指針值的第一個字節(指向的地址)而不是指向的值。