Go (golang) 就是这样做的。这是设置寄存器的Go Linux AMD64 syscalls 的部分源代码(x86_64 上的Linux 使用syscall 而不是int 0x80):
// func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr)
TEXT ·Syscall6(SB),NOSPLIT,$0-80
CALL runtime·entersyscall(SB)
MOVQ a1+8(FP), DI
MOVQ a2+16(FP), SI
MOVQ a3+24(FP), DX
MOVQ a4+32(FP), R10
MOVQ a5+40(FP), R8
MOVQ a6+48(FP), R9
MOVQ trap+0(FP), AX // syscall entry
SYSCALL
CMPQ AX, $0xfffffffffffff001
JLS ok6
MOVQ $-1, r1+56(FP)
MOVQ $0, r2+64(FP)
NEGQ AX
MOVQ AX, err+72(FP)
CALL runtime·exitsyscall(SB)
RET
ok6:
MOVQ AX, r1+56(FP)
MOVQ DX, r2+64(FP)
MOVQ $0, err+72(FP)
CALL runtime·exitsyscall(SB)
RET
这具有可以预见的缺点,即必须为每个内核约定乘以每个支持的架构编写和维护一个文件。 The directory 目前有文件表明支持以下各项:
- aix_ppc64,darwin_386,darwin_amd64,darwin_arm,darwin_arm64,freebsd_arm,linux_386,linux_amd64,linux_arm,linux_arm64,linux_mips64x,linux_mipsx,linux_ppc64x,linux_s390x,nacl_386,nacl_amd64p32,nacl_arm,netbsd_arm,openbsd_arm,plan9_386,plan9_amd64,plan9_arm,solaris_amd64,unix_386 , unix_amd64
也可以针对不受支持的组合或新端口链接 libc,但 go1.11.4 linux/amd64 默认直接使用系统调用。