SPARC Сборочный вопрос - PullRequest
       26

SPARC Сборочный вопрос

1 голос
/ 03 марта 2011

Я хочу написать очень простую встроенную процедуру сборки в моей C-программе, которая больше ничего не делает, затем устанавливает локальные регистры% l0 -% l7 в разные значения.Я попробовал следующий простой подход:

asm volatile (
    ".text\n\t"
    "mov 0, %%l0             \n\t"
    "mov 1, %%l1             \n\t"
    "mov 2, %%l2             \n\t"
    "mov 3, %%l3             \n\t"
    "mov 4, %%l4             \n\t"
    "mov 5, %%l5             \n\t"
    "mov 6, %%l6             \n\t"
    "mov 7, %%l7             \n\t"
);  

, к сожалению, ассемблер говорит: недопустимый операнд для каждой инструкции.Может ли кто-нибудь быть таким милым, чтобы указать мне, как правильно передать непосредственные значения ассемблеру SPARC?

Большое спасибо!

РЕДАКТИРОВАТЬ: Спасибо, Крис, я внес изменения, которые вы предложили, нокомпилятор Sparc все еще что-то говорит о недопустимых операндах ...

Ответы [ 2 ]

2 голосов
/ 04 марта 2011

SPARC не содержит инструкций «немедленного перемещения» как таковых;есть либо or, который можно использовать, например, or %g0, 123, %l0 (или 11-битная константа длиной не более 11 с регистром нуля, %g0, приводящая к перемещению указанной константы в целевой регистр), либо sethi инструкция, которая может использоваться для установки старшего 21 бита регистра.Чтобы вместить любую (32-битную) константу, вам необходимо синтезировать двухступенчатый set, выполнив сначала sethi для старших битов, а затем or с младшими.

Сборщики SPARC обычно используют ярлык set ..., %tgtregister для создания этой последовательности и / или исключают одну инструкцию, если для этого подходит константа.

Также обратите внимание, что в 64bit / sparcv9, set инструкция может в конечном итоге привести к последовательности до пяти инструкций, сдвигая / или объединяя вещи.

0 голосов
/ 03 марта 2011

Вам нужны строки типа mov 0, %%l0 - источник, затем пункт назначения, а константы - это просто константы, без символа «#».

редактировать

Если у вас нет ограничений в вашей директиве asm (просто строка), то gcc не обрабатывает строку для% -escapes. Таким образом, в этом случае вам нужно всего один % символов перед именем регистра. Но если вы добавите какие-либо ограничения (или даже просто :: после строки - пустой набор ограничений), он будет искать% -escapes, поэтому вам нужно %% для имен регистров.

Поэтому добавьте :: непосредственно перед ) или не дублируйте символы %.

...