我正在尝试使用NASM在Mac上的汇编程序64中编写一个简单的helloworld。 每次我尝试运行它时都会收到此错误:
Illegal instruction: 4
这是我的代码:
section .text
global _main
_main:
mov rax, 4
mov rbx, 1
mov rcx, tekst
mov rdx, dlugosc
int 80h
mov rax, 1
int 80h
section .data
tekst db "Hello, world", 0ah
dlugosc equ $ - tekst
我正在编译:
nasm -f macho64 HelloWorld.asm
我正在联系:
ld -o HelloWorld -arch x86_64 -macosx_version_min 10.10 -lSystem -no_pie HelloWorld.o
非常感谢任何帮助。
答案 0 :(得分:2)
让我们从最重要的事情开始:
在Mac OSX上,系统调用前面是0x2000 ###,因此对于退出,它将为0x2000001。
接下来,我们需要使用正确的寄存器来传递参数。
The number of the syscall has to be passed in register rax.
rdi - used to pass 1st argument to functions
rsi - used to pass 2nd argument to functions
rdx - used to pass 3rd argument to functions
rcx - used to pass 4th argument to functions
r8 - used to pass 5th argument to functions
r9 - used to pass 6th argument to functions
A system-call is done via the syscall instruction. The kernel destroys registers rcx and r11.
因此,将代码整合在一起,代码的固定版本为:
section .text
global _main
_main:
mov rax, 0x2000004
mov rdi, 1
mov rsi, tekst
mov rdx, dlugosc
syscall
mov rax, 0x2000001
syscall
section .data
tekst db "Hello, world", 0ah
dlugosc equ $ - tekst