我正在爲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