如何使用nasm和gcc在linux下编译这个asm代码?

时间:2011-08-31 08:23:18

标签: linux gcc assembly x86 nasm

我现在正在阅读一本书中的以下源代码片段。所以我创建了一个asm文件并完全输入。然后使用nasm命令(nasm -f elf test.asm)然后尝试使用gccgcc 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下运行?

3 个答案:

答案 0 :(得分:1)

这是一个16位代码,它是为了创建纯二进制代码而不是可执行文件。如果没有大量修改,您无法在Linux等现代操作系统上运行它。顺便说一句,这是一个MS-DOS程序集,无论如何都不适用于Linux(使用int 21h是MS-DOS服务)。

如果你想学习装配,我建议你买一本更现代的书,或者设置一个虚拟机来学习你的书(虽然现在学习16位装配真的没用)。

答案 1 :(得分:1)

首先,代码包含仅在实模式下工作的中断(在int 21h中使用regs中的值),并且linux在保护模式下工作,你不能直接调用这些中断。

接下来,代码是16位代码,使其成为您需要的64位代码[BITS 64]

第三,你没有代码的入口点。要制作一个,你可以在C中编写一个main函数,然后在汇编代码中将起始标签作为函数调用。

看看这件事:PC Assembly Language by Paul A. Carter

答案 2 :(得分:1)

如果你想继续使用那本旧书来学习基础知识(在转向现代操作系统之前学习基础知识/旧方法没问题,你可以在DOSBox或FreeDOS VM中运行它)