Linux汇编out语法,Linux C中内联汇编的语法格式及使用方法(Inline Assembly in Linux C)...

3. 实例剖析

前面介绍了很多理论性的规则,这里通过分析一个实例来加深对inline assembly的理解。

下面的代码是Linux内核i386版本中的syscall0定义:

#define _syscall0(type, name)          \

type name(void)                        \

{                                      \

long __res;                        \

__asm__ volatile ( "int $0x80"    \

: "=a" (__res)                  \

: "0" (__NR_##name));            \

__syscall_return(type, __res);    \

}

对于系统调用fork来说,上述宏展开为:

pid_t fork(void)

{

long __res;

__asm__ volatile ( "int $0x80"

: "=a" (__res)

: "0" (__NR_fork));

__syscall_return(pid_t, __res);

}

根据前面对inline assembly语法及使用方法的说明,我们不难理解这段代码的含义。将这段内联汇编翻译更可读的伪码形式为:

pid_t fork(void)

{

long __res;

%eax = __NR_fork  /* __NR_fork为内核分配给系统调用fork的调用号 */

int $0x80          /* 触发中断,内核根据%eax的值可知,引起中断的是fork system call */

__res = %eax      /* 中断返回值保持在%eax中 */

__syscall_return(pid_t, __res);

}

=============== EOF ================0b1331709591d260c1c78e86d0c51c18.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值