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としてしまうと まったく別のところを指してしまう気がするのですが・・・ どっから認識が曲がっているのでしょうか? 分からないのでお願いします。
> mov ax,[di + 16] の部分がよくわかりません。
質問と回答に影響がある訳ではありませんが、
mov eax, [di + 16] です。(転記ミス)
すみません
あとで訂正しておきます
ちなみに ES などのセグメントレジスタは、(例え x64 な CPU でも)16bit しかありません。
80386 以降のプロテクトモードでもセグメントレジスタは「セグメントディスクリプタテーブルのインデックス」を示しているので、16bit で十分であるため拡張していないのです。(セグメントレジスタ自体の数が足りないので増やしてはいますが)
ありがとうございます。
32bitCPUだけならず64bitでも
セグメントレジスタは16bitなんですね。
回答1件
あなたの回答
tips
プレビュー