Вызов блока в GCC?

#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

8
задан osgx 23 March 2010 в 00:20
поделиться

2 ответа

= и + - модификаторы ограничений.

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).

6
ответ дан 5 December 2019 в 20:15
поделиться

есть ограничения . Это не переменные, а режимы, такие как «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 */
       );
2
ответ дан 5 December 2019 в 20:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: