FreeBSD 64bits常规调用文档

时间:2017-07-31 19:36:12

标签: assembly x86-64 freebsd

我正在运行FreeBSD 11.0。

FreeBSD手册中的以下内容不打印“Hello,World!”消息:

section .text
hello db 'Hello, World!, 0Ah
hbytes equ $-hello

_syscall:
    int 80h
    ret

global _start
_start:
    push dword hbytes
    push dword hello
    push dword 1   ; stdout
    mov rax, 4    ; write syscall
    call _syscall
    add rsp, byte 24 ; restore stack
    push word 0      ; return 0
    mov rax, 1       ; exit call
    call _syscall

但这有效:

section .text
hello db 'Hello, World!, 0Ah
hbytes equ $-hello

_syscall:
    int 80h
    ret

global _start
_start:
    mov rdi, 1
    mov rsi, hello  ; appears to be magic
    mov rdx, hbytes ; appears to be magic
    mov rax, 4    ; write syscall
    call _syscall

    push word 0      ; return 0
    mov rax, 1       ; exit call
    call _syscall

这提出了几个问题:

1)为什么第一种方法不起作用?

UNIX调用约定是堆栈上的推送数据。程序不会崩溃。我只是没有得到任何输出,程序终止。我正在编译和链接很好。

2)我们如何知道要加载哪些寄存器以及具有什么值?

如果我正在推动堆栈,那很容易。我查找C函数然后知道如何推送数据。

在这种情况下,它就像魔法一样。

3)类似系统调用的FreeBSD文档在哪里(不使用堆栈)??!

0 个答案:

没有答案