4

我正在学习汇编,当然我正在尝试经典的 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
4

2 回答 2

5

这样做通常不是一个好主意:

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

在第一个注释上,我将ah在.0ehint 10

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


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

push cs
pop ds

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

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

于 2013-06-26T01:10:52.070 回答
0

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

于 2017-08-02T08:43:27.237 回答