14

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

; %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 文件。如何为我的系统正确编译程序?

4

3 回答 3

17

我建议首先更新您的NASM

之后,尝试运行:

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

请注意,新命令在上面添加了 JasonD 的建议 ( macho64),但还在命令中添加了-lSystemld阻止 ld 抛出以下错误:

ld: dynamic main executables must link with libSystem.dylib for architecture x86_64
于 2012-12-31T16:26:00.160 回答
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 是 Intel 并且比 i486 更新,那很好。)

该示例在 Mac OS X Snow Leopard 上使用 ports 集合中的 nasm 进行了测试。移除下划线前缀是移植到 Linux x86_64 所需的唯一更改。

于 2013-09-01T20:45:09.947 回答
0

也许尝试静态链接?

ld -macosx_version_min 10.13 -e _main -static main.o
于 2020-05-25T04:38:48.343 回答