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

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

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

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

VirtualBox

VirtualBoxは、現在米オラクル社が開発している、 x86仮想化ソフトウェア・パッケージの一つです。

Q&A

2回答

649閲覧

自作ブートローダー レジスタの値を定期的に表示させたい

kazuyakazuya

総合スコア193

アセンブリ言語

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

VirtualBox

VirtualBoxは、現在米オラクル社が開発している、 x86仮想化ソフトウェア・パッケージの一つです。

0グッド

1クリップ

投稿2020/11/01 00:25

編集2020/11/01 09:49

ブートローダーを作成しており
定期的に画面上に現在のレジスタの値を表示させる機能を実装したいと思っています。

タイマー割り込みハンドラに現在のレジスタを表示させる関数を呼び出させることで実現します。

タイマー割り込み設定に関して
参考にしました

パルスの周波数 = CLKの入力クロック周波数 / カウンタの値

私はカウンタに0x08を設定しました よって

パルスの周波数 = 1193181 ÷ 8 = 149147

これは一秒間に149147回のタイマー割り込みが発生する・・・のはず(・・・?)

[実験1]
まずは、現在のレジスタを表示させる関数が正しく機能していることを証明します。

LOOP: MOV AX,0x0001 MOV AX,0x0010 MOV AX,0x0100 MOV AX,0x1000 JMP LOOP

このループ処理中にタイマー割り込みを起こさせれば
AXレジスタの値がどんどん更新されるはずです。

結果
[申し訳ありませんが動画をダウンロードして見てください・・・]

動画を見る限り成功しているように見えます。

[実験2]

XOR AX,AX XOR BX,BX XOR CX,CX XOR DX,DX JMP $

各レジスタを0にした後無限ループさせています。
この時点でキーボード割り込み(タイマー割り込みはコマンドで許可できるようにしている)
が有効になっており、
何かしらキーを押せば 画面上のレジスタの値が更新されるはず
ということでやってみました。
結果

"ENABLE PIT"コマンドでタイマー割り込みを有効にした後
"ABCDEFG"を入力
そのあと、ENTERキーを連続で押しています。

(ちなみにAキーやZキーを押す時より、ENTERキーを押したときの処理のほうが多いです。
入力された文字がコマンドと一致しているか?など)

"ABCDEFG"を押したときは何も反応がありませんでしたが
ENTERキーを押したときはちょっとレジスタが更新されました。

これって割り込み頻度が少ないからなのか 更新されるのが早すぎて目に見えないからなのか・・・

カウンタの値を1に設定したパターンも試しましたが
処理が重くなっただけでした。

レジスターの表示から更新が早すぎて見えなくなっているのでは?と思い、
レジスターの値を表示される関数のすぐ後にNOP命令をつけまくったりもしましたが
結果は一切変わりませんでした。

どうやったら[実験2]を[実験1]のように表示させられるのか
わかる方教えてください・・・

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

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

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

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

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

guest

回答2

0

[申し訳ありませんが動画をダウンロードして拝見ください・・・]

そのリンク先からダウンロードは出来ませんでした。そもそも見知らぬ人が教えるURLからなにかをダウンロードって結構ドキドキものです。
それと、「拝見」という言葉の使い方は辞書で調べておいたほうがよいと思います。ここ一番で恥をかいたり礼を失したりするまえに。

レジスターの表示から更新が早すぎて見えなくなっているのでは?と思い、

レジスターの値を表示される関数のすぐ後にNOP命令をつけまくったりもしましたが

普通、ディスプレイの画面更新は1/60秒毎、とかです。ハイリフレッシュレートとしても1/240秒じゃないですか?
NOPをつけて、どのくらいの時間データをホールドしたのですか? それで、

一秒間に149147回のタイマー割り込みが発生する

これを表示出来るでしょうか。
表示出来たとして、あなたの目は1/149147秒だけ表示された文字を読み取れるのですか?

投稿2020/11/01 05:07

thkana

総合スコア7703

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

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

kazuyakazuya

2020/11/01 09:48 編集

相手に対して「拝見」させるというのは失礼にあたるのですね。 知りませんでした 訂正します >普通、ディスプレイの画面更新は1/60秒毎、とかです。ハイリフレッシュレートとしても1/240秒じゃないですか? CPU実行の1サイクルがどのくらいの時間だか知らないからわかりませんが・・・ ディスプレイが更新される前に次のタイマー割り込みが起こってしまっている感じかな? >これを表示出来るでしょうか。 2つ目の動画を見るとわかりますが enterキーを押されたときはレジスタの値が更新されているのがよく見えます。 読み取れる必要性はなく キーを押されたことでレジスタの値が更新されているってのが 実感できる程度で十分です。 ただ、enterキー以外だと更新されていない・早すぎて更新されているのかわからない状況です。 https://www.youtube.com/watch?v=EUgEta8CGEU&feature=youtu.be youtubeにあっぷしました。(2本目のやつです)
thkana

2020/11/01 09:58

