XV6 - usys.s它的代码是做什么的?

时间:2015-09-22 09:54:21

标签: xv6

我从未见过这种汇编语法。

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

1 个答案:

答案 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

这意味着

  1. 将识别码fork公开
  2. 定义标签fork(这将作为一项功能)
  3. 在此功能中
    1. 指定立即值SYS_fork以注册%eax
    2. 使用代码T_SYSCALL
    3. 生成中断
    4. 从此功能返回