#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; возвратите a
=
и +
- модификаторы ограничений.
http://gcc.gnu.org/onlinedocs/gcc/Modifiers.html#Modifiers
`= 'Означает, что этот операнд доступен только для записи для этой инструкции: {{1} } предыдущее значение отбрасывается и заменяется выходными данными.
`+ 'Означает, что этот операнд читается и записывается инструкцией.
Здесь приведены основные ограничения
http://gcc.gnu.org/onlinedocs/gcc/Simple-Constraints.html#Simple-Constraints
m
Допускается операнд памяти с {{1 }} любой адрес, который машина поддерживает в целом...
1
.. Разрешен операнд, который соответствует указанному номеру операнда. Если цифра используется вместе с буквами внутри та же альтернатива, цифра должна идти последней.
'a' специфично для i386
http://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html#Machine-Constraints
a Регистр a (eax).
есть ограничения
. Это не переменные, а режимы, такие как «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 */
);