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