在DOS (Intel 8086)上的NASM:无效的有效地址



我正在使用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

相关内容

最新更新