4章〜7章にまつわるQ&Aのまとめ

  • (by K, 2006.03.28)
  • いろいろQ&Aが集まったと思うので、ここにまとめておこうと思います。
  • ここで答えが見つからなければ、q_and_aへ!
  • makeに関する質問は faq/make にあります。

質問と答え

  • [p.83(COLUMN-4)] p[i]はi[p]と書いてもいいとか、a[2]を2[a]と書いてもいいなどといい加減なことが書いてあるが、厳密には違うのではないか?
    • いいえ。本文中で何度も念を押しているように、これは厳密に同じです。疑いたくなる気持ちがわからないではないですが、まずは自分で試してみたらどうでしょうか?(簡単に試したり改造したりできるように、CD-ROMを付録につけているのですから)。○○なので同じになるはずがないとか言っている人がたまにいますが、まずは論より証拠です。どんなにもっともらしい理由があっても、事実は事実なのですから。
  • [p.86(4-6)] staticをつけた場合とつけない場合の違いの理解に自信がないので、確認をかねてもう少し詳しく説明してほしい。
    • それでは、 char a[3] = { 1, 2, 3 }; と static char a[3] = { 1, 2, 3 }; を例に具体的にやってみます。
  • staticをつけない場合( char a[3] = { 1, 2, 3 }; ):
        (中略)
    a:
        RESB    3
    
        (中略)
    
        MOV     BYTE [a+0],1
        MOV     BYTE [a+1],2
        MOV     BYTE [a+2],3
    
        (中略)
    
    • このMOV命令はそれぞれ4バイト命令に翻訳されるだろう。だから char a[3] = { 1, 2, 3 }; は12バイトも消費することになる(実際はコンパイラの最適化のおかげでもう少し小さくなる場合がある。またコンパイラの最適化の都合で、「a」という名前は現れず、EBPを使った式に置換されている)。
  • staticをつけた場合( static char a[3] = { 1, 2, 3 }; ):
        (中略)
    a:
        DB      1,2,3
    
        (中略)
    
    • これだけ。だから3バイトしか消費しない。
  • いずれの場合も、a番地に1、a+1番地に2、a+2番地に3が入った状態になるという意味では同じ。でもどうせ同じ結果になるのなら、短い機械語でできたほうがいいでしょ?ここはそれだけの話。
  • [p.87(4-6)] set_paletteに io_out8(0x03c9, rgb[0] / 4); とあるが、この / 4 の意味は?
    • どうもすみません。その部分の説明を書いていませんでした(書いたつもりになっていました)。私たちは通常、輝度を00-ffつまり0〜255として扱っていますが、ビデオカードの標準状態では、輝度を0〜63の範囲で指定しなければいけないのです(63で255の明るさになる)。そのための割り算です。モードを変えれば普通の0〜255での指定ができるそうなのですが、めんどうなのでやっていません。
  • [p.93(4-7)] VRAMの番地で、0xa000+319+199*320=0xaf9ffと0xaffffの値の違いの意味は?
    • メモリマップ上ではVRAMは0xa0000〜0xaffffとなっています。しかし(319,199)の座標の画素に相当するのは0xaf9ff番地です。したがって0xa0000〜0xaf9ffを塗りつぶすだけで全画面に描画できます。
    • この食い違いはちょっとヘンです。では0xafa00番地に書き込んだらどうなるでしょうか。はい、何もおきません。でも書き込んだ値はもちろん記憶されます。つまりVRAMというメモリはあるのですが、画面外になってしまうので表示されないのです。おそらくもっと画素の多い画面モードになると、0xafa00〜0xaffffの内容も表示できるようになるのでしょう。
  • [p.154(7-7)] キーボードとマウスのデータ受け取り用ポートが同じなので心配がある。もしキーボード割り込みが起きて割り込みルーチンが io_out8(PIC0_OCW2, 0x61); を実行した直後にマウス割り込みが起きたらどうなるのか?
    • まずPICは割り込みの監視を再開してはいますが、CPUのIF(割り込み許可フラグ)はIRETDするまでは割り込み禁止のままになっているので、マウス割り込みルーチンは呼び出されません。IRETDが実行されるまで割り込みは待機になります(IRETDした瞬間にマウス割り込みルーチンへ行くことになる)。この仕組みがあるので、「処理の追い越し」が起きる心配はありません。
    • 次の心配はデータでしょう。キーボードコントローラの中にFIFOバッファが内蔵されていて、この場合はキーデータを読み出すまで、マウスからのデータはコントローラチップの中で保留されます。だからこれも大丈夫なのです。・・・逆にいうともしキー割り込みの処理関数が、1回の割り込みに対して2度もデータ受け取り用ポートをINしたりすると、誤動作してしまうことになります。

こめんと欄


コメントお名前NameLink

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: 2006-12-19 (火) 14:54:12 (5301d)