我正在运行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文档在哪里(不使用堆栈)??!