【问题标题】:Getting a string to print via bios interrupt通过 bios 中断获取要打印的字符串
【发布时间】:2023-12-24 14:45:02
【问题描述】:

我正在学习汇编,当然我正在尝试经典的 0x10 BIOS 中断。我查看的资源显示使用lodsb 打印字符串,因此为了理解我试图模仿它的行为的操作码。这适用于lodsb,但不适用于我所拥有的。我做错了什么?:

开始: mov ah, 0Eh ;用于bios中断 mov si, text_string ; 将源索引设置为 text_string 的开头 。重复: ;我试图模仿 lodsb 的行为来了解它是如何工作的: mov al, [si] ; 将 si 处的字符放入 al 寄存器 add si, 1 ;增加源索引 cmp al, 0 ;如果字符为零(字符串结尾) je done ;结束执行 int 10h ;bios 中断将字符显示在屏幕上 jmp .重复 text_string db '你好,世界!', 0 完毕: ret

【问题讨论】:

    标签: assembly x86 nasm interrupt bios


    【解决方案1】:

    通常不是一个好主意:

    1. 假设所有寄存器都在中断调用(或任何调用,实际上)之间保留;或
    2. 没有为给定调用设置所有必需的寄存器。

    在第一个注释中,我将在 int 10 之前将 ah 设置为 0eh

    Int 10h/0eh 要求将bhbl 分别设置为页码和前景色。我也会在 int 10 之前立即执行此操作,以确保为通话正确设置它们。


    顺便说一句,您需要确保ds 段寄存器是正确的,例如:

    push cs
    pop ds
    

    因为看起来您正在将字符串放入代码段中。但是,由于lodsb 版本显然有效,我想您已经了解了这一点。

    而且,从(诚然褪色的)内存中,8086 有一个 inc si 指令可能会节省少量空间,但它不再那么重要了,但我是在每个字节都计数的时代被伪造的 :-)

    【讨论】:

      【解决方案2】:

      First lodsb 是一个命令,它告诉计算机获取代码中的一个字符并增加偏移量。偏移量由 [SI] 确定,这是一个可以轻松设置的寄存器。设置 SI 后,lodsb 获取 char 并将其加载到 al 中。从这一点开始阅读并确定要做什么。还有这样的问题here.

      【讨论】:

        最近更新 更多