1:汇编的结构
__asm__ __volatile__(assembly template \汇编指令行
: output operand list \输出操作数列表
: input operand list \输入操作数列表
: clobber list \破坏列表
内联汇编在逻辑上总是由四部分组成:
-
关键字 asm() 或 asm()。修饰符 volatile 或 volatile:关键字 asm 或 asm 用于说明随后的字符串是内联汇编代码块。volatile 或 volatile 是可选的,可以将它们添加到 asm 后面,禁止某些编译器的优化。其实,asm 和 __asm__几乎是相同的,惟一的区别是,当预处理程序宏中使用内联汇编时,asm 在编译过程中可能会引发警告。volatile 和 volatile 也是如此。
-
汇编模板:
汇编模板是括号内的第一个部分。它包含汇编指令行,这些指令行都包括在双引号 ("") 中,以行分隔符(nt 或 n)结束。内联汇编代码的语法是相同的,但比一般的汇编代码简单得多。这其中有许多原因。例如,它不需要在汇编模板中定义数据,因为它应该始终从 C/C++ 变量引用。而且,很少有必要在汇编模板中(为可执行文件)创建一个分段。一般情况下,除了汇编指令,只允许使用一些本地标签。
#define _syscall0(type,name)
type name(void)
{
long __res;
__asm__ volatile ("int $0x80"
: "=a" (__res) //输出参数放到__res中
: "0" (__NR_##name)); //输入参数__NR_name代表的值
if (__res >= 0)
return (type) __res;
errno = -__res;
return -1;
}
这段代码的大体含义:触发0x80中断,进入系统调用,具体的调用函数是__NR_name代表的函数。函数返回结果会在eax中,并把eax寄存器的值(返回值) 赋值给__res
汇编指令行
一个指令的操作数是寄存器/立即类型的操作数,那么可以引用它作为一个带有百分比前缀编号的寄存器。 (%0, %1,…)
输出操作数列表
" " 中的值是可选约束修饰符
例如,=&r (ret) 的修饰符是 = 和 &。= 表示该变量是只写的。& 表示这个变量不能与任何输入操作数共享相同的寄存器。
参考: 汇编相关介绍



