2015-09-29 3 views
0

Я очень новичок в сборке GNU, я прочитал несколько писем, но до сих пор не совсем понимаю, что происходит. Из моего понимания:Сборник GNU Inline: что означают% 1 и% 0?

movl %eax, %ebx\n\t будет двигаться все, что в %eax в ebx, но не добавит содержимое друг к другу

addl %eax, %ebx\n\t добавит содержимое %eax с ebx и держать его в правом наиболее регистре

addl %1, %0\n\t вот где я запутался, мы добавляем 1 и 0? зачем нам нужен %0?

+3

В AT & T синтаксис, адресатом является правая сторона, так что «держать его в самый левый регистр» является неправильным. % 0 и% 1 относятся к замещаемым операндам ввода/вывода, перечисленным в разделе ограничений. Возможно, вы захотите прочитать [manual] (https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html). – Jester

+0

@Jester Извините, это опечатка, вот что я имел в виду. что имеет смысл сейчас, если я использую% 2, это будут 3-х операнды ввода/вывода? – octain

+2

Да. Также обратите внимание, что вы можете использовать именованные операнды в форме '% [name]', чтобы сделать код более читаемым. – Jester

ответ

1

Весь ASM встроенный блок выглядит следующим образом:

asm [volatile] (AssemblerTemplate 
         : OutputOperands 
         [ : InputOperands 
         [ : Clobbers ] ]) 

ИЛИ

asm [volatile] (AssemblerTemplate 
         : OutputOperands) 

В AssemblerTemplate ваш код сборки, и в выходных/InputOperands, вы можете передать переменную между C и ASM.

Затем в Asm,% 0 относится к первому переменному, переданным в качестве OutputOperand или InputOperand,% 1 ко второму и т.д.

Пример:

int32_t a = 10; 
int32_t b; 
asm volatile ("movl %1, %0" : "=r"(b) : "r"(a) :); 

Этот код ASM эквивалентен «Ъ = a; "

Более подробное описание здесь: https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html

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

  • Нет связанных вопросов^_^