我正在使用Bochs为DOS编写代码。我正在使用 NASM 来编译程序 让我们假设我有以下代码:
[BITS 16]
SEGMENT code
..start:
mov ax, data
mov ds, ax
mov bx, msg
mov al, byte [bx]
int 21h
SEGMENT data
msg DB "teststring", 00h
为什么nasm会抱怨:
mov al, byte [bx]
无效的有效地址
如果不是使用 bx ,而是使用 si 注册表,程序会按照假设编译工作,加载 t 的ascii值的人
为什么?
编辑:发现我不能使用BX进行索引 如果我想加载数据段的确定部分中指向的内容,您可以执行以下操作:
mov ax, data
mov ds, ax
mov si, msg
mov al, byte [si] ; Loading first char
inc si
mov al, byte [si] ; Loading second char
如果我想让 si 指向字符串的开头,我可以使用BX作为偏移:
mov al, byte [si + bx]
甚至
mov al, byte [si + n] ; where n is an integer value
但据我了解,也可以使用bx,所以问题仍然存在。
答案 0 :(得分:1)
你确定错误不在这一行吗?
mov ds, data
也许你的意思是:
mov ds, ax
答案 1 :(得分:1)
我认为你在问题中犯了多个拼写错误:-)首先,在16位模式下[bp] [bx] [si] [di]都是有效的寻址模式。即使是旧的8086也可以使用[bx]作为有效地址。 如果[dx]不能在16位模式下使用,则afaik需要以32位模式运行。连同你的线
mov dx, msg
前述
mov al, byte [bx]
我假设你实际上写了'mov al,[dx]'并且nasm正在抱怨[dx]作为无效地址。所以,如果你的意思是,你发现你不能使用[bx],你错了 - 你发现你需要更加小心,不要拼错“b”代表“d”。