我正在使用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注册表,程序将按预期编译并工作,在al中加载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也可以使用,所以问题仍然存在
我想你在你的问题中犯了不止一个错字:-)首先,在16位模式下[bp][bx][si][di]都是有效的寻址模式。即使是旧的8086也可以使用[bx]作为有效地址。因为[dx]不能在16位模式下使用,我想它需要在32位模式下运行。连同你的
mov dx, msg
前mov al, byte [bx]
我假设你实际上写的是'mov, [dx]', nasm正确地抱怨[dx]是无效地址。所以,如果你的意思是,你发现你不能用[bx],你错了——你发现你需要更加小心,不要把"b"拼写成"d"。
你确定错误不在这一行吗?
mov ds, data
也许你的意思是:
mov ds, ax