Считать значение регистра в переменную одной командой asm - PullRequest
5 голосов
/ 18 февраля 2011

Как я могу прочитать значение регистра в переменную одной встроенной командой ассемблера? Я использую gcc на старой системе FreeBSD (v2.1 i386).

У меня есть такой код:

static volatile unsigned long r_eax, r_ebx;
asm ("movl %%eax, %0\n" :"=r"(r_eax));
asm ("movl %%ebx, %0\n" :"=r"(r_ebx));

В результате я получаю это:

mov    %eax,%eax
mov    %eax,0x1944b8
mov    0x1944b8,%eax
mov    %ebx,%eax
mov    %eax,0x1944bc
mov    0x1944bc,%eax

Но мне нужно просто:

mov    %eax,0x1944b8
mov    %ebx,0x1944bc

Как мне достичь этого результата?

Ответы [ 2 ]

3 голосов
/ 18 февраля 2011

Это делает для меня (пока r_eax / r_ebx статичны)

asm ("movl %%eax, %0\n"
     "movl %%ebx, %1\n"
     : "=m"(r_eax), "=m"(r_ebx));

Остерегайтесь этого, если только вы не задаете операторы языка ассемблера в то же самое asm() скобка, компилятор может решить сделать все виды "интересных оптимизаций" между ними, включая модификации этих правил.

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

Обратите внимание, что вы используете ограничения, дающие команду gcc поместить результат в регистр.Таким образом, он не может напрямую поместить его в память.Поскольку вы хотите хранить значения только из уже существующих регистров, вам даже не нужны никакие инструкции, только ограничения, например:

__asm__ __volatile__ ("" : "=a" (r_eax), "=b" (r_ebx));
...