在Mac OSX上使用NASM和ld

时间:2013-01-08 22:48:37

标签: macos assembly x86 nasm ld

我是Assembly的初学者(事实上这是我的第一次尝试),我想知道如何使用NASM和ld链接器在我的Mac上运行x86汇编代码。

SECTION .data           ; Section containing initialised data

    EatMsg: db "Eat at Joe's!",10
    EatLen: equ $-EatMsg    

SECTION .bss            ; Section containing uninitialized data 

SECTION .text           ; Section containing code

global  _start          ; Linker needs this to find the entry point!

_start:
    nop         ; This no-op keeps gdb happy...
    mov eax,4       ; Specify sys_write call
    mov ebx,1       ; Specify File Descriptor 1: Standard Output
    mov ecx,EatMsg      ; Pass offset of the message
    mov edx,EatLen      ; Pass the length of the message
    int 80H         ; Make kernel call

    MOV eax,1       ; Code for Exit Syscall
    mov ebx,0       ; Return a code of zero 
    int 80H         ; Make kernel call

这个汇编代码来自一本为linux制作的书,但是由于linux和mac都是基于unix的操作系统,我认为汇编代码通常是相同的。我现在意识到我可能无法通过nasm和ld将其转换为mac可执行文件,但如果可以的话,我该怎么做?如果没有,我将如何更改此汇编代码以使其正常工作,但通常会做同样的事情?

2 个答案:

答案 0 :(得分:4)

以下示例代码在与nasm汇编并使用gcc链接时应该有效(需要链接到标准c库!)

SECTION .data           ; Section containing initialised data

    EatMsg: db "Eat at Joe's!",10
    EatLen: equ $-EatMsg

SECTION .bss            ; Section containing uninitialized data

SECTION .text           ; Section containing code

global main
extern write

main:
    sub esp, 12                 ; allocate space for locals/arguments
    mov dword [esp], 1          ; stdout
    mov dword [esp+4], EatMsg   ; Pass offset of the message
    mov dword [esp+8], EatLen   ; Pass the length of the message
    call write                  ; Make library call

    mov eax,0                   ; Return a code of zero
    add esp, 12                 ; restore stack
    ret

请注意,“Hello world”是一个特别糟糕的第一个asm程序,并且通常不建议从asm执行I / O和其他高级操作。

答案 1 :(得分:3)

在OS X上不推荐使用

int 80H,并且在任何情况下它都使用与Linux不同的选择器。您应该使用syscall或者调用标准C库。

请参阅:thexploit.com/secdev/mac-os-x-64-bit-assembly-system-calls,在Mac OS X上使用nasm获取有用的“Hello World”教程。

另请参阅:daveeveritt.tumblr.com/post/67819832/webstraction-2-from-unix-history-and-assembly-language了解有关使用nasm构建OS X可执行文件的更多信息。