【发布时间】:2023-12-24 14:45:02
【问题描述】:
我正在学习汇编,当然我正在尝试经典的 0x10 BIOS 中断。我查看的资源显示使用lodsb 打印字符串,因此为了理解我试图模仿它的行为的操作码。这适用于lodsb,但不适用于我所拥有的。我做错了什么?:
【问题讨论】:
标签: assembly x86 nasm interrupt bios
我正在学习汇编,当然我正在尝试经典的 0x10 BIOS 中断。我查看的资源显示使用lodsb 打印字符串,因此为了理解我试图模仿它的行为的操作码。这适用于lodsb,但不适用于我所拥有的。我做错了什么?:
【问题讨论】:
标签: assembly x86 nasm interrupt bios
通常不是一个好主意:
在第一个注释中,我将在 int 10 之前将 ah 设置为 0eh。
Int 10h/0eh 要求将bh 和bl 分别设置为页码和前景色。我也会在 int 10 之前立即执行此操作,以确保为通话正确设置它们。
顺便说一句,您需要确保ds 段寄存器是正确的,例如:
push cs
pop ds
因为看起来您正在将字符串放入代码段中。但是,由于lodsb 版本显然有效,我想您已经了解了这一点。
而且,从(诚然褪色的)内存中,8086 有一个 inc si 指令可能会节省少量空间,但它不再那么重要了,但我是在每个字节都计数的时代被伪造的 :-)
【讨论】:
First lodsb 是一个命令,它告诉计算机获取代码中的一个字符并增加偏移量。偏移量由 [SI] 确定,这是一个可以轻松设置的寄存器。设置 SI 后,lodsb 获取 char 并将其加载到 al 中。从这一点开始阅读并确定要做什么。还有这样的问题here.
【讨论】: