如何使用NASM汇编16位代码,然后在Linux中进行调试,最后在DOSBox中生成可执行文件

6
我们被要求编写16位汇编代码并将其汇编以在DOSBox中运行。
我知道16位汇编代码与普通的x86汇编代码不同之处在于它使用“bits 16”和16位寄存器(ax、bx、cx等)。
我尝试搜索如何使用NASM for 16-bit code,但不幸的是我不理解它所说的内容。
我想知道的只是在NASM中使用什么参数来汇编16位汇编代码?(-bin还是-obj?),然后如果可能,在Linux中如何调试它。如果不可能,在DOSBox中如何调试?
因为我们得到的资源非常有限,难以理解,所以真的需要一些帮助。

它们还在一些新指令和寻址模式上有所不同。在32位和64位模式下,大多数寄存器可以成为通用寄存器。 - phuclv
你可能需要一个16位的工具集。我不知道是否有基于NASM的16位工具集。微软后来的16位工具集是32位程序,使用32位DOS扩展程序在16位DOS下运行,或者在32位系统上本地运行。我不知道*nix有什么可用的。 - rcgldr
2个回答

5

根据你想要做什么,使用nasm直接创建一个com文件是一个简单的选择。你不应该使用任何节(section),并指定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本身具有一个可选的内置调试器,虽然不是非常复杂,但可能已经足够满足你的需求。


谢谢!我会尝试在我的简单汇编代码中使用这个。虽然我不认为我会在更长的代码中使用它。 - MDuh
您不应再编写超过16位的DOS代码了 :) - Jester
好的,这是我的问题。为什么我不能使用节(sections)?nasm文档说,你可以使用 .text、.data和.bss。 - MDuh
你可以使用节(section)。它们不会进入单独的段(segment)。Nasm将data放在.text之后,将.bss放在其后,但它们都进入您选择的唯一段(segment)(由DOS选择)。结果与Jester显示的相同。 - Frank Kotler

1

在某个平台上创建程序(在这种情况下是DOS)的最佳方法是在该平台上工作。因此,请使用DOS IDE和DOS调试器,直接在DosBox中运行它们。

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

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

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


非常感谢提供简短易懂的版本。我会阅读所有内容,如果将来有更多问题,我会再次提问。 - MDuh
fasm for DOS 报告“没有可用的 32 位 dpmi 服务”。 - don bright

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接