Assembly 如何使用NASM组装16位asm代码,然后在Linux中进行调试,然后在DOSBox中生成可执行文件

Assembly 如何使用NASM组装16位asm代码,然后在Linux中进行调试,然后在DOSBox中生成可执行文件,assembly,x86,gdb,nasm,dosbox,Assembly,X86,Gdb,Nasm,Dosbox,我们被要求编写16位汇编代码,并将其汇编到DOSBox中运行 我知道16位汇编代码与普通x86汇编代码的不同之处在于,它使用位16和16位寄存器(ax,bx,cx,…) 我试图搜索如何使用,不幸的是,我不明白它在说什么 我只想知道在NASM中使用什么参数来汇编16位汇编代码?(-bin或-obj?),然后如果可能,如何在Linux中调试它。如果不可能,如何在DOSBox中调试 我真的很想在这里得到一些帮助,因为我们只得到了很少的资源来理解这一点,所以我真的很困惑。为某些平台(本例中为DOS)创建

我们被要求编写16位汇编代码,并将其汇编到DOSBox中运行

我知道16位汇编代码与普通x86汇编代码的不同之处在于,它使用
位16
和16位寄存器(
ax
bx
cx
,…)

我试图搜索如何使用,不幸的是,我不明白它在说什么

我只想知道在NASM中使用什么参数来汇编16位汇编代码?(
-bin
-obj
?),然后如果可能,如何在Linux中调试它。如果不可能,如何在DOSBox中调试


我真的很想在这里得到一些帮助,因为我们只得到了很少的资源来理解这一点,所以我真的很困惑。

为某些平台(本例中为DOS)创建程序的最佳方法是在这个平台上工作。所以,使用DOS IDE和DOS调试器直接在DosBox中运行它们

我不知道NASM是否有DOS版本,但您可以使用

FASM的语法与NASM非常相似,如果需要,以后可以轻松地将其转换回NASM


FASM内置了DOS IDE,所以您不需要使用其他IDE。作为调试器,您可以使用DosBox中已安装的FreeDOS调试。

根据您的需要,使用
nasm
直接创建
com
文件是一个简单的选项。您不应使用任何节,并指定
org 100h
来补偿加载地址

例如:

ORG 100h

        lea dx, [msg]
        mov ah,9
        int 21h
        mov ax, 4c00h
        int 21h

msg: DB 'HELLO WORLD$'
组装为:
nasm-f bin-o test.com test.asm


Dosbox本身有一个可选的内置调试器,尽管它不是一个非常复杂的调试器。对于您的目的来说已经足够了。

它们在一些新的指令和寻址模式上也有所不同。在32位和64位模式下,大多数寄存器可以成为通用寄存器。您可能需要一个16位工具集。我不知道是否有基于NASM的16位工具集。Microsoft later 16位工具集是32位程序,使用32位dos extender在16位dos下运行,或在32位系统上本机运行。我不知道有什么可以买,谢谢!我将尝试将其用于我的简单asm代码。虽然我不认为我会在我的长代码上使用它。你不应该再写更长的16位dos代码了:)好的,这是我的问题。为什么我不能使用分区?您可以放置.text、.data和.bss,您可以使用节。它们不分为单独的部分。Nasm在
.text
.bss
之后移动
数据
,但它们都进入您唯一的一个段(由DOS选择)。结果和Jester节目一样。非常感谢你的tl;博士版本。我会把它们都读一遍,然后再问我将来是否还有更多的问题