2014-03-12 27 views
0

Я хочу написать небольшую процедуру сборки, которая использует временный регистр. Когда я говорю о временном регистре, я имею в виду, что это не входной или выходной регистр в смысле ограничений для блока asm. Я мог бы просто выбрать любой регистр, а затем включить его в список clobber, но я подумал, что было бы лучше, если бы компилятор мог выбирать. Каков правильный способ справиться с этим? Единственное предложение, которое я нашел в Интернете, - это перечислить его как выходной регистр, а затем фактически не использовать вывод.Временный регистр в встроенном сборочном блоке

+2

С помощью какого компилятора? На каком процессоре/ОС? –

ответ

2

Вы не можете использовать ограничение r (общий регистр) в списке clobber. И входной регистр считается немодифицированным оператором asm. Лучшее решение - указать temp как выходной регистр, который дает компилятору возможность отбрасывать «результат», а также удалять реестр.

unsigned long tmp; /* register 'word' type. */ 

__asm__ ("..." : "=r" (tmp), ... : <inputs> : <clobbered>); 

Теперь вы можете обратиться к регистру, как временный %0, в этом примере. При условии, что переменная tmp никогда не используется, компилятор может отменить результат и продолжить (повторно) использовать регистр.

+0

Хорошо, это звучит хорошо. Компилятор, по-видимому, замечает, что я никогда не пользовался 'tmp' впоследствии. –

+0

@MichaelMcLoughlin - это предполагает, что инструкции, которые используют '% 0', не имеют никаких ограничений на регистры, которые они могут использовать. Некоторые инструкции x86 имеют такие причуды, например, 'q',' Q' [ограничения] (http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/Machine-Constraints.html#Machine-Constraints) , –

+0

Просто будьте осторожны, чтобы не дать компилятору впечатление, что единственная точка ассемблера - это вычисление 'tmp', или оно, вероятно, отбросит все это! – SamB

Смежные вопросы