我从未见过这种汇编语法。
#include "syscall.h"
#include "traps.h"
#define SYSCALL(name) \
.globl name; \
name: \
movl $SYS_ ## name, %eax; \
int $T_SYSCALL; \
ret
SYSCALL(fork)
SYSCALL(exit)
SYSCALL(wait)
SYSCALL(pipe)
SYSCALL(read)
SYSCALL(write)
SYSCALL(close)
SYSCALL(kill)
SYSCALL(exec)
SYSCALL(open)
SYSCALL(mknod)
SYSCALL(unlink)
SYSCALL(fstat)
SYSCALL(link)
SYSCALL(mkdir)
SYSCALL(chdir)
SYSCALL(dup)
SYSCALL(getpid)
SYSCALL(sbrk)
SYSCALL(sleep)
SYSCALL(uptime)
答案 0 :(得分:6)
对于扩展名为.S
的汇编语言文件,gcc
将使用C预处理器。
在C中,行尾的\
表示“将下一行连接到此行”。
因此,宏变为
#define SYSCALL(name) .globl name; name: movl $SYS_ ## name, %eax; int $T_SYSCALL; ret
##
运算符将在左右连接标记。
因此,例如,SYSCALL(fork)
将扩展为
.globl fork; fork: movl $SYS_fork, %eax; int $T_SYSCALL; ret
这意味着
fork
公开fork
(这将作为一项功能)SYS_fork
以注册%eax
T_SYSCALL