拝っていう字の訓読み知ってますか? 「おがむ」ですよ。相手に「私の動画を拝んで見なさい」と言っちゃってるわけ。 > CPU実行の1サイクルがどのくらいの時間だか知らないからわかりませんが ブートローダーを作ろうという人なら、CPUクロックという言葉は聞いたことがありますよね。これがCPU動作の基準になります。1クロック1命令とは限りませんが、1命令100クロックということもそうそうないです。私がいじったことのあるCPUで一番クロック周波数の低いもので500KHz、NOPは1命令4クロックでした。 > ディスプレイが更新される前に次のタイマー割り込みが起こってしまっている感じかな? ほとんどそうなるでしょうね。 見たいのなら、見えるようにたっぷりと動作を止めましょう。20msぐらい止めれば見えると思います。
kazuyakazuya

2020/11/01 10:13

指定時間処理を止めるような方法はあるんでしょうか?
thkana

2020/11/01 11:43

無駄な処理をさせるとか、それこそタイマー割り込み仕込んでCPUはお休みするとか。 でも、表示の度に毎回17ms(=1/60秒)止めてたら処理が遅くて仕方ないから、いつ止めるかはよく考えないと、ね。
kazuyakazuya

2020/11/01 23:23

う~んそうですね まぁキーを押しまくればレジスタの更新を確認できることもあるので 今は今のままで我慢しようと思います・・・。
thkana

2020/11/02 00:24

> 今は今のままで我慢しようと思います・・・。 我慢って...その表示をすることで「そもそも何をしたかった」のかしら。 キーを押した時にレジスタが変わることを「常に」監視したいわけじゃないでしょう? 動作チェックなら、他にいくらでも方法があるでしょうし。
kazuyakazuya

2020/11/02 00:42

それはロマンですよ 言ってしまえはかっこいいからですね。 キーを押すことでキーボード割り込みが発生しているという実感を体験することができることが重要だと思っています。
guest

0

リンク先は見てませんが、、
はやいはなし、キーボード割り込み中のレジスタの値を見よう、ということでしょうか。
これをするには、
キーボード割り込み中にタイマ割り込みを起こす、って事をする必要があります。

さて、キーボード割り込みハンドラの実行時間はどんだけかと思ってるでしょうか。
その実行時間が、例えば1秒あるというのであれば人間の目にもわかるでしょうけど。

投稿2020/11/01 00:54

y_waiwai

総合スコア88042

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

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

kazuyakazuya

2020/11/01 01:07

>さて、キーボード割り込みハンドラの実行時間はどんだけかと思ってるでしょうか。 うーん わかりません 一秒間に1193181回の割り込みが発生するとしても キーボード割り込み実行最中にタイマー割り込みが起きることはなかなかないのでしょうか?
y_waiwai

2020/11/01 01:10

それが数マイクロsecとしたら、どういう動作になると思います?
kazuyakazuya

2020/11/01 01:45

数マイクロSECでキーボード割り込みの処理が終了するということですか?
y_waiwai

2020/11/01 01:56

どういう動作になると思ってやってます? なんかいろいろ突っ込みどころがありますが。。
kazuyakazuya

2020/11/01 03:27

キーボード割り込みが処理している最中にタイマー割り込みが起こった時にレジスターの値が表示される。 タイマー割り込みの頻度が高ければ高いほどキーボード割り込みが起こっている最中に呼ばれる確率が高くなる。
y_waiwai

2020/11/01 03:33

あまたのいう一秒間に1193181回の割り込みが発生するなかで一回キーボード割り込みがうまく引っかかったとして、それがあなたに見えるんでしょうか #そもそも「一秒間に1193181回」ってのが一番のツッコミどこですが、横に置いといてw
kazuyakazuya

2020/11/01 03:38

見えないと思います・・・ レジスタの値を表示させた後少し休止させてあげれば見えるようになる・・・?
y_waiwai

2020/11/01 05:09

そこで最初に戻りますが、あなたはなにをしたくてそれをやってるんでしょうか
kazuyakazuya

2020/11/01 09:41

キーボード割り込みが発生してレジスタの値が更新されているってのを実感したいです。 enterキーが押された際はレジスタの値が更新されているのがよくわかりますが それ以外のキーだと更新されているのかさえわからない状態です。
y_waiwai

2020/11/01 09:45

まあ、キーを押したらレジスタが変更されるはず、というのもあくまで仮定の話ですんで、それで必ず変更されるとは限りませんぜw
y_waiwai

2020/11/01 09:54

レジスタの値みるってそもそも意味を見出せません。 ので、別に見るつもりはありません。
y_waiwai

2020/11/01 10:03

以前にも言ったと思うけど、PCでどーこーするよりも、8ビットのマイコンとオシロスコープ使ってそこらへん動作見ながらデータシート見ながらやっていったほうが理解しやすいとおもうよ。 特に割り込み周りは基本的な理屈わかってないと、知識だけではねえ。
kazuyakazuya

2020/11/01 10:15

とは言え、・・・もうここまで来ちゃったのでx86系で貫き通したいです。
y_waiwai

2020/11/01 10:26

まあ、聞いていただければわかることなら答えますんでがんばってください どーこーしてるのもいみないといっても、無駄にはならんと思いますし
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問