通过bios中断获取字符串

时间:2013-06-26 01:03:41

标签: assembly x86 nasm interrupt bios

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

start:
    mov ah, 0Eh ;for bios interrupt
    mov si, text_string ;set source index to begining of text_string

.repeat:
    ;I'm trying to emulate the behavior of lodsb to learn how it works:
    mov al, [si] ;put character at si in al register
    add si, 1 ;increment source index

    cmp al, 0 ;if the character is a zero (end of the string)
    je done ;end execution

    int 10h ;bios interrupt to put character on screen
    jmp .repeat

    text_string db 'Hello, World!', 0

done:
    ret

2 个答案:

答案 0 :(得分:5)

通常不是一个好主意:

  1. 假设所有寄存器都在中断调用(或任何调用)中保留;或
  2. 未设置给定呼叫的所有必需寄存器。
  3. 在第一个注释中,我会在ah之前立即将0eh设置为int 10

    Int 10h/0eh要求bhbl分别设置为页码和前景色。我也会在int 10之前立即这样做,以确保为呼叫设置正确。


    顺便说一句,您需要确保ds段注册是正确的,例如:

    push cs
    pop ds
    

    因为看起来你正在将字符串放入代码段。但是,由于lodsb版本显然有效,我认为你已经覆盖了它。

    而且,从(确实已褪色)内存中,8086有一条inc si指令,可以节省少量空间,而不是那么重要,但我是在每个字节计数的时间内伪造的: - )

答案 1 :(得分:0)

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