实模式下的32位寄存器和解除引用

时间:2017-04-02 11:27:14

标签: assembly real-mode

我正在为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位寄存器?

1 个答案:

答案 0 :(得分:1)

x86 ISA支持多种寻址模式。有两组寻址模式,一组用于16位模式,另一组用于32位模式。

在32位模式下,您可以将索引寻址与任何寄存器和三部分SIB寻址结合使用。

在16位模式下,仅存在以下寻址模式(每个都具有可选位移):

BX + disp
BX + SI + disp
BX + DI + disp
BP + disp
BP + SI + disp
BP + DI + disp
SI + disp
DI + disp
disp

请注意cx如何作为索引寄存器使用。

解决此问题的方法是在16位模式下使用32位寻址模式。这是通过将ecx指定为索引寄存器来完成的。