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

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

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

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

Q&A

2回答

1836閲覧

lgdt命令で行ったgdt構造体の値をしっかりと認識しているか確かめたい

aihou

総合スコア0

アセンブリ言語

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

0グッド

0クリップ

投稿2021/06/04 15:43

編集2021/06/06 20:26

したいこと

lgdtの命令の走らせてcpu側のgdt関連の設定をデバックしたい。しかし、私には分からないためやり方が知らない
c言語いうととあるそれぞれ構造体の値をprinfして出力するイメージ

該当のソースコード

bits 16 org 0x7e00 jmp main main: cli mov ax, 0 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax call gdt ; プロセッサ初期化と設定 gdt: bits 32 lgdt [gdt_setup];https://wiki.osdev.org/GDT_Tutorial gdt_setup: db gdt_end - gdt_setup dw gdt_null gdt_null: dq 0 gdt_code: dw 0xffff; limit dw 0; base mid と base用 db 0x9a; 多分アクセス type=0x9A db 11001111b;フラグ1 db 10011010b;フラグ2 db 0 gdt_date: dw 0xffff dw 0 db 0x92;type=0x92 db 11001111b db 10011010b db 0 gdt_end: ret ;ここにcpu側のgdt設定の値をデバックを行いたいコードを組み込む hlt times 510-($-$$) db 0 dw 0AA55h

試したこと

少しduckduckgoで調べたが特殊なのか分からないけどそいう関連ポイのは出てこない

補足情報(FW/ツールのバージョンなど)

アセンプリコンパイル = NASM version 2.15.05 compiled on Aug 28 2020
仮想マシン = visual box

ここにより詳細な情報を記載してください。

intelの仕様書のgdt関する情報をdeeplで翻訳させたが、ほんとんどここからここまでは自由なことを述べてたのでインテルに中指立てたくなった(*感想である)

私が参考したもの
wiki.osdev.org/GDT_Tutorialとhttp://softwaretechnique.web.fc2.com/OS_Development/kernel_loader2.html

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

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

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

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

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

ikadzuchi

2021/06/04 21:43

あなたの書く文章の意味が私には理解できません。 あなたは日本語がネイティブではないですか? その場合、あなたの母語で書いた方が良いでしょう。
aihou

2021/06/05 09:01 編集

母国語が日本語何ですが...そのような場合は?まぁ不可能登校生だから構文おかしくなるから
ikadzuchi

2021/06/06 11:22

日本語が母語でそれだとすると厳しいですね…。 よく文章を読み、書く練習をするくらいの通り一遍のアドバイスしかできません。
aihou

2021/06/08 16:59

そいう機会ないので...
guest

回答2

0

PleiadesなんかでC言語のデバッグ環境を整えれば、アセンブラコードでもデバッグできるようになります。
それで動作を確認してみては

投稿2021/06/04 22:46

y_waiwai

総合スコア88042

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

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

aihou

2021/06/05 17:11

いやlgdt命令が走った後cpuのgdt構造体の設定を確認したいだけ
guest

0

仮想マシン = visual box

がVirtualBoxの事ならば
VirtualBox内蔵デバッガを用いるとよいと思います。

なお、当該コードの場合はアセンブリ言語の
「書いたものがほぼほぼその順序のまま機械語として出力される」という基本が理解されていないように思います。

call gdt gdt: bits 32 lgdt [gdt_setup];https://wiki.osdev.org/GDT_Tutorial

は、そのまま機械語になった結果lgdtを2回実行しようとしますし

lgdt [gdt_setup];https://wiki.osdev.org/GDT_Tutorial gdt_setup: db gdt_end - gdt_setup

lgdt命令の後にgdt_end - gdt_setup=(多分)0x25を命令として実行しようとするはずです

一度、ndisasm等で逆アセンブルしてみるとよいでしょう。

投稿2021/06/04 17:20

asm

総合スコア15149

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

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

aihou

2021/06/04 19:02

lgdt の二回呼び出される原因って0000001A 1E push ds 0000001B 7E00 jng 0x1d pushされてどっかジャンプされているように見える しかしなぜですか?逆アセンブルされるまえのアセンブルファイルはそのような命令を書いた覚えがないのにそのような命令をコンパイルされて吐き出されるのですか?
asm

2021/06/04 22:45

かんたんのために call gdt gtd: lgdt ret と、しましょう。 call gdtでlgdtの行に飛びます。 retで再度lgdtの行に戻ります。
aihou

2021/06/05 08:51

なるほどです 私は高級言語の癖が出ているね
aihou

2021/06/06 14:48

大体こんな感じですかな bits 16 org 0x7e00 jmp main main: cli mov ax, 0 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax call gdt jmp [diskette_initialisation] ; プロセッサ初期化と設定 gdt: bits 32; 32bit gdt lgdt [gdt_setup];https://wiki.osdev.org/GDT_Tutorial gdt_setup: gdt_null: dq 0 gdt_code: dw 0xffff; limit dw 0; base mid と base用 db 0x9a; 多分アクセス type=0x9A db 11001111b;フラグ1 db 10011010b;フラグ2 db 0 gdt_date: dw 0xffff dw 0 db 0x92;type=0x92 db 11001111b db 10011010b db 0 gdt_end: ret bits 16 diskette_error: mov ah, 0x0e mov al, 'e' int 0x10 ret diskette_initialisation: mov ah, 0x00 mov dl, 0x00 int 0x13 jc diskette_error jmp diskette_read diskette_read: mov ah, 0x0e mov al, '2' int 0x10 hlt times 510-($-$$) db 0 dw 0AA55h
asm

2021/06/06 14:52

