簡體   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