assembly 通过BIOS中断获取要打印的字符串

xt0899hw  于 2022-11-13  发布在  iOS
关注(0)|答案(2)|浏览(164)

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

a64a0gku1#

通常情况下,以下做法并不是一个好主意:
1.假设所有寄存器在中断调用(或任何调用,实际上)之间都被保留;或
1.没有为给定呼叫设置所有必需的寄存器。
在第一个音符上,我会将ah设置为0eh,紧挨在int 10h之前。
Int 10h/0eh要求将bhbl分别设置为页码和前景色。我也会在int 10h之前立即这样做,以确保它们在调用时设置正确。
顺便说一句,您 * 可能 * 需要确保ds段寄存器是正确的,例如:

push cs
pop ds

这是因为看起来你把字符串放到了你的 code 段中。但是,由于lodsb版本显然可以工作,我假设你已经涵盖了这一点(例如,如果这段代码是一个com文件而不是一个exe文件)。
而且,从(公认褪色的)内存,8086有一个inc si指令,可能会保存少量的空间,并不是说它的问题了,但我是伪造的时候,每个字节计数:-)

6ljaweal

6ljaweal2#

首先,lodsb是一个命令,它告诉计算机获取代码中的一个字符,并增加偏移量。偏移量由[SI]决定,这是一个很容易设置的寄存器。一旦设置了SI,lodsb就获取字符并将其装入al。从这一点上,它阅读al并确定要做什么。这里还有一个类似的问题。

相关问题