よくはなりましたがlgdtの直後にretにしないと dq 0 dw 0xffff を機械語として実行しようとしますね
aihou

2021/06/06 20:13

書き込んだがdiskette_readまで行きません
aihou

2021/06/07 14:12

もうあきらめる!
aihou

2021/06/07 16:26

gdt_end のところで diskette_initialisation にジャンプしてやる
aihou

2021/06/11 04:08

fatal: could not read from the boot medium! System hlted. 出ますね そもそもlgdtするのが古いのではないでしょうか?
asm

2021/06/11 08:52

> fatal: could not read from the boot medium! System hlted. VirtualBoxで動かす場合はisoイメージをきちんと作らないとダメかもしれませんね > そもそもlgdtするのが古いのではないでしょうか? そうですね。MBRにipl書くよりもGRUB等のローダーに対応したものを書くほうが楽ですし 新しいという意味ではUEFI boot等もありますね
aihou

2021/06/11 10:15

lgdt ©言語みたいにlgdt 自作出来たらええのにorg 0x7e00 jmp main main: cli mov ax, 0 mov ds, ax mov cs, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax mov sp, 0x7e00 call [gdt] gdt: ; プロセッサ初期化と設定 bits 32 xor ebx, ebx xor ecx, ecx mov ebx, [0x7e30] add ebx, [gdt_setup] mov ecx, [ebx + 14]; ecxは一時的に置いとく用 add ecx, 0x00 mov ebx , ecx call [ds:ebx] ret gdt_setup: dw gdt - gdt_null db gdt_null gdt_null: dq 0x0 gdt_code: dw 0xffff; limit dw 0; base mid と base用 db 0x9a; 多分アクセス type=0x9A db 11001111b;フラグ1 db 10011010b;フラグ2 db 0 gdt_date: dw 0xffff dw 0 db 0x92;type=0x92 db 11001111b db 10011010b db 0 gdt_end: nop ret diskette_error: mov ah, 0x0e mov al, 'E' int 0x10 hlt diskette_initialisation: mov ah, 0x00 mov dl, 0x00 int 0x13 jc short diskette_error jmp diskette_read diskette_read: mov ah, 0x0e mov al, '2' int 0x10 hlt times 510-($-$$) db 0 dw 0AA55h
aihou

2021/06/11 15:23

UEFI と bios のアセンブル命令ってどう違うの?
asm

2021/06/11 16:09 編集

命令はCPUに依存するので変わりません。 メディアに保存するときにどこに、どのように保存するか が違います。 MBRという1セクタ(512バイト)の領域に保存する従来と違い UEFIが解釈できるフォーマットのメディアの特定ディレクトリに特定の名前のexeファイル(と形式自体は似た奴)を置くとbootされます。 EXEファイルと似た形式なのでVisualStudioとC言語で作れます https://qiita.com/lembryo/items/003449bb6c6049e61b00
aihou

2021/06/12 12:09

該当したサイトをコードエラーなく実行したのですが疑問になったのがgdtの部分無限ループなのに出力されるのはなぜ? ほうほうフォーマットが違うだけね
aihou

2021/06/15 22:55

なんでこんな設計したのか理解できない ただのメモリー無駄遣いにしか思えん
aihou

2021/07/06 21:43

``` ;取り敢えずブートローダのコードです オエスwikiのコードですがね...汗 bits 16 org 0x7c00 jmp boot_lodaer boot_lodaer: cli mov ax, 0 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax mov sp, 0x7c00 call minimum_gdt_andidt bits 16 call valid_A20 call diskette_initialisation jmp Protected_Mode minimum_gdt: bits 32 lgdt [ndt_setup];https://wiki.osdev.org/GDT_Tutoria    lidt [ndt_setup: ret ndt_setup: dw 23 dd gdt_null ndt_null: dq 0x0: ndt_code: dw 0xffff dw 0x0 db 0x0 db 11001111b db 10011010b db 0x0 ndt_date: dw 0xffff dw 0x0 db 0x0 db 11001111b db 10011010b db 0x0    ndit_end: ;Only enable a20. Does not check for anything. valid_A20: in al, 0x60 mov al, 0xad; key off out 0x60, al in al, 0x60 mov al, 0xfe; key 初期化 out 0x60, al in al, 0x60 mov al, 0xae; key on out 0x60, al mov al, 0x00 ret diskette_error: mov ah, 0x0e mov al, 'E' int 0x10 hlt diskette_initialisation: mov ah, 0x00 mov dl, 0x00 int 0x13 jc diskette_error   ;The size of the karnel img file has not yet been determined kanel_loader_read: ; cluster 0 = 12bit ;http://elm-chan.org/docs/fat.html セクター意味わからん いろいろあるみたいやけど なんか 0x00とかではさんでくれないかな csvみたいにさぁ mov ah, 0x02 mov al, 0x60 ; 読み込むセクター数 mov ch, 0x00 ; トラック下位八ピット mov cl, 0x00 ; トラック上位二ビット mov dh, 0x00 ; ヘッド番号 mov bx, 0x0a ; 呼び込み先のオフセットアドレス int 0x13    ;ここかられへんはまだ建設中です???? mov ah, 0x0e mov al, '2' int 0x10    ;完了するための2です ret Protected_Mode: cli ; 念の為走らす mov eax, 0x01 mov cr0, eax; 特殊な命令できるっと思ったらmov できるらしい 仕様かわからんけど eax でやる ;参考 https://www.intel.co.jp/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.pdf のCONTROL REGISTERSタグ Switching to Protected Modeタグ jmp eax:karnel   kanel:   ;建設中です   hlt   times 510-($-$$) db 0 dw 0aa55h ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問