1

我正在使用 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 值加载到al中。

为什么?

编辑:发现我不能使用 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 也可以使用,所以问题仍然存在。

4

2 回答 2

2

我认为您在问题中犯了不止一个错字:-) 首先,在 16 位模式下,[bp][bx][si][di] 都是有效的寻址模式。即使是旧的 8086 也可以使用 [bx] 作为有效地址。其中 [dx] 不能在 16 位模式下使用,afaik 它需要在 32 位模式下运行。与你的线一起

mov dx, msg

mov al, byte [bx]

我假设您实际上写了 'mov al, [dx]' 并且 nasm 正确地抱怨 [dx] 是无效地址。所以如果你的意思是,你发现你不能使用 [bx],你就错了——你发现你需要更加小心,不要把“d”拼错“b”。

于 2011-04-18T15:29:53.177 回答
1

你确定错误不在这条线上?

mov ds, data

也许你的意思是:

mov ds, ax
于 2011-04-17T03:30:03.010 回答