Звонит сборка в GCC? - PullRequest
       13

Звонит сборка в GCC?

8 голосов
/ 22 марта 2010
#include <stdlib.h>

static inline uint
xchg(volatile unsigned int *addr, unsigned int newval)
{
   uint result;
   asm volatile("lock; xchgl %0, %1" : "+m" (*addr), "=a" (result) : "1" (newval) : "cc");

return result;    
}

Может кто-нибудь сказать мне, что именно делает этот код?Я имею в виду, у меня есть идея или части этой команды.«1» newval - это ввод, «= a» - очистить предыдущее значение и обновить его.«m» - для операции с памятью, но я не совсем понимаю функциональность этой функции.Что делает знак "+ m"?Делает ли эта функция что-то вроде m = a;m = newval;вернуть

Ответы [ 2 ]

6 голосов
/ 22 марта 2010

= и + являются модификаторами ограничений.

http://gcc.gnu.org/onlinedocs/gcc/Modifiers.html#Modifiers

`= 'Означает, что этот операнд только для записи для этой инструкции: предыдущее значение отбрасывается и заменены выходными данными.

`+ 'Означает, что этот операнд является читать и писать по инструкции.

Основные ограничения здесь

http://gcc.gnu.org/onlinedocs/gcc/Simple-Constraints.html#Simple-Constraints

m Разрешается операнд памяти, с любой вид адреса, который машина поддерживает в общем.

.. 1 .. Операнд, соответствующий указанный номер операнда допускается. Если цифра используется вместе с буквы в той же альтернативе, цифра должна быть последней.

'a' является специфичным для i386

http://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html#Machine-Constraints

a Регистр a (eax).

2 голосов
/ 22 марта 2010

есть constraints. Они не переменные, а режимы, такие как "w", "r", "r +" из fopen()

некоторые из них описаны здесь

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

часть 6. Подробнее об ограничениях.

И последний "cc" - клоббер.

Если наша инструкция может изменить регистр кода условия, мы должны добавить "cc" в список дубликатов.

Полный формат asm:

   asm ( assembler template 
       : output operands                  /* optional */
       : input operands                   /* optional */
       : list of clobbered registers      /* optional */
       );
...