q_and_aの過去ログ(0009)

  • (by K, 2009.11.18)

ログ

  • 多分すごく基礎的なミスだと思いますが、聞く人がいないので質問します。Capter2(4)Makefileで、TeraPadを使い、ファイル生成規則を入力し、!consからmake.exeを実行したのですが、***missing separator Stopというメッセージが出てしまいました。何が悪いのでしょうか? -- 初心者 2007-04-21 (土) 20:10:12
  • 初心者さんの質問にお答えします。!consからmake.exeと書いてありますがmake.batを起動するのではないでしょうか?たぶんmake.exeの呼ばれたディレクトリーでMakefileを探したのかもしれません。間違っていたらごめんなさい。 -- TTT 2007-04-21 (土) 20:40:41
  • TTTさん、ありがとうございました。しかしprojectsからMakefileをコピーしてファイル生成規則以外を消去して実行すると、ちゃんとipl.binとipl.lstが出来るのですーーー解りました、Tabキーの代わりにSpaceキーを使ったのが原因でした。私って無知? -- 初心者 2007-04-22 (日) 17:52:49
  • ふと思ったので、アセンブラ未経験だったのであまり詳しくないですが、DBとかで直接書くときにエンディアンについて考える必要があるのでしょうか?Win上だとOSとかミドルウェア的なものが補うような感じなのでしょうが、OS本体となると話が別な気がして。 -- Flast 2007-06-23 (土) 22:15:08
  • (エンディアンの話題はq_and_aで扱うべき範囲を超えていると思いますので、上記にありますとおり以後はできるだけimpressionsをお使いください。)DBは1バイトずつ(出力ファイルに)書き込む命令なので、エンディアンの問題は基本的にはおきないと考えていいと思います。DWやDDは2バイト、4バイトずつになるので、エンディアンが異なるアセンブラでは結果が異なることになります。・・・しかしエンディアンを気にする必要が出てくるのは書き込むCPUと読み取るCPUとでエンディアンが異なる場合だけですので、たとえOSであっても、x86用に作ってx86で使う分にはエンディアンを気にする必要はありません。 -- K 2007-06-23 (土) 23:41:27
  • 初心者さんへ。実は僕もスペースではいけないということを知りませんでした。何の疑問も感じないままTabで入力していたせいです。ということで僕も無知でした。いいことを指摘していただいたと思っているので、機会があれば本文の修正に反映させたいです。 -- K 2007-06-23 (土) 23:49:02
  • Kさんへ誘導+回答ありがとうございます。そうですかなら大丈夫ですね。思ったのはPen機でFDDに書いたのをAthron機で読んだときとかどうなのかなーと思ったけどKさんが言うなら間違えないでしょう。 -- Flast 2007-06-24 (日) 00:29:27
  • 初歩的なことで申し訳ありません。初心者さんも質問されていることなんですが、どうしてもわからないので質問させていただきます。captar2のMakefileを作った後に!conでmake -r ipl.binと入力したんですが、何度やってもipl.binとhelloos.imgが生成されません。何か問題があるのでしょうか? -- clax 2007-09-02 (日) 15:56:40
  • コマンド行のTABは、誰もが通る道ですよね。既出のTAB関連以外でしたら、上部の「単語検索」より make と入れてください。 -- 名無しさん 2007-09-04 (火) 19:56:10
  • VRAM領域というのがありますがその領域にアクセスするということは -- @たか 2007-10-29 (月) 02:57:11
  • VRAM領域というのがありますがその領域にアクセスするということは物理的にビデオカードにあるVRAMに読み書きが行われるのであって、メインメモリのその領域には一切アクセスされないという解釈で正しいのでしょうか?? -- @たか 2007-10-29 (月) 10:23:31
  • はいそうです。アクセスされないというよりも、アクセスできないというほうが正確かもしれません。 -- K 2007-10-30 (火) 18:47:03
  • Kさんご回答ありがとうございました!とういうことはCapter4(1)でアドレス0xa0000〜0xaffffに値を直接書き込んでますが、例えば1GBのメモリを搭載したPCの場合、そのメインメモリの領域の65KB間は物理的には完全に無駄になってしまうのでしょか?また mov byte ptr[0xa0000],15 と書いた場合CPUはなぜそれがメインメモリに対するアドレスではなくVRAMのアドレスの方だと分かるのでしょうか??初歩的な質問ですみまんせんがよろしくお願いいたします。。 -- @たか 2007-10-31 (水) 11:59:14
  • そのメモリはBIOSがこっそりと利用します。だから厳密に言うと無駄にはなっていません。参考: http://ja.wikipedia.org/wiki/システムマネジメントモード -- K 2007-10-31 (水) 12:48:33
  • CPUは自分の指定した番地に何がつながっているのかを把握はしていません。「0xa0123番さーん!データですよー!」というだけです。そのときに、メインメモリは反応しないように回路が組まれていて、かつVRAMが反応するように回路が組まれているだけです。・・・病院の呼び出しみたいなものです。カワイさーん、と呼ばれて出てきた人が本当にカワイさんかどうかCPUは確認していません(病院でもそこで身分証を出せとは言いませんよね?)。カワイさんが来るものだと決め付けているのです。 -- K 2007-10-31 (水) 12:52:58
  • 多忙な中、早速のご回答本当にありがとうございました!初心者ですが何とか読破出来るようにこれからも頑張っていきます!! -- @たか 2007-11-01 (木) 00:09:20
  • naskでラベルのセグメントを取得する方法が知りたいです。オフセットはMASMと異なり、offsetなし(ラベル)のみで取得できるのは知っています。 -- 名無しさん 2007-12-01 (土) 23:16:02
  • naskではラベルのセグメントという概念が(まだ)ありません。具体的にどういうプログラムをnaskで書こうとしているのかを教えていただければもう少しましなお返事ができるかもしれません。たとえばMASMで書いたこの部分をnask用に書き直したい、とか。多分この欄では書ききれないと思うので、どこか適当なサイトで記述し、そのURLを教えてください。それと、この質問は明らかにimpressions向きなのでそちらで質問してください(上記の注意書きをよく読んでください)。またルールのページにあるように、僕は名無しさんには回答しないことが多いのでご了承ください。 -- K 2007-12-05 (水) 21:01:12
  • 真性のズブの素人ですが、Chapter1(3)『アセンブラ入門』等を含めたテキストにソースプログラムを書く時、『;』や『DB』等の命令記号は前からどの位文字スペースを空けるものなんでしょうか? -- アンジュ 2008-04-11 (金) 16:13:08
  • アンジュさんへ。自分が「これは見やすい!」と思うまでスペースを入れれば良いと思います。スペースの数に正解はない! -- uchan 2008-04-12 (土) 20:48:46
  • Uchanさん、本当にありがとうございます☆」今はまだ与えて頂いてる課題を理解していく事が第一ですし、精一杯ですが、少しづつでも『自分自身』をテキストのスペースからでも表現出来たら、と考えています。また素人ながらの疑問が出てくるかもしませんが、その折はよろしくお願い致します。 -- アンジュ 2008-04-14 (月) 05:03:21
  • 正直この本の続編が欲しい。。。(すいません、ちょっとこの書き込みはKYでした(;^_^)) -- neighbor 2008-04-15 (火) 21:05:39
  • 今、3日目のasmheadのところなのですが、make imgと入力しても***[img]このコマンド認識していませんとでてsys,imgのファイルができません。どうしたらいいんでしょうか -- 悩める子羊 2008-05-03 (土) 00:03:38
  • 初版第10刷、2日目のMakefileの所について質問です。make.batを本書記述通り"make -r ipl.bin"と実行しましたが、「..\z_tools\make.exe: *** [ipl.bin] Error -1073741819」とエラーと共にnask.exeが強制終了します。そのためipl.binやipl.lstが作成されません。なお、Makefileのスペースは全てタブに変更しています。恐れ入りますが、アドバイスを宜しくお願いします。 -- 初OS作成者 2008-06-08 (日) 18:44:43
  • claxさん、悩める子羊さん、初OS作成者さんへ。みなさんまずは自分で入力したプログラムをどこかに保存しておいて、とりあえずCD-ROM内のプログラムをそのまま使ってみて、それでも同じ症状か確認してください。これがないと、ただの入力ミスが原因になっているのか、それとも何か別の問題なのか、誰にも分かりません。 -- K 2008-06-11 (水) 08:27:31
  • Kさん、失礼いたしました。自分で再度付属のCDでやってみたところ問題なくできました。自分なりに原因を探してみると、どうやらipl.nasファイルの文字コードが原因だったようです。SJIS、JIS、EUC、UTF-8Nは大丈夫でしたが、UTF-8、UnicodeBE、UnicodeLEはエラーが発生してしまいます。とりあえず原因が分かったのでご報告いたしました。今度からはもっと自分で検証してみます。 -- 初OS作成者 2008-06-12 (木) 22:03:22
  • 初版12刷59ページの記述で、6.ブートセクタからOS本体を事項させてみる のところで質問です。ブートセクタの先頭がメモリの0x8000番地に読み込まれるとありますが、ブートセクタ先頭アドレスは0x007c00ではないのですか?なぜ1024バイトずれるのですか? -- M 2008-09-04 (木) 22:22:05
  • 上記質問は既出でしたので、撤回いたします。8日目まで読んでみます。 -- M 2008-09-04 (木) 22:33:02
  • 本に関する質問は、ここで(コメント)よろしいのでしょうか? -- 名無しさん 2008-09-11 (木) 18:29:35
  • 初版第12刷発行のP.94、BooTpack.Cにて、0x03c9でパレット番号を設定してVRAMのアドレスにパレット番号を1バイト書いていますが、何故これで出力されるのでしょうか?パレット番号セットとVRAMにその番号をセットするその間には、PG的には関係が無いように思いますが?ご教授ください。 -- NN 2008-09-11 (木) 18:39:04
  • p.71のbootpack.cでのfor(i=0xa000; ... のところが理解できていれば、vram[]の先頭アドレスも0xa000ということなので納得できるのではないでしょうか? -- 名無しさん 2008-09-24 (水) 02:28:31
  • おそらく名無しさんからの回答で十分だとは思いますが、僕なりのアドバイスも。「なぜこれで?」という質問の背景にはきっと別のやり方でもいいのではないかという考えがあるのではないでしょうか。もしそうであれば、質問なんかしないでまずその方法をやってみてはどうでしょうか。それでうまくいけばNNさんは正しいのです。そもそも本に書いてある方法だけが唯一の方法ではありません。もしうまくいかなければ、うまくいっている本の例を参考に、うまくいく方法を探してください。こうすることで、誰かに教えてもらうよりも何倍も深く理解することができます。 -- K 2008-09-24 (水) 11:59:41
  • そういう意味合いではなくて、単にこれだけで期待通りに動くのが謎だということなら、このプログラムでこのような結果になるようにハードウェアが設計・製造されているから、としかいいようがないです(グラフィックチップがものすごい速さでパレットの設定とVRAMの内容を勝手に読み出し、そこから色を決定してその電気信号をディスプレイに出力している)。それはすべてIBMの技術者やインテルの技術者やグラフィックチップの技術者が決めたことです。僕たちはそれに沿ってハードウェアを制御しているだけです。ハードウェアの世界はソフトウェアの世界の人からすると引っかかることが少なくないですが、そういう仕様にすることでハードウェアを安く作れるようになるなど、僕たちには分からない深遠な理由でこのようになっていることもあります。 -- K 2008-09-24 (水) 12:03:41
  • 最後のK氏の回答で納得しました。0x03c9とvramの間にハードウエアが介在していて、ソフトウエアでそれを制御しているのですね。アプリ系の高級言語しか触らないエンジニアは、急にコーディングー上に連絡が取れなくなると、?マークが付いてしまいます。0x03c9でパレット番号をハードに設定して、VRAMにその番号を書くとCRTの画素とアドレスの1Byteが対になっていて、色とかが表示されるのです。と理解しました。ありがとうございます。 -- NN 2008-09-25 (木) 12:28:18
  • 二日目でhariboteimgファイル作成されません。copy haribote.img ..\z_tools\qemu\fdiage0.binでアクセス拒否されましたと出ます。 -- sin 2008-10-24 (金) 02:31:39
  • FDC 読み取り専用設定をした結果 0x20の間違いを発生します. これは何の意味ですか? -- Kor_Lee_Hee_Rak 2008-11-07 (金) 22:13:32
  • その質問は本の内容の質問ではありません。自分で改造したことによる問題です。ここではなく、impressionsで質問しなおしてください。 -- K 2008-11-07 (金) 23:30:27
  • この本についてくるCDが起動しないのですが(ドライブに認識もされてません)なにかしなければならないことがあるのでしょうか? OSはビスタです。 -- J 2008-11-22 (土) 19:33:48
  • この本についてくるCDが起動しないのですが(ドライブに認識もされてません)なにかしなければならないことがあるのでしょうか? OSはビスタです。 -- J 2008-11-22 (土) 19:35:24
  • 初版第8刷P324にある「タスクによって00.1秒〜0.1秒の範囲で指定できるようにしてみます。」とありますが、0.1秒(優先度最大10倍)は基準か何かあるのでしょうか。 -- 素人 2008-12-16 (火) 16:40:44
  • 素人さんへ。特に基準はないと思います。ただあまりに長いと切り替えが目で見えてしまってあまり同時に動いているようには見えなくなります。それを気にして0.1秒を選びました。 -- K 2008-12-16 (火) 22:14:56
  • 1日目の、!cons_nt.batでqemuを使うところでqemuが起動しません・・・。 -- wonka 2009-01-13 (火) 16:56:30
  • 追記;プロンプトで「run」とやっても指定したパスが見つかりません、となるんですが。 おそらくfdimage0.binがないんですが。 この場合どうしたらいいんでしょう? 教えてください! -- wonka 2009-01-13 (火) 16:59:57
  • wonkaさんへ。まずはp.25を読み直すことをお勧めします。 -- K 2009-01-13 (火) 19:28:17
  • できました!僕は中2なので、プログラムは、作った事が無いのでこれからも質問さしていただきます。 -- 名無しさん 2009-01-13 (火) 20:38:57
  • ↑By Wonka -- wonka 2009-01-13 (火) 20:39:18
  • 3日目以降(helloos.img以降、haribote.imgになってから)、make runすると、セキュリティ(NOD32)によって、[tsr.boot ウィルス検出]という警告が出て、qemuが動かなくなってしまいます。imgファイルをBzで開こうとしても、はじかれてしまいます。どうしたらよいでしょうか? -- tk69s 2009-01-20 (火) 16:15:11
  • それは主にアンチウィルスソフトの不備によるものなので、アンチウィルスの設定を見直すか、製造元に問い合わせてください。 -- K 2009-01-21 (水) 16:30:55
  • 設定を見直し(使用するharibote) -- 名無しさん 2009-01-28 (水) 10:39:08
  • 設定を見直し(使用するharib---フォルダを検査対象外)したところ、問題なく動作致しました。貴重なご意見ありがとうございました。 -- tk69s 2009-01-28 (水) 10:40:59
  • set_gatedescの引数offsetについて質問。6日目harib03eのinit_gdtidtにて、set_gatedescの第2パラメータに (int) asm_inthandler21 と指定されておりますが、これはどのような値が渡されるのでしょうか?(試しにデバッグしてみたところ、0x1a8が渡っておりました。何を表す値でしょうか??)よろしくお願いします。 -- big 2009-02-11 (水) 01:13:22
  • bigさんへ。これはたぶん、asm_inthandler21が何を示しているかが知りたいと思うので、説明します。これは関数ポインタというもので、アセンブリ言語で関数を作ったときってただのラベルでしたよね?そのラベルにはアセンブラがアドレスを割り当てますよね。これと同じことで関数も他の変数と同じように番地を持っています。その番地が必要な場合には引数リスト「()」を省略することであらわしているのです。本では関数ポインタについての明示的な説明はないので、おかしいなぁとは思っていたのですが、bigさんはいいところに気づいたと思います。誤解でしたら、ごめんなさい。 -- white 2009-02-11 (水) 13:20:23
  • whiteさん有難うございます!関数ポインタと言うものがあるのですね!ずばりこれが知りたかったです。ググってみたらたくさんヒットしました。初心者の私は「EAXの値でも返ってくるのかな?そうするとEAXはどの様な意味の値なの??」と想像(迷走)しておりました。 -- big 2009-02-11 (水) 14:34:40
  • whiteさん有難うございます!関数ポインタと言うものがあるのですね!ずばりこれが知りたかったです。ググってみたらたくさんヒットしました。初心者の私は「EAXの値でも返ってくるのかな?そうするとEAXはどの様な意味の値なの??」と想像(迷走)しておりました。 -- big 2009-02-11 (水) 14:42:52
  •  二十一日目、p438のRETFで「アプリを呼び出すためのテクニック」についての質問です。いろいろCPUでわからないところがあり、ASCIIが出している「はじめて読む486」を読んである程度理解しましたが、どうしてもこのページのRETFのテクニックがわかりません。なぜセグメント番号に3をORするんでしょうか? -- yudy 2009-03-11 (水) 13:49:32
  • yudyさんへ。ご希望とあればもちろん詳しく説明いたしますが(もう一度聞いてください)、一番大事なことを見落としているかもしれないのでまずはそれを強調したいと思います。僕がこの本で読者の皆さんに説明したいこと、わかってほしいことは、「どうやったらOSが作れるのか」ということです。つまり「なぜなのか?」ではなく「どうすればいいか?」なのです。ということで、なぜ3をORしなければいけないかといえば、結局はそうしなければ目的の動作をさせることができないからだ、ということになります。 -- K 2009-03-11 (水) 21:31:21
  • もちろんCPUの細かい仕様を説明して、3をORしなければいけない理由を書くことはできます。しかしそれはCPUを理解する助けにはなっても、OSを作ることにはつながりません。どうかそれは分かってください。・・・急にこんな話をどうしてしたのかというと、読者の皆さんの中には、作っているうちに今回のような「なぜなぜ」症にかかってしまい、わからないからやりたくなくなった、という人がたまにいるようなのです。僕だって、なぜなぜ症を発病することはいくらでもできます。それをやっていれば永遠になぜをいうことはできます。でも本当の目的はPCに自分のさせたい動作をさせることであって、全ての理由を知ることではないはずです。それで僕としては、将来の改造につながりそうにないことや、わかってもたいして面白くないと判断したこの件については、こうすればうまくいく、という説明にとどめました。・・・その上で、そうと分かっていてもそれでも興味が尽きないのでどうしても知りたいということであれば、喜んでお答えしたいと思います。 -- K 2009-03-11 (水) 21:38:42
  • ご返答ありがとうございます。確かにご指摘どおり、なぜなぜ症にかかっていました・・しかし今回質問させていただいたのは、HariboteOSを改変するのではなく1から自作しようと考えてCPUの機能をたくさん使ってみようと思い、「はじめて読む486」を読みました。この本の記述の中にTSSのDSやCSに3をORする記述をみつけ、これが非常に疑問になり、この3をORするのがTSSそしてRETFをした後の動作にどのように響いてくるのかを知ることで、さらに踏み込んだ開発が出来るんじゃないかと考えています。あまりなぜなぜ症と変わりないですが、ぜひ教えて欲しいです。この質問とは関係ないですがページングにもチャレンジしようとたくらんでいます。 -- yudy 2009-03-12 (木) 09:12:22
  • それでは説明を試みます。実はCSレジスタとSSレジスタには基本的にセグメント番号が入るわけですが、これはGDTの場合は8の倍数、LDTの場合は8の倍数+4の値が入るのは本文の通りです。これらをまとめるとこれらのセグメントレジスタには4の倍数しか入っていないことになります。しかし実はこれが成立するのはOS用コードを実行しているときだけです。アプリを実行しているときはそれらの値にさらに3を加えた値、つまり4で割ったときに3あまる数値になっています。そもそもCPUはそこに(=CSやSSの下位2bitに)自分の動作モードをメモしていて、そこの数値を見ながらLGDT命令やCLI命令などを素直に実行するか一般保護例外にするかを判断しています。 -- K 2009-03-13 (金) 21:11:52
  • こんなの文章だけではよく分からないと思うので、是非一度テストプログラムを作り、MOV EAX,CS や MOV EAX,SS を実行して、このEAXの値がどうなるか確認してみてください。OS内とアプリ内で実行して比較するともっといいでしょう。なお、逆にここの値を変更することができればアプリがいきなりCLIなどを実行する権限を持てるわけですが、そのような企ては(当然ながら)全て失敗するようにできています。 -- K 2009-03-13 (金) 21:16:26
  • そんなわけで、TSSにレジスタの初期値をセットするときには、これらの点で矛盾がないようにしていたわけです。これでTSSの件は説明終わり。次はRETFのほうです。・・・RETFは基本的にはfar-CALLされた次の命令に帰るための命令です。far-CALLではEIPだけではなくCSも変更するので、スタック上にはEIPだけではなくCSの値もPUSHされています。したがって、RETFでは POP EIP / POP CS を実行して呼び出し元に戻ることになっています。 -- K 2009-03-13 (金) 21:21:02
  • 基本はこの通りなのですが、基本どおりでない場合があります。普通のfar-CALLではアプリはアプリ内のセグメントにしかfar-CALLできないのですが、コールゲートという特別な手法を使うとアプリがOS内のコードをfar-CALLすることができます(コールゲートというのは、IDTではなくGDTやLDT上に設定できる割り込み登録みたいなもので、INT命令ではなくfar-CALLで呼び出します・・・詳しく書くときりがないのでここでは省略)。・・・さてそうなるとfar-CALLはいつもより複雑な動作をします。というのは、アプリ用のスタックなんてものはアプリのバグなどによって安全ではないかもしれないのです。スタックが残りわずかになっているかもしれません。ということでCPUはOSを呼び出すときはOS用のスタックに勝手に切り替えます。これを拒否することはできません。そのときにSSやESPにどんな値が入るのかというと、TSSに設定したとおりです(esp0とss0)。 -- K 2009-03-13 (金) 21:32:18
  • でもこういきなりSSやESPの値を上書きしてしまうと、あとでRETFで戻れなくなってしまいます(元の値が分からないので)。ということで、元の値を忘れないために、SSとESPの値を(ss0:esp0のほうのスタックに)PUSHします。そしてそれからCSとEIPをPUSHして目的の関数へジャンプするわけです。・・・ということになると、RETFのほうもこれに対応することになります。RETFでは、先ほど説明したようにEIPとCSをPOPするのですが、そのときにCSの下位2bitを確認します。これが今のCSの下位2bitと同じなら特別なことは何もしません。しかしこれが違っていれば、「ああこれは呼び出し時にSSとESPを切り替えたんだな」と判断して、さらにESPとSSをPOPします。・・・でこのCSやSSがアプリ用のものであるのなら、これらは当然3をORしておかなければいけないのです。そうでないとつじつまが合いませんから。・・・お分かりいただけたでしょうか? -- K 2009-03-13 (金) 21:39:30
  • 下位2ビットが動作レベル(CPL)というのはわかっているつもりだったのですが、それらは自動で設定されると思い込んでいました。なのでRETFなどで特別に設定するのは何か特別なことをするためなのかもしれないと思っていたのです。わかりやすい説明のおかげで理解できました。忙しい中、ご回答ありがとうございました。 -- yudy 2009-03-14 (土) 13:55:09
  • 下位2ビットが動作レベル(CPL)というのはわかっているつもりだったのですが、それらは自動で設定されると思い込んでいました。なのでRETFなどで特別に設定するのは何か特別なことをするためなのかもしれないと思っていたのです。わかりやすい説明のおかげで理解できました。忙しい中、ご回答ありがとうございました。 -- yudy 2009-03-14 (土) 20:58:26

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: 2009-11-18 (水) 08:25:36 (3673d)