如何编译使用MacOSX上NASM(How to compile using nasm on Mac

2019-08-05 04:20发布

我试图编译和链接汇编我的第一个程序。 我尝试编译下面的代码:

; %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

我认为它需要编译main.asm中文件x86_64的。如何正确编译我的系统程序?

Answer 1:

我会建议先更新您的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


Answer 2:

我注意到,大多数的例子表明独立的汇编程序,但它可能是更常见的组件从C.叫我创建了一个使用最小NASM组装的功能这样一个简单的C程序:

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雪豹测试从端口收集NASM。 删除下划线前缀是必要的移植到Linux x86_64的唯一变化。



文章来源: How to compile using nasm on MacOSX
标签: assembly nasm