我现在正在阅读一本书中的以下源代码片段。所以我创建了一个asm文件并完全输入。然后使用nasm命令(nasm -f elf test.asm
)然后尝试使用gcc
(gcc test.o -o test
)编译成可执行文件,然后我收到以下错误。
错误:
ld:警告:忽略文件test.o,文件是为不支持的文件格式构建的,而不是链接的体系结构(x86_64)
源代码:
[BITS 16]
[SECTION .text]
START:
mov dx, eatmsg
mov ah, 9
int 21H
mov ax, 04C00H
int 21H
[SECTION .data]
eatmsg db "Eat at Joe's!", 13, 10, "$"
我猜源代码与当前版本的CPU不兼容(这本书很老......)。
如何修复此源代码以在x86_64 CPU下运行?
答案 0 :(得分:1)
这是一个16位代码,它是为了创建纯二进制代码而不是可执行文件。如果没有大量修改,您无法在Linux等现代操作系统上运行它。顺便说一句,这是一个MS-DOS程序集,无论如何都不适用于Linux(使用int 21h是MS-DOS服务)。
如果你想学习装配,我建议你买一本更现代的书,或者设置一个虚拟机来学习你的书(虽然现在学习16位装配真的没用)。
答案 1 :(得分:1)
首先,代码包含仅在实模式下工作的中断(在int 21h
中使用regs中的值),并且linux在保护模式下工作,你不能直接调用这些中断。
接下来,代码是16位代码,使其成为您需要的64位代码[BITS 64]
第三,你没有代码的入口点。要制作一个,你可以在C中编写一个main函数,然后在汇编代码中将起始标签作为函数调用。
答案 2 :(得分:1)
如果你想继续使用那本旧书来学习基础知识(在转向现代操作系统之前学习基础知识/旧方法没问题,你可以在DOSBox或FreeDOS VM中运行它)