我正在为MBR(实模式)编写一些程序集。我知道在实模式下,你不能使用32位寄存器,只能使用16位寄存器。在实模式和解引用中的32位寄存器
我写了这个代码,它依赖于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]'不是一个。 – Jester
为什么降价? – marmistrz
我没有倒下,但我的猜测是他们觉得“它没有显示任何研究成果”。您可以自己查看intel手册中的寻址模式,特别是_“地址大小覆盖前缀(67H)允许程序在16位和32位寻址之间切换。任何一种大小都可以是默认值;前缀选择非默认大小。“_ – Jester