2017-04-02 5 views
-2

私は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ビットレジスタを使用しないのはなぜですか?

+2

32ビットCPUは32ビットCPU、リアルモードで使用できます。しかし、16ビットアドレッシングを使用する場合、有効なモードを使用する必要があり、 '[cx]'は1ではありません。 – Jester

+0

なぜdownvotes ?? – marmistrz

+0

私はdownvoteをしなかったが、私の推測は彼らが感じている_ "それは研究努力を示していない_"。あなたはintelマニュアルでアドレッシングモードを調べることができました。特に、アドレスサイズオーバーライドプレフィックス(67H)は、プログラムが16ビットと32ビットのアドレッシングを切り替えることを可能にします。デフォルト以外のサイズを選択します。 "_ – Jester

答えて

1

x86 ISAは、いくつかのアドレッシングモードをサポートしています。アドレッシングモードには、16ビットモード用と32ビットモード用の2種類があります。

32ビットモードでは、任意のレジスタと3部構成の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を指定することによって行われます。

+0

なぜ16ビットモードで32ビットアドレッシングを使用できますか?プロセッサが余分な16ビットの制約をそれ自身に加えると、それは許されません。 – marmistrz

+1

これを限定する理由はありません。下位互換性があり、さらに多くのオプションを提供します。同様に、32ビットモードでは16ビットアドレッシングを、64ビットモードでは32ビットアドレッシングを使用することができます(ただし、通常は最後のアドレッシングだけが有効です)。 – Jester

+1

@marmistrz基本的に、32ビットモードは、16ビットプログラムが必要に応じて32ビット命令を使用できるように設計されています。これは、データと32ビットモードへのアドレッシングとを切り替える2つの接頭語66と67を介して行われる。 32ビットモードでは、これらのプレフィックスの意味は単に逆になります。 – fuz

関連する問題