【发布时间】:2017-04-02 11:27:14
【问题描述】:
我正在为 MBR(实模式)编写一些程序集。我知道在实模式下你不能使用 32 位寄存器,只能使用 16 位寄存器。
我编写的这段代码依赖于 print_char 函数。
mov ecx, MSG
write:
mov al, [ecx]
cmp al, 0x0
je end_print
call print_char
inc cx
jmp write
end_print:
ret
MSG: db 'Hi!', 0xd, 0xa, 0x0
这段代码没有编译,原因如下:
error: invalid effective address
我用
nasm -f bin -o out src.s
当我将寄存器名称更改为 ecx 时,代码开始编译,而且令人惊讶的是,它可以工作。
为什么我的代码使用 32 位寄存器在实模式下工作,为什么使用 16 位寄存器不能?
【问题讨论】:
-
您可以在 32 位 cpu 上使用 32 位寄存器,无论是否为实模式。但是如果使用 16 位寻址,则必须使用有效模式,
[cx]不是一种。 -
为什么要投反对票??
-
我没有投反对票,但我猜他们觉得“它没有显示出任何研究努力”。您可以自己在 intel 手册中查找寻址模式,特别是 “地址大小覆盖前缀 (67H) 允许程序在 16 位和 32 位寻址之间切换。任何一个大小都可以是默认值;前缀选择非默认大小。"
-
我真的不知道要搜索什么。搜索无效的有效地址没有产生任何有用的信息。