XV6 - usys.s что этот код делает?

Я никогда не видел этот синтаксис сборки.

#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 ответ

Для языка ассемблера с расширением .S, gcc будет использовать препроцессор 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. вернуться из этой функции
Другие вопросы по тегам