我正在为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位寄存器?
答案 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
指定为索引寄存器来完成的。