我正在使用 BIOS 中断实现一个简单的以 0 结尾的字符串打印功能
int 10h
。
程序如下:
dx
,这是我们的字符串开始的位置cx
[dx + cx]
处的字节。如果为 0,则返回,否则 mov
到 al
int 10h
cx
并跳回第 3 点问题是 nasm 只允许我使用
bx
作为索引寄存器。我相信这个限制的目的不是让某人的生活变得更加困难,所以这意味着我的实施有问题。这是什么,我怎样才能克服它?
在16位模式下你必须使用BX。例如。 看这里:
对于 16 位寻址,偏移值可以位于三个寄存器之一:BX、SI 或 DI
编写16位x86汇编时,只有以下寻址模式可用:
[bx]
[si]
[di]
[bp]
[bx + si]
[bx + di]
[bp + si]
[bp + di]
加上一个可选常量(以
bp
开头的常量使用 ss
作为默认段寄存器而不是 ds
,但在汇编中开始时我们暂时不会引入段寄存器)。
所以你的代码需要看起来像这样:
.loop:
push bx
mov bx, dx
add bx, cx
mov ah, ...
mov al, [bx]
pop bx
cmp al, 0
je .break
int 10h
inc cx
jmp .loop
.break:
但是我们可以通过使用 si 代替并完全省略计数器来做得更好:
push si ; SI is normally call preserved
mov si, dx
.loop:
mov al, [si]
cmp al, 0
je .break
int 10h
inc si
jmp .loop
.break:
pop si