10

現在、趣味で x86 アセンブリを学んでいる最中です。マイクロコントローラーのプログラミングが大好きなので、アセンブリに精通しています。

現在、私はこの質問への答えを高低で検索してきましたが、それを見つけることができないようです.DSレジスタは、私のプログラムのグローバルデータを指しているはずですが、私は知りません.それがどのように機能するかを正確に知っています。私は NASM を使用しています。ほとんどの単純なプログラムでは、次のように表示されます。

[組織 0x7C00]
[ビット 16]  

主要:
移動斧、0x0000
ムーブDS、斧
移動、[メッセージ]  
移動ああ、0x0E  
mov bx, 0x0007  
整数 0x10    
ジャンプ $  

メッセージ データベース 'X'

倍 510-($-$$) デシベル 0  
dw 0xAA55

これは (太字のコードを省略しても) 完全に機能しますが、どうすればよいでしょうか? CPU は 0x0000 から始まるグローバル変数を自動的にロードしますか? それとも、私が見逃している本質的なものがありますか?

4

1 に答える 1

19

コンピュータがリアルモード(BIOSがブートローダーを実行するときのCPUのモード)の場合、CPUがアドレスを計算するために使用する方法は非常に簡単です。セグメントレジスタ値に16を掛けます(ビットを4桁左にシフトします)。次に、オフセットを追加します。

たとえば、「mov ax、[0x1234]」のような命令では、CPUは有効なアドレスとして「DS * 0x10 + 0x1234」を使用します(この場合、最初の項はゼロに解決されます)。 [BP + 0x32]」の場合、CPUは「SS * 0x10 + BP+0x32」を使用します。CPUは別のセグメントレジスタ(スタックセグメント)を使用していることに注意してください。これは、BPレジスタが使用されている場合、CPUはデフォルトでスタックにアクセスしないと想定しているためです(ただし、[DS :BP + 0x32])。

私が説明した内容はさらに少なく、http ://wiki.osdev.org/Real_Modeやhttp://www.internals.com/articles/protmode/realmode.htmなど多くの場所で見つけることができます。

ところで、「msg」は多かれ少なかれ0x7C11アドレスに配置する必要があります。

于 2011-02-05T01:16:29.703 に答える