【发布时间】: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