2010-03-22 1 views
8
#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; return aВызов сборки в GCC?

ответ

2

есть constraints. Они не являются переменными, но режимы, такие как «ш», «г», «г +» из fopen()

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

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

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

И последний «cc» - это clobber.

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

Полный формат асмовый

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

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

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

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

`+ 'Значит, что этот операнд , прочитанный и написанный инструкцией.

Основные сдерживает здесь

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

m операнд памяти допускается, любым видом адреса, что машина поддерживает в целом.

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

'а' i386 удельной

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

А (EAX) регистр.

+0

также здесь http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s6 – osgx