我正在学习汇编,当然我正在试验经典的 0x10 bios 中断。我查看的资源显示使用 lodsb
打印一个字符串,以便理解我试图模仿它的行为的操作码。这适用于 lodsb
,但不是我所拥有的。我究竟做错了什么?:
开始:
mov ah, 0Eh ;用于bios中断
mov si, text_string ;将源索引设置为 text_string 的开头
。重复:
;我试图模仿 lodsb 的行为来了解它是如何工作的:
mov al, [si] ; 将 si 处的字符放入 al 寄存器
add si, 1 ;增加源索引
cmp al, 0 ;如果字符为零(字符串的结尾)
je done ;结束执行
int 10h ;bios 中断将字符放在屏幕上
jmp .repeat
text_string db 'Hello, World!', 0
完毕:
回复
最佳答案
这样做通常不是一个好主意:
在第一个音符上,我会设置
ah
至 0eh
紧接在 int 10
之前.Int 10h/0eh
需要 bh
和 bl
分别设置为页码和前景色。我也会在 int 10
之前立即这样做以确保它们为调用设置正确。顺便说一句,您需要确保
ds
段寄存器是正确的,类似于:push cs
pop ds
因为看起来您正在将字符串放入代码段中。但是,由于
lodsb
版本显然有效,我假设您已经了解了。而且,从(公认的褪色)内存来看,8086 有一个
inc si
可能会节省少量空间的指令,并不是那么重要,但我是在每个字节都计算在内的时候伪造的:-)
关于assembly - 通过bios中断获取要打印的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17309992/