首页 文章

通过bios中断获取字符串

提问于
浏览
3

我'm learning assembly and of course I'm尝试经典的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

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

  • 5

    通常不是一个好主意:

    • 假设所有寄存器都在中断调用(或任何调用)中保留;要么

    • 未设置给定呼叫的所有必需寄存器 .

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

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


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

    push cs
    pop ds
    

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

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

相关问题