Считать значение регистра в переменную с помощью одной команды asm

Как я могу прочитать значение регистра в переменной с помощью одной встроенной команды ассемблера? Я использую 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

Как добиться такого результата?


person asmodan    schedule 18.02.2011    source источник


Ответы (2)


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

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

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

person FrankH.    schedule 18.02.2011

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

__asm__ __volatile__ ("" : "=a" (r_eax), "=b" (r_ebx));
person Jester    schedule 18.02.2011
comment
Вы можете напрямую поместить его в память, используя ограничение "=m", для чего он нужен. Смотрите мой ответ. - person FrankH.; 18.02.2011
comment
@FrankH: я имел в виду, что, используя ограничение = r, он явно дал команду gcc не помещать его в память, поэтому он запретил mov переход в память. он не может напрямую поместить его в память = gcc не может, так как программист сказал иначе. Конечно, использование = m будет работать, я не спорил об этом. - person Jester; 18.02.2011
comment
Не хотел обидеть, извини. Просто хотел указать, что то, о чем просил асмодан, не было невозможным само по себе, но просто не работало для него, поскольку он использовал неправильное ограничение. - person FrankH.; 18.02.2011
comment
@FrankH: Я не обижен. Я мог быть неясным. Оба наших решения в порядке, ваше более явное и контролирует movs напрямую, мое оставляет это компилятору. - person Jester; 18.02.2011