【问题标题】:XV6 - usys.s what does this code it do?XV6 - usys.s 这个代码是做什么的?
【发布时间】:2015-09-22 09:54:20
【问题描述】:

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

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

【问题讨论】:

    标签: xv6


    【解决方案1】:

    对于扩展名为 .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. 从此函数返回

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 2019-02-27
      相关资源
      最近更新 更多