質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

Q&A

解決済

1回答

1934閲覧

INT15によるメモリ情報取得に関して アセンブリ言語

kazuyakazuya

総合スコア193

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

0グッド

2クリップ

投稿2020/01/30 11:42

編集2020/01/31 07:22

INT 15によるメモリ情報取得をやっているのですがそれについて分からない点があるのでお願いします。

イメージ説明イメージ説明イメージ説明イメージ説明イメージ説明
リンク内容

mov eax,[di + 16]

の部分がよくわかりません。
INT 15 eax = E820H を行うことによりメモリマップの情報をES:DIで表すアドレスの場所に
保存する・・・ということをやっているはずです。
Int 15/AX=E820h 返り値

まず、diレジスタには何が入っているのか?

mov di,.b0

という命令がありました。.b0はラベルなのでどこかに定義されているだろうと探したのですが
定義されていませんでした。(見落としているだけ?)

とりあえず、格納するアドレスの下位がdiに入っている。(リアルモードで実行する だから上位のESは16bit余計なので使わない たぶん)

で、そこのアドレスには下記の情報が格納されるそうです。
リンク内容

00h base address (低位ビット) 08h レングス(byte) 10h メモリマップタイプ (高位ビット)

よって、よってDIが示すアドレスには・・・
(リトルエンディアンだから高位ビットが下位アドレスに入る。)

