MASMのセグメント+オフセットと物理アドレス値

このQ&Aのポイント
  • MASMではセグメント値+オフセット値を使ってアドレス値を指定します。
  • セグメント+オフセットは一対一の対応で、物理アドレス値を確定します。
  • しかし、物理アドレス値からはセグメント+オフセットを一意に特定することはできません。
回答を見る
  • ベストアンサー

MASMのセグメント+オフセットと物理アドレス値

素人、アセンブリ言語をかじっています。専門的な教育は受けてません。 MASMではアドレス値を指定するのに セグメント値+オフセット値でしていします。 セグメント値を確定しオフセット値が決まれば当然物理アドレス値はきまります。 セグメント+オフセット -> 物理アドレス値 :一対一に対応しています。 しかし 物理アドレス値 -> セグメント+オフセット :一対一の対応 不可 だと思います。 セグメント値がきまらなければ一対一の対応はしませんし、物理アドレスからセグメント値は決められないと思っています。 物理アドレスからセグメント値がきまるのでしょうか? この辺の対処はどうなっているのでしょうか? MASM -> 機械語  対応はできますが、 機械語->MASM どう対応するのか? をふくめて、どうなっているのでしょうか 宜しく願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • e3tatsu
  • ベストアンサー率51% (78/151)
回答No.3

><<機械語で与えられた情報(セグメントとオフセットの組み合わせ)>>は其のままということですね。 >CPU内のMMUが計算するということですね。 > >これでよろしいでしょうか? OKです。

その他の回答 (2)

  • e3tatsu
  • ベストアンサー率51% (78/151)
回答No.2

機械語になってもセグメントはセグメント、オフセットはオフセットのままですよ。 アセンブリ言語と機械語の命令は原則的に1対1で対応しているという大前提を忘れないでください。 機械語で与えられた情報(セグメントとオフセットの組み合わせ)から物理アドレスを計算するのはCPU内にあるMMUの仕事です。 ただCPUの動作モード(RealMode or ProtectedMode)によってセグメント機構の動きは大きく違いますのでそこは注意です。

PHYOPHYO
質問者

補足

何となく解りました。機械語に成った時、”セグメント値” + ”オフセット値” の ”セグメント値” と ”オフセット値” 情報が ”書き換えられて”  ”物理アドレス値” に書き換えてしまっていると考えてました。 <<機械語で与えられた情報(セグメントとオフセットの組み合わせ)>>は其のままということですね。 CPU内のMMUが計算するということですね。 これでよろしいでしょうか?

  • koujikuu
  • ベストアンサー率43% (428/992)
回答No.1

windows では無く MS-DOS での話ですが、セグメント値はプログラマが決めるのではなく MS-DOSが、EXEファイルをメモリにロードした時に決定されます (VRAM等固定アドレスは除く) その為EXEファイルにはセグメント値を書き換える為のリロケート情報を内部に持っています SYMDEB等でメモリに展開しないとプログラムを見ることはできません。

