我试图编译和链接汇编我的第一个程序。 我尝试编译下面的代码:
; %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的。如何正确编译我的系统程序?
我会建议先更新您的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
),而且还增加了-lSystem
到ld
命令从抛以下错误停止LD:
ld: dynamic main executables must link with libSystem.dylib for architecture x86_64
我注意到,大多数的例子表明独立的汇编程序,但它可能是更常见的组件从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的唯一变化。