我正在学习汇编,当然,我正在试验经典的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条答案
按热度按时间a64a0gku1#
通常情况下,以下做法并不是一个好主意:
1.假设所有寄存器在中断调用(或任何调用,实际上)之间都被保留;或
1.没有为给定呼叫设置所有必需的寄存器。
在第一个音符上,我会将
ah
设置为0eh
,紧挨在int 10h
之前。Int 10h/0eh
要求将bh
和bl
分别设置为页码和前景色。我也会在int 10h
之前立即这样做,以确保它们在调用时设置正确。顺便说一句,您 * 可能 * 需要确保
ds
段寄存器是正确的,例如:这是因为看起来你把字符串放到了你的 code 段中。但是,由于
lodsb
版本显然可以工作,我假设你已经涵盖了这一点(例如,如果这段代码是一个com
文件而不是一个exe
文件)。而且,从(公认褪色的)内存,8086有一个
inc si
指令,可能会保存少量的空间,并不是说它的问题了,但我是伪造的时候,每个字节计数:-)6ljaweal2#
首先,lodsb是一个命令,它告诉计算机获取代码中的一个字符,并增加偏移量。偏移量由[SI]决定,这是一个很容易设置的寄存器。一旦设置了SI,lodsb就获取字符并将其装入al。从这一点上,它阅读al并确定要做什么。这里还有一个类似的问题。