Встроенная сборка и ссылки Microsoft или Почему BYTE PTR [ByteRef] не работает в этой ситуации? - PullRequest
1 голос
/ 16 апреля 2011

Хорошо, у меня есть функция 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
    }
}

Это должно работать, верно? Поскольку Байт является ссылкой (которая по сути является постоянным указателем), для доступа к данным необходимо разыменовать его, но это не сработало!

После отладки следующий код:

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

Я не понимаю, почему это вообще произошло.

1 Ответ

1 голос
/ 16 апреля 2011

Как вы говорите, ссылка такая же, как указатель в сборке. Чтобы получить доступ к ссылке / указателю, вы должны сначала прочитать значение указателя, а затем разыменовать его:

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

Когда вы получаете доступ к значению на BYTE PTR [Byte], он получает доступ к первому байту значения указателя (адресуемого адреса) вместо указанного значения.

...