関連するQ&A

  • アセンブリ言語について。

    アセンブリ言語と機械語は一対一で対応しているので、実行ファイルがあれば逆アセンブルすると 完全に元のアセンブリコードが復元できるのでしょうか?教えていただけないでしょうか?すみません。

  • アセンブリ言語と機械語について。

    アセンブリ言語と機械語は一対一で対応しているので、実行ファイルがあれば逆アセンブルすると 完全に元のアセンブリコードが復元できるのでしょうか?教えていただけないでしょうか?すみません。教えていただけないでしょうか?すみません。どういった例が挙げられますか?

  • アドレス指定方式におけるトレードオフ

    アドレッシング方式の豊富さの観点から、プログラムの書きやすさと、プログラムの実行性能の間のトレードオフについて論ぜよ。 という問題です。 教えて頂きたいです。 アドレス指定方式は、実際には利用するCPUの種類ごとにどの方式が利用可能かが異なる。なお、アセンブリ言語、および、機械語の機能は、CPUの機能に直接対応しており、アドレス指定についてもCPUが持つ方式をそのまま持っている。これに対して高級言語は、より抽象的なレベルでプログラムを記述するため、物理アドレス、および、物理的なアドレス指定方式は直接意識しない。 なんとなくここらへんが絡んでるかなと思っておりますが全然検討がつきません。 宜しくお願いたします。

  • 8086のメモリ管理について。

    8086のメモリ管理について。 いつもお世話になっております。 小生、現在ポケコンZ-1GRでx86アセンブリを勉強中のアセンブリ初心者です。 今回質問させて頂きたいのは8086のメモリ管理についてです。 8086はメモリ管理にセグメントとオフセットという方法を使い、全部で2MBのメモリが使用できるのは、理解できました。 理解できないのは、物理メモリへの変換の際、(セグメントアドレス X 10H) + オフセットで物理メモリにアクセスできるという箇所です。 セグメントアドレス X 10Hで20bitのアドレス空間を操作できるのは分かるのですが、 問題はセグメントアドレス X 10Hがどこの箇所(例えばCPUの中)で行われているのでしょうか? MMUはもちろんないはずだと思います。 お忙しい中、大変申し訳ございませんが、先輩方ご教示宜しくお願い致します。

  • OSはどのようにして、CPUにメモリ上の物理アドレスを伝えるのか?

    一般的なシステムにおいて、プログラムを実行するには、コンパイラが再配置可能なオブジェクトファイルにして、そのオブジェクトファイルをローダがメモリ上にローディングして、CPUによって実行が行われると認識しています。 では、実際にCPUにより実行される時に、どのようにしてCPUは、ローディングされている物理アドレスを知ることが出来るのですか?一番初めにOSがどのようにCPUに先頭番地を伝えているのかが見当がつきません。例えば、486では、セグメントレジスタの値とオフセットアドレスを加算したアドレスを基にメモリとやり取りしていますが、OSがこのセグメントレジスタに先頭アドレスをどのように格納しているのかを教えてください。お願いします。

  • 最初のアセンブラ

    人間がハンドアセンブル際にアセンブリ言語と機械語の対応表を見比べて翻訳する作業を、コンピュータの黎明期に機械語で最初に作られたアセンブラはどのように行っていたのかということを教えて下さい。 プログラミング言語の歴史を考えてみると、(フォン・ノイマン型)コンピュータの黎明期では全てのプログラムは最初人間が直接真空管やディップスイッチのオン/オフを切り替えることで、機械語でプログラムを入力していたと思います。その後アセンブラが開発されたことで、人間はパンチカードやカセットテープなどを通してアセンブリ言語でプログラミングを行えるようになったと聞きました。 アセンブリ言語は機械語と1対1で結びついたもので、アセンブラはアセンブリ言語を機械語に翻訳するのだと言うことは分かります。しかし、パンチカードやカセットテープで入力したアセンブリ言語も、コンピュータにとっては根本的には0/1(スイッチのオン/オフ)という点では変わりはなく、最初のアセンブラはその0/1をどのようにして正しい機械語の0/1に変換することが出来たのでしょうか? 少し質問の意味が分かりにくいかもしれませんが、例えば MOV B, A //Bレジスタの内容をAレジスタに送る といったアセンブリ言語は、機械語では 01000000 に相当するかもしれません。しかしコンピュータがパンチカードを読み込んだ時点では 01010100 といった信号として入力されるとしたら、機械語で最初にアセンブラを作成した人はどのようにしてそれを適切な機械語(ここでは01000000)に翻訳出来たのでしょうか? 想像では最初に機械語で非常に超簡単なアセンブラの原型とも言えるプログラムを作って、それを元にした簡単なアセンブリ言語(の原型)でより高度なアセンブラを作る、といったことを繰り返していまのアセンブラが開発されていったと思いますが、では最初のアセンブラの原型とはメモリ上ではどのように実現されていたのか、ということが気になったので質問させていただきました。アセンブリ言語で実際にプログラムのイメージはこんな感じでは?ということを書いて下さっても構いません。 よろしくお願い致します。

  • アセンブリ言語と機械語のアドレス表現について

    下記、C 言語プログラムをアセンブリ言語に変換し、そして アセンブリ言語をアセンブルして機械語との関係を見たところ、 下記のようなアセンブル結果が得られました。 アセンブル結果についてお聞きしたいのですが、 BSS セグメント内の変数 data_one のアドレスは 0x8 バイト(0000000000000008)だが、 機械語としての表現はリトルエンディアンで逆順になって 08000000 となるということでしょうか? BSS セグメントが存在するオブジェクトファイルは機械語で書かれているので、 0000000000000008 という表現も機械語なのだろうかと思い混乱しています ■ C 言語プログラム #include <stdio.h> main() { static int data_one ; static int data_two ; static int data_three ; int counter ; data_one = 1000 ; for (counter=0 ; counter < 5 ; counter++) { data_two = data_one + 1 ; data_three = data_two + 2 ; data_one = data_one - 3 ; } printf("data one,two,three : %d,%d,%d \n",data_one,data_two,data_three) ; printf("logical address of data_one : 0x%x \n", &data_one); printf("logical address of data_two : 0x%x \n", &data_two); printf("logical address of data_three : 0x%x \n", &data_three); } ■アセンブル結果のリダイレクト 44 0046 A3080000 movl %eax, data_one.1931 44 00 (中略) DEFINED SYMBOLS sample_4_2.s:7 .bss:0000000000000008 data_one.1931 以上、お手数おかけしますがコメントいただけると嬉しいです。 よろしくお願いします

  • osのwindowsはアセンブリ言語でも作られてい

    osのwindowsはアセンブリ言語でも作られていると書いてあるんですが、 アセンブリ言語って機械語に近い低級言語ですよね? windowsを人間がコーディングするときにアセンブリ言語を打つんですか? 大変じゃないんでしょうか?

  • NASMかNASKの文法の本

    NASMかNASKのアセンブラを使っているのですが、MASMと構文が異なっている?せいか、エラーなりました。 MASMでは DW offset ADR_KOKO DW seg ADR_KOKO でOKだと思いますが、NASM/NASKではどうするのでしょうか? NASM,NASMの文法など詳しく載っている本などありますか?(洋書でも構いません。) DW 0 ; A---> オフセット DW 0 ; B---> セグメント ADR_KOKO: ;ここのオフセットとアドレス値をA,Bにセットしたい mov eax, 1  ... RET

  • 別々のGWを持つ、2つのセグメント間の通信

    2つのネットワークセグメントがあります。この2つのセグメントの通信を実現させたいです。 知識と経験不足なので教えて頂けるとたすかります。 ■環境■ 添付図の通りですが、 ・192.168.10.0/24  →  A社 ・192.168.20.0/24  →  B社 ※それぞれのサーバー/PCは全てWindows系。 ※それぞれが別々のゲートウェイを持ち、インターネットに接続可能。 ※ただしサーバーの保守の為だけの接続で、クライアントはインターネット接続されていない。 ※A,Bお互いのクライアントが通信出来てはいけない。 ※お互いのネットワークアドレスの変更は不可。 ※クライアントPCの設定変更も不可。 ※物理的に同じ部屋にあるので、配線の取り回しの心配はない。 ■質問■ 同一セグメントにそろえて、L2_VLANだと可能なのでしょうが、ネットワークアドレスを変更できないので ルーターかL3なのではと考えております。 ※AのクライアントはAのサーバ/クライアントとBのサーバーのみを見たい。 ※Bのクライアントも同様にBのサーバ/クライアントとAのサーバーのみを見たい。 この環境で上記内容を実現させようと思ったら、どのような機材でどのような設定にすればいいのでしょうか?