【问题标题】:NASM on DOS (Intel 8086): invalid effective addressDOS 上的 NASM(Intel 8086):无效的有效地址
【发布时间】:2011-04-17 02:21:01
【问题描述】:

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

【问题讨论】:

  • 尝试 mov al, [bx] 或 mov al, ds:[bx] - 我很确定这是一种有效的寻址模式...您将 dx 指向您的消息,然后使用 bx,是是错字吗?

标签: linux assembly nasm x86-16 bochs


【解决方案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],你错了 - 你发现你需要更加小心,不要把“d”拼错“b”。

【讨论】:

  • 这应该教会我下次更好地检查我的例子:D。我在代码中写了bx,它确实抱怨无效的有效地址。
  • 我使用 nasm 来组装您提供的文件 - 有问题的行 'mov al, byte [bx]' 组装得很好。
【解决方案2】:

你确定错误不在这一行?

mov ds, data

也许你的意思是:

mov ds, ax

【讨论】:

  • 哦,我的错,是的,我的意思是 mov ds, ax (复制错误的代码:P)
猜你喜欢
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
相关资源
最近更新 更多