非法指令:4(Mac 64位,NASM)

时间:2014-11-12 18:15:27

标签: macos assembly nasm x86-64 ld

我正在尝试使用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

非常感谢任何帮助。

1 个答案:

答案 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