繁体   English   中英

如何使用nasm和gcc在Linux下编译此asm代码?

[英]How to compile this asm code under linux with nasm and gcc?

我现在正在阅读的书中包含以下源代码片段。 因此,我创建了一个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下运行?

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

如果您想学习汇编语言,我建议您买一本更现代的书,或者设置一个可以在其中学习书籍的虚拟机(尽管如今学习16位汇编语言确实没有用)。

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

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

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

看看这件事: Paul A. Carter编写的PC汇编语言

如果您想继续使用那本旧书来学习基础知识(这很好,在转到现代OS之前学习基础知识/旧方法没什么错),则可以在DOSBox或FreeDOS VM中运行它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM