faq/c04-07
の編集
http://hrb.osask.jp/wiki/?faq/c04-07
[
リロード
|
差分
|
単語検索
|
一覧
] [
編集
|
バックアップ
|
添付
]
-- 雛形とするページ --
A
Akkie
Athlon64X2
Clover
DAsoran
Falcon
FormatRule
FrontPage
Genesis
Help
I
InterWikiName
InterWikiSandBox
InterWikiテクニカル
Jormungand
K
Kebo
Kor_Lee_Hee_Rak
Leaf
Linux
Linux/wako_memo
MOIZ99
MW
MenuBar
OSC
PG_MANA
ReadersOS
RecentDeleted
SKYDASH
SandBox
Sero
Sigle
Source
Triangle_Ld.
Zxcvbnm
advance
advance/CPU
advance/FDC
advance/FPU
advance/NotHariMain
advance/QEMUVGA
advance/RTC
advance/blike
advance/cpu_reset
advance/driver
advance/driver/01
advance/driver/02
advance/families
advance/filesystem
advance/fwrite
advance/hddboot
advance/he86
advance/hints
advance/ipl
advance/kernel
advance/keycode
advance/osselect
advance/smaller1
advance/startup
advnace/smaller2
anzy
aotatsu
banbi-
bluedwarf
bo
bugs
challengers
cybozulabsyouth11
deskmanta
esb02b
faq
faq/advance
faq/asm
faq/c00-03
faq/c04-07
faq/c08-15
faq/c16-23
faq/c24-31
faq/make
faq/others
faq/qemu
guide
guide03
guide05
guide07
hikarupsp
imp_log/0000
imp_log/0001
imp_log/0002
imp_log/0003
impressions
index
k
killer_elf
kota
lea
lea/10_memory
lea/4_color
lea/idea
lea/terms
links
logs
logs/osa_hrb/comments0000
logs/osa_hrb/rumors0000
masa
members
message
mistakes
moge32
moppoi5168
notice
osdevjp
populars
prog_index
projects
q_and_a
q_and_a_2
qa_log/0000
qa_log/0001
qa_log/0002
qa_log/0003
qa_log/0004
qa_log/0005
qa_log/0006
qa_log/0007
qa_log/0008
qa_log/0009
quark
rankings
rule
sakamoto
sasaki
spc09
spcc_30min_os
tatsu
tools
tools/bim2hrb
tools/bin2obj
tools/cc1
tools/edimg
tools/gas2nask
tools/makefont
tools/nask
tools/obj2bim
tools/sjisconv
uchan
uho
updates
violations
wako
white
win64-bit
x
ytakano
ヘルプ
リックス
質問します
整形ルール
本は買ったぞ!持ってるぞ!
練習用ページ
* 4章〜7章にまつわるQ&Aのまとめ -(by [[K]], 2006.03.28) -いろいろQ&Aが集まったと思うので、ここにまとめておこうと思います。 -ここで答えが見つからなければ、[[q_and_a]]へ! -makeに関する質問は [[faq/make]] にあります。 *** 質問と答え -COLOR(#0000ff){[p.83(COLUMN-4)] p[i]はi[p]と書いてもいいとか、a[2]を2[a]と書いてもいいなどといい加減なことが書いてあるが、厳密には違うのではないか?} --いいえ。本文中で何度も念を押しているように、これは厳密に同じです。疑いたくなる気持ちがわからないではないですが、まずは自分で試してみたらどうでしょうか?(簡単に試したり改造したりできるように、CD-ROMを付録につけているのですから)。○○なので同じになるはずがないとか言っている人がたまにいますが、まずは論より証拠です。どんなにもっともらしい理由があっても、事実は事実なのですから。 -COLOR(#0000ff){[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が入った状態になるという意味では同じ。でもどうせ同じ結果になるのなら、短い機械語でできたほうがいいでしょ?ここはそれだけの話。 -COLOR(#0000ff){[p.87(4-6)] set_paletteに io_out8(0x03c9, rgb[0] / 4); とあるが、この / 4 の意味は?} --どうもすみません。その部分の説明を書いていませんでした(書いたつもりになっていました)。私たちは通常、輝度を00-ffつまり0〜255として扱っていますが、ビデオカードの標準状態では、輝度を0〜63の範囲で指定しなければいけないのです(63で255の明るさになる)。そのための割り算です。モードを変えれば普通の0〜255での指定ができるそうなのですが、めんどうなのでやっていません。 -COLOR(#0000ff){[p.93(4-7)] VRAMの番地で、0xa000+319+199*320=0xaf9ffと0xaffffの値の違いの意味は?} --メモリマップ上ではVRAMは0xa0000〜0xaffffとなっています。しかし(319,199)の座標の画素に相当するのは0xaf9ff番地です。したがって0xa0000〜0xaf9ffを塗りつぶすだけで全画面に描画できます。 --この食い違いはちょっとヘンです。では0xafa00番地に書き込んだらどうなるでしょうか。はい、何もおきません。でも書き込んだ値はもちろん記憶されます。つまりVRAMというメモリはあるのですが、画面外になってしまうので表示されないのです。おそらくもっと画素の多い画面モードになると、0xafa00〜0xaffffの内容も表示できるようになるのでしょう。 -COLOR(#0000ff){[p.154(7-7)] キーボードとマウスのデータ受け取り用ポートが同じなので心配がある。もしキーボード割り込みが起きて割り込みルーチンが io_out8(PIC0_OCW2, 0x61); を実行した直後にマウス割り込みが起きたらどうなるのか?} --まずPICは割り込みの監視を再開してはいますが、CPUのIF(割り込み許可フラグ)はIRETDするまでは割り込み禁止のままになっているので、マウス割り込みルーチンは呼び出されません。IRETDが実行されるまで割り込みは待機になります(IRETDした瞬間にマウス割り込みルーチンへ行くことになる)。この仕組みがあるので、「処理の追い越し」が起きる心配はありません。 --次の心配はデータでしょう。キーボードコントローラの中にFIFOバッファが内蔵されていて、この場合はキーデータを読み出すまで、マウスからのデータはコントローラチップの中で保留されます。だからこれも大丈夫なのです。・・・逆にいうともしキー割り込みの処理関数が、1回の割り込みに対して2度もデータ受け取り用ポートをINしたりすると、誤動作してしまうことになります。 * こめんと欄 #comment
タイムスタンプを変更しない
* 4章〜7章にまつわるQ&Aのまとめ -(by [[K]], 2006.03.28) -いろいろQ&Aが集まったと思うので、ここにまとめておこうと思います。 -ここで答えが見つからなければ、[[q_and_a]]へ! -makeに関する質問は [[faq/make]] にあります。 *** 質問と答え -COLOR(#0000ff){[p.83(COLUMN-4)] p[i]はi[p]と書いてもいいとか、a[2]を2[a]と書いてもいいなどといい加減なことが書いてあるが、厳密には違うのではないか?} --いいえ。本文中で何度も念を押しているように、これは厳密に同じです。疑いたくなる気持ちがわからないではないですが、まずは自分で試してみたらどうでしょうか?(簡単に試したり改造したりできるように、CD-ROMを付録につけているのですから)。○○なので同じになるはずがないとか言っている人がたまにいますが、まずは論より証拠です。どんなにもっともらしい理由があっても、事実は事実なのですから。 -COLOR(#0000ff){[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が入った状態になるという意味では同じ。でもどうせ同じ結果になるのなら、短い機械語でできたほうがいいでしょ?ここはそれだけの話。 -COLOR(#0000ff){[p.87(4-6)] set_paletteに io_out8(0x03c9, rgb[0] / 4); とあるが、この / 4 の意味は?} --どうもすみません。その部分の説明を書いていませんでした(書いたつもりになっていました)。私たちは通常、輝度を00-ffつまり0〜255として扱っていますが、ビデオカードの標準状態では、輝度を0〜63の範囲で指定しなければいけないのです(63で255の明るさになる)。そのための割り算です。モードを変えれば普通の0〜255での指定ができるそうなのですが、めんどうなのでやっていません。 -COLOR(#0000ff){[p.93(4-7)] VRAMの番地で、0xa000+319+199*320=0xaf9ffと0xaffffの値の違いの意味は?} --メモリマップ上ではVRAMは0xa0000〜0xaffffとなっています。しかし(319,199)の座標の画素に相当するのは0xaf9ff番地です。したがって0xa0000〜0xaf9ffを塗りつぶすだけで全画面に描画できます。 --この食い違いはちょっとヘンです。では0xafa00番地に書き込んだらどうなるでしょうか。はい、何もおきません。でも書き込んだ値はもちろん記憶されます。つまりVRAMというメモリはあるのですが、画面外になってしまうので表示されないのです。おそらくもっと画素の多い画面モードになると、0xafa00〜0xaffffの内容も表示できるようになるのでしょう。 -COLOR(#0000ff){[p.154(7-7)] キーボードとマウスのデータ受け取り用ポートが同じなので心配がある。もしキーボード割り込みが起きて割り込みルーチンが io_out8(PIC0_OCW2, 0x61); を実行した直後にマウス割り込みが起きたらどうなるのか?} --まずPICは割り込みの監視を再開してはいますが、CPUのIF(割り込み許可フラグ)はIRETDするまでは割り込み禁止のままになっているので、マウス割り込みルーチンは呼び出されません。IRETDが実行されるまで割り込みは待機になります(IRETDした瞬間にマウス割り込みルーチンへ行くことになる)。この仕組みがあるので、「処理の追い越し」が起きる心配はありません。 --次の心配はデータでしょう。キーボードコントローラの中にFIFOバッファが内蔵されていて、この場合はキーデータを読み出すまで、マウスからのデータはコントローラチップの中で保留されます。だからこれも大丈夫なのです。・・・逆にいうともしキー割り込みの処理関数が、1回の割り込みに対して2度もデータ受け取り用ポートをINしたりすると、誤動作してしまうことになります。 * こめんと欄 #comment
テキスト整形のルールを表示する