Встроенная сборка C ++: как обращаться со ссылками? - PullRequest
4 голосов
/ 11 февраля 2011

Как работать со ссылками в функции встроенного ассемблера?Я пытаюсь это

void foo(int& x)
{
    __asm mov x, 10
}

int main()
{
    int x = 0;
    foo(x);
    std::cout << x << std::endl;
}

, но x по-прежнему 0 после выполнения функции, однако этот работает нормально

int x = 0;
__asm mov x, 10
std::cout << x << std::endl;

Как это решить?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 11 февраля 2011

Ссылка - это указатель с семантикой значения - в языке ассемблера эта семантика не имеет значения, поэтому у вас остается указатель:

void foo(int& x)
{
    __asm { 
        mov eax, x
        mov DWORD PTR [eax], 10
    }
}

(Конечно, YMMV в зависимости от компилятора, версии, оптимизацийи т. д. все обычные вещи при использовании встроенной сборки.)

2 голосов
/ 11 февраля 2011

Ссылка - это, по сути, указатель, адрес значения, а не само значение. Так это работает, например:

void foo(int& x)
{
    __asm mov eax, x
    __asm mov dword ptr [eax], 10
}

Выход:

10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...