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

时间:2011-04-17 02:21:02

标签: linux assembly nasm x86-16 bochs

我正在使用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,所以问题仍然存在。

2 个答案:

答案 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”。