Assembly 通过bios中断获取要打印的字符串
我正在学习汇编,当然,我正在试验经典的0x10BIOS中断。我看过的参考资料展示了如何使用Assembly 通过bios中断获取要打印的字符串,assembly,x86,nasm,interrupt,bios,Assembly,X86,Nasm,Interrupt,Bios,我正在学习汇编,当然,我正在试验经典的0x10BIOS中断。我看过的参考资料展示了如何使用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
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
开始:
mov啊,0Eh,;用于bios中断
mov si,文本_字符串;将源索引设置为文本字符串的开头
.重复:
;我试图模仿lodsb的行为,以了解其工作原理:
mov-al[si];将字符置于al寄存器中的si处
加si,1;增量源索引
cmp-al,0;如果字符为零(字符串末尾)
我做到了;结束执行
int 10h;bios中断以在屏幕上显示字符
jmp,重复
text_string db“你好,世界!”,0
完成:
ret
通常情况下,这样做不是一个好主意:
ah
设置为0eh
,紧跟在int10
之前
Int 10h/0eh
要求将bh
和bl
分别设置为页码和前景色。我还会在int10
之前立即这样做,以确保为调用正确设置它们
另一方面,您需要确保
ds
段寄存器正确,如下所示:
push cs
pop ds
因为它看起来像是将字符串放入代码段中。然而,由于lodsb
版本显然有效,我想您已经涵盖了这一点
而且,从(公认已褪色的)内存中,8086有一条
inc si
指令,它可能会节省少量空间,这并不重要,但我是在每个字节都计数的时候伪造的:-)首先lodsb是一个命令,它告诉计算机在代码中获取字符并增加偏移量。偏移量由[SI]确定,这是一个易于设置的寄存器。设置SI后,lodsb获取字符并将其放入al。从这一点开始,读取al并确定要执行的操作。还有一个问题是这样的