私は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
は私がecx
にレジスタ名を変更すると、コードがコンパイルを開始し
nasm -f bin -o out src.s
を使用し、意外にも、働く。
32ビットレジスタを使用するコードがリアルモードで動作し、16ビットレジスタを使用しないのはなぜですか?
32ビットCPUは32ビットCPU、リアルモードで使用できます。しかし、16ビットアドレッシングを使用する場合、有効なモードを使用する必要があり、 '[cx]'は1ではありません。 – Jester
なぜdownvotes ?? – marmistrz
私はdownvoteをしなかったが、私の推測は彼らが感じている_ "それは研究努力を示していない_"。あなたはintelマニュアルでアドレッシングモードを調べることができました。特に、アドレスサイズオーバーライドプレフィックス(67H)は、プログラムが16ビットと32ビットのアドレッシングを切り替えることを可能にします。デフォルト以外のサイズを選択します。 "_ – Jester