---DI---(アドレス下位) メモリマップタイプ 6bit      レングス(byte) 2bit      base address 8bit (アドレス高位) ``` なので、di + 16としてしまうと まったく別のところを指してしまう気がするのですが・・・ どっから認識が曲がっているのでしょうか? 分からないのでお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/01/31 00:28

> mov ax,[di + 16] の部分がよくわかりません。 質問と回答に影響がある訳ではありませんが、 mov eax, [di + 16] です。(転記ミス)
kazuyakazuya

2020/01/31 03:40

すみません あとで訂正しておきます
tacsheaven

2020/01/31 08:22

ちなみに ES などのセグメントレジスタは、(例え x64 な CPU でも)16bit しかありません。 80386 以降のプロテクトモードでもセグメントレジスタは「セグメントディスクリプタテーブルのインデックス」を示しているので、16bit で十分であるため拡張していないのです。(セグメントレジスタ自体の数が足りないので増やしてはいますが)
kazuyakazuya

2020/01/31 11:46

ありがとうございます。 32bitCPUだけならず64bitでも セグメントレジスタは16bitなんですね。
guest

回答1

0

ベストアンサー

10h メモリマップタイプ (高位ビット)

10hは10新表記では、16でしょう。
ということで、

mov ax,[di + 16]

というのは、type of address rangeの低位側をaxに、ですな


00h QWORD base address

08h QWORD length in bytes
10h DWORD type of address range (see #00581)

オフセット0からの8バイト(QWORD)はbase address
オフセット8からの8バイト(QWORD)はlength in bytes
オフセット16からの4バイト(DWORD)はtype of address range

投稿2020/01/30 14:12

編集2020/01/30 14:17
y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuyakazuya

2020/01/30 22:23

すみません。 誤解がありました。渡されるバッファは16bit ではなく20bitですね 00h base address 8 08h レングス(byte)8 10h メモリマップタイプ 4 ビッグエンディアンなら確かにこうなりますが x86系はリトルなので 下のように反対になってしまうと思うのですが。。。 (アドレス下位) メモリマップタイプ 4bit      レングス(byte) 8bit      base address 8bit (アドレス高位)
y_waiwai

2020/01/31 00:12

ビット、ではなく、バイトですぜ
y_waiwai

2020/01/31 00:17

メモリ配置 <base address+0> ← [di+0] <base address+1> <base address+2> <base address+3> <base address+4> <base address+5> <base address+6> <base address+7> <length in bytes+0> ← [di+8] <length in bytes+1> <length in bytes+2> <length in bytes+3> <length in bytes+4> <length in bytes+5> <length in bytes+6> <length in bytes+7> <type of address range+0> ← [di+16] <type of address range+1> <type of address range+2> <type of address range+3>
kazuyakazuya

2020/01/31 03:43

すみません バイトでした。 ビッグエンディアンなら <base address+0> ← [di+0] <base address+1> <base address+2> <base address+3> <base address+4> <base address+5> <base address+6> <base address+7> <length in bytes+0> ← [di+8] <length in bytes+1> <length in bytes+2> <length in bytes+3> <length in bytes+4> <length in bytes+5> <length in bytes+6> <length in bytes+7> <type of address range+0> ← [di+16] <type of address range+1> <type of address range+2> <type of address range+3> こうなるかもしれませんが リトルエンディアンはこの逆になってしまうと思うのですが。。。 これってビッグエンディアンを前提としたプログラムなのでしょうか?
y_waiwai

2020/01/31 03:55

うーん、根本的になんか勘違いしてますね。エンディアンはどういうことかを調べてみよう ビッグだろーがリトルだろーが --- オフセット0からの8バイト(QWORD)はbase address オフセット8からの8バイト(QWORD)はlength in bytes オフセット16からの4バイト(DWORD)はtype of address range --- の並びは変わりません
kazuyakazuya

2020/01/31 04:09

これらのデータがメモリに配置されるさいに エンディアンにより 順番が変わってくるという認識だったのですが そこから違いますか?
y_waiwai

2020/01/31 04:12

そこから違います base addressの8バイトを並べるのに順番が変わるだけ、です #length in bytesとtype of address range もおなじ
kazuyakazuya

2020/01/31 07:27 編集

なんだか根本から認識が間違っていますね・・・。 ー低位バイトー base address 0 base address 1 base address 2 ・・・ ー高位バイトー みたいに存在していたら、リトルエンディアンで <base address 7> ← [di+0] <base address 6> <base address 5> <base address 4> という感じでしょうか?
y_waiwai

2020/01/31 08:20

0x12233445 という32ビット数値をメモリに格納するとき <0x45> <0x34> <0x23> <0x12> と格納されるのがリトル <0x12> <0x23> <0x34> <0x45> と格納されるのがビッグエンディアン
kazuyakazuya

2020/01/31 08:45

baseaddressの 低位ビットがある方のバイトから 配置されていくんですね。
kazuyakazuya

2020/02/01 03:32

01h memory, available to OS 02h reserved, not available (system ROM, memory-mapped等) 03h ACPI Reclaim Memory 04h ACPI NVS Memory は1バイトだから順序は不変 baseaddress とレングスは複数のバイトで構成されているので ビッグとリトルで順序が変わってくる。 そこは分かったのですが、base_addressのデータそのものは データ領域・スタック領域のどちらかに置くかで データ領域なら下位アドレス→上位アドレスに積まれていくから -下位- base_address レングス memory, available to OS reserved, not available ACPI Reclaim Memory ACPI NVS Memory -上位- リトルかビッグかはbase_address レングスなど複数バイトで構成されているデータの バイトの積まれ方が変わってくる。 スタックは上位→下位なので データと反対に積まれていく ー低位ー レングス base_address ー上位ー という感じですか?
y_waiwai

2020/02/01 03:41

エンディアンってのはCPUの都合によるものなんで考えんでよろしい。 間違ってる上に難しく考えすぎ。 エンディアンは考えなくてよろしい
kazuyakazuya

2020/02/01 03:49

エンディアンと言われると mov ax,0x0A0B このaxに入れられるバイト順が変わってくる 見たいのをイメージしていましたが もうそこから違いましたか? 今までこれを前提に考えていたのですが。。。
y_waiwai

2020/02/01 04:05

ちがいますw バイト単位のメモリに格納/読み出すときにどういう順番なのかってだけのはなし。 処理に影響するもんではないです
kazuyakazuya

2020/02/01 04:08

今回もとんでもない勘違いを引き起こしていました。 調べなおします・・・。
kazuyakazuya

2020/02/01 05:38

いつも通り、根っこから勘違いしていて理解が進まないのだと思うのですが・・・ 上位バイトのデータから下位アドレスへ格納するのがビッグエンディアン 下位バイトのデータから上位アドレスへ格納するのがリトルエンディアン そのメモリっていうのはデータ領域だろうがスタック領域だろうが 同じことが言えるのですか?
y_waiwai

2020/02/01 12:12

そういう区別はありません。 区別する理由もないし まえからいってることですが、実機を前にしてやってみましょうよ。 机上で、アタマの中でどーこーやってても何も進みませんぜ
kazuyakazuya

2020/02/02 10:03

たぶん 理解できました。 少なくてもx86なら最初の構造体要素から取り出されて積まれていく。 高位からか低位からかは データ・コード スタックで違う。 エンディアンはその要素を構成しているバイトの入れ方の問題。 そもそもなのですがINT 15 E820によって手に入れられる マップ情報とは一体なんですか? base address・・・手に入れた情報の対象メモリのベースアドレス レングス(byte)・・・その対象メモリの範囲 メモリマップタイプ・・・? このメモリマップタイプは以下のような構造になっているみたいですが 01h memory, available to OS 02h reserved, not available (system ROM, memory-mapped等) 03h ACPI Reclaim Memory 04h ACPI NVS Memory 結局、INT 15 E820をすることで何が分かるのでしょうか?
y_waiwai

2020/02/02 10:38

その参考サイトを読みましょう。 メモリマップがでてくると書いてあるんだからそういうことなんでしょう そもそも古いBIOSの動作なんですから、イマサラ詳細がわかったところで使いみちもないし、実行できる環境もないということでいいんじゃないでしょうか。
kazuyakazuya

2020/02/02 13:07

そうですね。ずっとこれにこだわって前に進まないのはよろしくないので 一旦飛ばしちゃいます。(笑) ただ、ACPIってシャットダウンの処理に必要なんじゃ。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問