q_and_aの過去ログ(0001)

  • (by K, 2006.04.25)

ログ

  • P.14などでEB4E90・・・となっていますが、4Eは正しいのでしょうか? P.28ではフォーマットの名前(8バイト)の後18バイトあけています。一般にFAT12の場合先頭はEB3E90で、このフォーマットの名前の後のIPLにジャンプすることになるのですが・・・どなたかお教えいただければ幸いです。 -- さすらい人 2006-04-01 (土) 10:48:20
  • ご質問ありがとうございます。4Eも正しいです。確かに一般的にはさすらい人さんがおっしゃるようになっていますが、規定ではそうしなければいけないとはされていません。かつてはFAT12の情報がもっと短くて、3Eより小さいこともありました。 -- K 2006-04-01 (土) 14:21:53
  • そうなんですか。16バイトのダミーであればEB4E90が正しく、18バイトのダミーであればEB5090が正しいのではと考えていました。EB4E90で00004Eの0x00へジャンプするんですか???90はNOPですよね。 -- さすらい人 2006-04-01 (土) 14:58:41
  • ええとやや専門的な話になってしますが、EB命令は相対ジャンプ命令で、 EB xx と書き、この命令の直後の番地(0002)にxxを「加えた」ところへジャンプします。従いまして、 EB 4E であれば 0050 へジャンプします。またおっしゃるとおり90はNOP命令です。 -- K 2006-04-01 (土) 15:09:15
  • 相対ジャンプでしたか。アセンブリと機械語が混乱していました。それではFAT12のEB3E90は、フォーマットの名前の後に続く00 00の次の0040にジャンプするんですよね(わかりやすくお教えいただき感謝です)。 -- さすらい人 2006-04-01 (土) 15:30:54
  • はいそういうことになります。( EB 3E 90 は、0040へジャンプ? の回答) -- K 2006-04-01 (土) 15:41:14
  • P. 48から03_dayのharib00aの説明があり、ソースコードのエラー処理でMOV AX,0/MOV ES,AXとしてESに0を代入しています。ES=0とするには何か明確な意図があるのでしょうか? -- さすらい人 2006-04-02 (日) 11:28:41
  • すみません、質問の内容がよく分かりませんでした。問題のコードは一体どのページに掲載されていますか?p.48には無いように思います。 -- K 2006-04-02 (日) 19:18:05
  • harib00aのソースコードに中にerrorというラベルが付いている箇所があり、ここでESに0を代入しています(ディスクを読むのコードで、すでにES=0x0820がセットされています)。ES=0とするのはES:SIとしてセグメントレジスタ込みでメッセージ用のアドレスを指定するためでしょうか? -- さすらい人 2006-04-03 (月) 09:07:49
  • さすらい人さんへ。確かにそこにESを0にするコードがあります。結論から言うとそれはなくても正常動作します。だから不要なコードです。実はエラーメッセージをAH=0x13の機能で表示しようかと思って迷ったときの消し忘れです(AH=13では、ES:BPにメッセージの番地をセット)。 -- K 2006-04-03 (月) 09:21:18
  • それでここからが重要なのですが、まず掲載されているプログラムについておかしいなと思うことはとてもいいことです。なぜだろうと思うのもとてもいいことです。そしてそこからあともう一歩だけ踏み出して、ESへのMOV命令を消してみて、それでどうなるかを実験してみてほしいです。ES:SIなのかな?という正しくないことを質問する前にです。その上で「この命令は不要のようなのですが、なぜ書いてあるんですか?」と聞いてほしいです。そのほうが格段に力がつきます。よろしくお願いします。 -- K 2006-04-03 (月) 09:26:56
  • ご指摘そのとおりですね。お教えいただいたようにまず動作確認してみます。ありがとうございました。 -- さすらい人 2006-04-03 (月) 09:53:44
  • 環境変数の設定があるみたいです。QEMU本家のQEMU−WIN.BATの中を見ると設定値がかいてあります。私も1日わからずに悩みました。 -- kuni 2006-04-03 (月) 15:03:35
  • kuniさん情報ありがとうございます。とても参考になったのでMakefileに取り入れてみます。 -- K 2006-04-04 (火) 02:36:21
  • p59「ブートセクタからOSを本体を実行させてみる」の箇所への質問です。「haribote.nasにORG 0xc200を書き足して・・・」とあり、その上の段の説明で、「・・・=0xc200に読み込めているはずです。」となっているので、haribote.nasにORG 0xc200を書かなくても、特に問題ないのではないでしょうか(実際に書かなくて実行しても問題ありませんでした)? -- taka8 2006-04-05 (水) 22:03:15
  • taka8さんご質問ありがとうございます。ORGの意味は、アセンブラにこのプログラムがどこに読み込まれる予定なのかを教えることです。したがって0xc200に読み込むのならそれは当然ORG 0xc200と書くべきで、その意味でこのプログラムは正しいのです。・・・しかし一方で、確かにこのORGを省略してしまっても、harib00hくらいまでは問題なく動いてしまうでしょう。これは偶然にORGの値が機械語の翻訳に影響しない命令の組み合わせだけになっているからです。そしてharib00iからはORG命令の影響を受ける命令も使っているので、ORG命令を消したらうまくいかなくなるでしょう。 -- K 2006-04-05 (水) 23:10:56
  • どうも誤解されているように思うのですが、ORG命令は機械語を指定した番地に読み込ませるための命令では「ありません」。正しい番地に読み込ませるのはプログラマの責任です。ORG命令は、どこに読み込ませて実行するつもりなのかをアセンブラに教えてやるための命令です。もしこれが正しくないと不適切な機械語になってしまい、うまく実行できなくなるというだけのことです。 -- K 2006-04-05 (水) 23:14:21
  • 「ORG命令は機械語を指定した番地に読み込ませるための命令」と理解していました。確かに本にも、「・・・PCのメモリのどこに読み込まれることになるかをnaskに教えてあげるための命令です」(p31)とありました。これからもこんな質問があるかもしれませんが、よろしくお願いします。 -- taka8 2006-04-08 (土) 11:26:10
  • (wqさんの質問は「本の内容」を超えたところにあると判断したので、impressionsに移動しました。) -- K 2006-04-08 (土) 21:04:23
  • はじめて質問しますので作法が間違っていたら指摘してください。 -- 名無しさん 2006-04-10 (月) 13:09:45
  • ごめんなさい。改行のつもりでエンターキーを押したら送信されてしまいました。長い文章を打ちにくいので端的に書きます。XP Home SP2を使っています。Q&Aにはありませんでした。三日目のharib00jのファイルをコピーしてmake installしたところobj2bim.exeで問題が発生したためobj2bim.exeを終了します。とされてしまいました。xmd.exeの画面をコピーしてテキストファイルに貼り付けてあるのですが、ここに貼り付けても長すぎませんか。必要な情報はお知らせします。よろしくお願いします。 -- T 2006-04-10 (月) 13:22:22
  • ごめんなさい。改行のつもりでエンターキーを押したら送信されてしまいました。長い文章を打ちにくいので端的に書きます。XP Home SP2を使っています。Q&Aにはありませんでした。三日目のharib00jのファイルをコピーしてmake installしたところobj2bim.exeで問題が発生したためobj2bim.exeを終了します。とされてしまいました。xmd.exeの画面をコピーしてテキストファイルに貼り付けてあるのですが、ここに貼り付けても長すぎませんか。必要な情報はお知らせします。よろしくお願いします。 -- T 2006-04-10 (月) 13:24:56
  • 重ねてごめんなさい。IEの更新ボタンを押したら二重に送信してしまいました。画面をコピーしたうちのエラーに関する部分を送信します。../z_tools/obj2bim.exe @../z_tools/haribote/haribote.rul out:bootpack.bim stack:3136k map:bootpack.map \bootpack.obj naskfunc.objmake.exe[2]: *** [bootpack.bim] Error -1073741819 -- T 2006-04-10 (月) 13:44:27
  • (bytさんとTさんへ。現在ちょっと忙しいので水曜日くらいまでお待ちください。確認のお返事も不要です。) -- K 2006-04-10 (月) 16:26:42
  • Tさんへ。今のうちに調べていただきたいことがあるので質問します。その不具合が起きるのは、harib00jからということでいいでしょうか。つまり、harib00iまではobj2bimでエラーが起きることは無いのでしょうか。ちなみに今一番原因が疑われるのはメモリの不足です。それとおそらくこの問題の解決のためにはxmd.exeの情報は不要です。 -- K 2006-04-10 (月) 16:42:39
  • メモリ不足とのご指摘ありがとうございました。obj2bim.exeが成功しなかったら4日目以降のPCによるテストができないのかなと途方に暮れていました。Windowsを再起動してmake installしたら無事成功しました。もう必要ないかもしれませんがharib00fのあとharib00jに進みました。最新のQEMUをダウンロードして、フリーソフトのQEmu Launcherをフロントエンドに使用しているのですが、数回メモリ不足でQEMUが起動できなかったことがありました。メモリは256Mでは不足でしょうか。Kさんは私の稚拙な表現の症状から確信をつく指摘をされ驚いています。私もKさんに一歩でも近づきたく3日目までの内容を1週間かけて理解しようとしています。今回私はどのようなサインを見落としていたのでしょうか。今回わからなかったのはどのような知識が不足しているのでしょうか。アドバイスがありましたらお願いします。忙しいKさんに初歩的な質問をしないために。 -- T 2006-04-10 (月) 20:09:13
  • (bytさんへ。ページを作りました。それに伴い以前の質問もそちらに移動させています。→ q_and_a_2 ) -- K 2006-04-12 (水) 15:54:53
  • Tさんへ。まずメモリ256MBは十分すぎるくらいに十分だと私は思いますが、しかしOSの設定やインストールされているほかのソフトウェア、もしくは同時に使ったソフトが多すぎたりしたら、それだけのメモリがあるにもかかわらず、メモリ不足になるのかもしれません(ちなみに私の環境もTさんと同じメモリ256MBで、Windows2000です。同時にアプリを20個くらい動かすことはしょっちゅうですが、それでもメモリ不足でtolsetでの「make run」に失敗したことは一度もありません。これはOSの違いのせいかもしれませんが、多分それはないと思います)。私はWindowsの専門家ではないので、どうしたらその状況が克服できるのかの的確なアドバイスはできないのですが、Windowsタスクマネージャなどを活用して、どのソフトウェアがメモリをたくさん使ってしまうのか、実験してみるといいかもしれません。 -- K 2006-04-12 (水) 16:08:37
  • なぜメモリ不足を疑ったかですが、それはまあ私が、自分が書いたharib00jの内容と自分が書いたobj2bimの内容について、かなりの自信(?)を持っていて、おかしくなることがあるとしたらメモリ不足くらいしか考えられない、とうぬぼれていたせいです(笑)。そんなわけですので、まぐれ当たりです。これからも「初歩的かな」と思っても遠慮なくご質問ください。 -- K 2006-04-12 (水) 16:13:33
  • XP HOME SP2という一般的な環境でQ&Aにないので私の個人的な環境が原因だとは思っていたのですが、今回メモリ不足でアプリケーションがエラーになるということがわかり経験値がひとつあがりました。ありがとうございます。OSの勉強のためにエディタをいくつも開いてソースを見比べたり、コマンドプロンプトやQEMUが開いていたりしてましたが、今はアプリケーションをできるだけ終了してmake installしていますのでメモリ不足にはなりません。タスクマネージャをみるような状態にはなりませんが、いいアドバイスをいただいたので、これを機会に知っているツールを活用して原因をさぐるようにします。悩んでもわからなければまた質問しますので、よろしくお願いします。 -- T 2006-04-12 (水) 20:47:57
  • fifo32_putでは cliする必要があると思うのですがどうでしょうか?例えばharib15bでは次のような事が起きそうです。 (1)キーボードからの入力で task_a から console_taskへ向けて fifo32_put。 → fifo32_put内で、fifo->buf[fifo->p]=dataした直後に、カーソル点滅の タイマ割り込みが入ったとする。 → タイマがconsole_taskへ向けてfifo32_put。 → キーボードからの入力は失われ、不定な値がfifoの最後に付く。 あるいは、別の現象として、 (2)console_taskがsleep状態のときキーボードからの入力で fifo32_put。 → console_taskを起こすためにtask_addが呼ばれ、tl->running++した直後に、 カーソル点滅のタイマ割り込みが入ったとする。 → タイマがconsole_taskへ向けて fifo32_put。→ console_taskを起こすために再びtask_addが呼ばれる。 → tl->runningが大きくなりすぎてしまう。 -- wq 2006-04-24 (月) 02:08:37
  • お答えします。まず、fifo32_putはcliする必要があります。ありますが、それはfifo32_putの中でやるのではなくて、fifo32_putを呼び出す側の責任にしています。というのはこれらのデータ送信関数は割り込みルーチンから呼ばれることもよくあり、そんなときにわざわざEFLAGSをみてcli後にstiするかどうかとか、そういう時間のかかる処理をしたくないからです。もしそういう関数も必要なら、僕はfifo32_putをcliとstiではさんだ別の関数を用意するでしょう。つまりfifo32_put自身はこれでいいのです。 -- K 2006-04-24 (月) 07:14:56
  • その他のアクセス競合に関する問題についてはp.694にあるとおり「わざと」残してあるので、読者の皆さんが満足行くようにしていただければと思います。 -- K 2006-04-24 (月) 07:18:32

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: 2006-04-25 (火) 17:25:28 (4976d)