在 GCC 中调用汇编?

发布于 2024-08-26 05:30:32 字数 405 浏览 8 评论 0原文

#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 = 新值;返回一个

#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;    
}

Can some one tell me what this code does exactly? I mean I have an idea or the parts of this command. "1" newval is the input, "=a" is to flush out its previous value and update it. "m" is for the memory operation but I am confused about the functionality of this function. What does the "+m" sign do? Does this function do something like m=a; m = newval; return a

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

dawn曙光 2024-09-02 05:30:32

=+ 是约束修饰符。

http://gcc.gnu.org/onlinedocs/gcc/Modifiers.html#修饰符

`=' 表示该操作数是
该指令只写:
先前的值被丢弃并且
由输出数据替换。

`+' 表示该操作数既是
按指令读写。

基本约束在这里

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) 寄存器。

= and + are constraint modifiers.

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

`=' Means that this operand is
write-only for this instruction: the
previous value is discarded and
replaced by output data.

`+' Means that this operand is both
read and written by the instruction.

Basic constrains are here

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

m A memory operand is allowed, with
any kind of address that the machine
supports in general.

..1.. An operand that matches the
specified operand number is allowed.
If a digit is used together with
letters within the same alternative,
the digit should come last.

'a' is i386 specific

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

a The a (eax) register.

蘸点软妹酱 2024-09-02 05:30:32

限制。它们不是变量,而是模式,例如 fopen() 的“w”、“r”、“r+”,

其中一些描述如下

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

第 6 部分。有关约束的更多信息。

最后一个“cc”是“clobber”。

如果我们的指令可以改变条件代码寄存器,我们必须将“cc”添加到clobber列表中。

asm的完整格式是

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

there are constraints. They are not variables, but modes, like the "w", "r", "r+" of fopen()

some of them are described here

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

part 6. More about constraints.

And the last "cc" is clobber.

If our instruction can alter the condition code register, we have to add "cc" to clobber list.

Full format of asm is

   asm ( assembler template 
       : output operands                  /* optional */
       : input operands                   /* optional */
       : list of clobbered registers      /* optional */
       );
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文