如何在MacOSX上使用nasm编译代码

14

我正在尝试在汇编语言上编译和链接我的第一个程序。 我试图编译以下代码:

; %include "stud_io.inc"    
global _main     

section .text
_main: 
    xor eax, eax
again:
    ; PRINT "Hello"
    ; PUTCHAR 10
    inc eax     
    cmp eax, 5
    jl again

以下是编译和链接程序的控制台命令:

-bash-3.2$ nasm -f macho main.asm -o main.o  && ld -e _main -macosx_version_min 10.8 -arch x86_64 main.o

但结果是:

ld: warning: ignoring file main.o, file was built for i386 which is not the architecture being linked (x86_64): main.o
Undefined symbols for architecture x86_64:
  "_main", referenced from:
     -u command line option
ld: symbol(s) not found for architecture x86_64

我认为编译x86_64的main.asm文件是必要的。 如何正确地为我的系统编译程序?


nasm不识别此选项。 - Ilya Lavrenov
你正在运行哪个版本的nasm? - JasonD
-bash-3.2$ nasm -v NASM版本0.98.40(Apple Computer,Inc.构建11),编译于2012年8月4日。 - Ilya Lavrenov
1
那个版本的nasm已经非常过时了。请查看http://www.nasm.us/pub/nasm/releasebuilds/2.10/ - RageD
3个回答

18

我建议首先更新你的NASM

之后,尝试运行以下命令:

nasm -f macho64 main.asm -o main.o  && ld -e _main -macosx_version_min 10.8 -arch x86_64 main.o -lSystem

注意新命令在macho64上方加入了JasonD的建议,但还在ld命令中添加了-lSystem,以防止ld抛出以下错误:

ld: dynamic main executables must link with libSystem.dylib for architecture x86_64

段错误是代码执行中的问题。在jl指令之后,添加一个ret指令(因为您正在使用主函数)。请注意,如果您正在使用纯x86汇编语言,则需要使用int 0x80中的退出系统调用来退出(但不适用于此情况)。请记住,PC计数器需要知道在代码完成执行时继续执行的位置。 - RageD
ld -lSystem my.o -e _main -macosx_version_min 10.14 -o exit Result - > cannot execute binary file - Elshan

1
我注意到大多数示例展示独立的汇编程序,但是从C中调用汇编可能更为普遍。我创建了一个简单的C程序,使用了一个最小化的nasm汇编函数,如下所示:
extern unsigned cpuid(unsigned n);

/* ... */
        unsigned n = cpuid(1);

该组件的外观如下所示:

section .text
    global _cpuid

_cpuid:
    push rbp
    mov rbp, rsp
    mov rax, rdi
    cpuid
    mov rax, rcx
    leave
    ret

您可以在Makefile中看到整个内容,包括nasm CLI选项:

https://github.com/ecashin/low/tree/master/cpuid

它通过打印出一些特定于CPU的功能的可用性来执行某些轻微有用的操作。(但是,它在使用CPUID时没有检查其是否可用。如果CPU是英特尔并且比i486新,则可以使用。)
该示例在Mac OS X Snow Leopard上使用端口集合中的nasm进行测试。只需删除下划线前缀即可将其移植到Linux x86_64。

另外,正如这里的其他评论所说,我确实需要更新NASM才能使用“-fmacho64”。 - Ed Cashin

0

或许尝试静态链接?

ld -macosx_version_min 10.13 -e _main -static main.o

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接