我'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 回答
首先 lodsb 是一个命令,它告诉计算机在代码中获取一个字符并增加偏移量 . 偏移由[SI]确定,这是一个可以轻松设置的寄存器 . 一旦SI被设置,lodsb获取char并将其编码为al . 从这一点开始阅读并确定要做什么 . 还有一个像这样的问题here.
通常不是一个好主意:
假设所有寄存器都在中断调用(或任何调用)中保留;要么
未设置给定呼叫的所有必需寄存器 .
在第一个注释中,我会在
int 10
之前立即将ah
设置为0eh
.Int 10h/0eh
要求bh
和bl
分别设置为页码和前景色 . 我也会在int 10
之前立即这样做,以确保它们为呼叫设置正确 .顺便说一句,您需要确保
ds
段寄存器是正确的,例如:因为看起来你正在将字符串放入代码段 . 但是,由于
lodsb
版本显然有效,我认为你已经覆盖了它 .而且,从(不可否认的褪色)内存,8086有一个
inc si
指令,可能会节省少量空间,而不是那么重要,但我是在每个字节计数的时间内伪造的:-)