我是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可执行文件,但如果可以的话,我该怎么做?如果没有,我将如何更改此汇编代码以使其正常工作,但通常会做同样的事情?
答案 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)
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可执行文件的更多信息。