4: 2010-02-01 (月) 07:46:19 lina |
5: 2010-02-01 (月) 13:43:32 lina |
| | | |
| こんな感じに。 | | こんな感じに。 |
| + | |
| + | COLOR(blue){この構想には二つ意味がある。まず、現在はなにも引数をつけないと自動的にUsageが表示されるという仕様になっているんだけど、''なにも引数をつけない場合はディフォルトの設定で動作を始めてほしい''というアプリだってあるはずだ。(引数自体は持っている)そういう設計のアプリの場合、今のUsageの仕様はすこし不便ではないかと考えた。また当然、バージョン番号等を統一的に扱うような仕様にしておけば、小さくなるばかりではなく、説明や使い方を書く場合も最低限の文章で書くことができるはず。} |
| + | |
| + | -なぜそんなにバージョン番号を付けたがる!貴様それでも軍人か!!! |
| + | --民間人です。はいwww |
| + | --好きだから |
| + | --オイラ自身がいろんなツールを収集・整理する時に、バージョン番号がないものを調べる時に猛烈に苦労したから。どれが新しいのか古いのか。新しくたっていいとは限らない。新たなバグが入り込んでいる場合だってある。ファイルの日付なんてアテにならないし、コンパイラが変われば出てくるバイナリが変化することだってあるわけだし。 |
| | | |
| **バージョン番号の文字列の制限 [#o541cb97] | | **バージョン番号の文字列の制限 [#o541cb97] |
| ---typを0xffに(0xffはなんだろう?0xfeは文字列引数ってことらしいが・・・) | | ---typを0xffに(0xffはなんだろう?0xfeは文字列引数ってことらしいが・・・) |
| --次にforループはなにしてるんだろう? *main_argvって、たぶん与えられた引数(コマンドライン)丸々を格納している変数のポインタだと思うんだけど・・・文字列内に / か \ があったらargv0を一個増やす・・・いや違うなぁ | | --次にforループはなにしてるんだろう? *main_argvって、たぶん与えられた引数(コマンドライン)丸々を格納している変数のポインタだと思うんだけど・・・文字列内に / か \ があったらargv0を一個増やす・・・いや違うなぁ |
| + | |
| + | |
| + | ***煮詰まった・・・ [#s5ca9fbc] |
| + | ちょっと別の方向からアプローチしてみよう。 |
| + | |
| + | gas2naskのソースを見てみると、先頭で例のコマンドラインの設定をして、そのあと、g01_setcmdline関数を呼び出している。この関数はなにをやってくれてるんだろう??? |
| + | |
| + | んんん? guigui01.hを見てみると、この関数はdefineになってるなぁ・・・defineって、文字列置換だったよね?たしか??? |
| + | |
| + | #define g01_setcmdlin(p) __asm__ __volatile__("movl %%eax,%%edi\n\tcall |
| + | _g01_execcmd"::"a"(p):"%esi","%edi","cc") |
| + | |
| + | つーことは・・・・ |
| + | __asm__ __volatile__("movl %%eax,%%edi\n\tcall_g01_execcmd"::"a"(p):"%esi","%edi","cc") |
| + | これに置換された後コンパイルされるってこと・・・なのか? なんだべ? これ??? |
| + | |
| + | はっはあぁぁぁ・・・・・~ |
| + | わかったぞ! これはgcc由来の''インラインアセンブラ''の書き方だ! 分解して書いてみると・・・ |
| + | __asm__ __volatile__(" movl %%eax,%%edi |
| + | call_g01_execcmd"::"a"(p):"%esi","%edi","cc" |
| + | ) |
| + | うへぇ! 難しい・・・。 eaxの値をediに写し、g01_execcmdを呼び出している・・・のかな?? |
| + | |
| + | やっと見つけた。startup.ask内にやっとこさg01_execcmdを見つけた・・・ |
| + | |
| + | だめだあぁぁぁ・・・わっかんねえぇぇぇぇ・・・・ |
| + | |
| + | **func06_putusage() [#g9fc44c1] |
| + | この関数を見ていると、やっぱりどう見ても、例のコマンド定義の文字列はfunc06str構造体に格納されているらしい。この構造体は先のinitで初期化されているんだけど、どこでここに定義されたものが当て込まれているんだろう。その部分が解れば、特別なコードを使って「以下はバージョン番号」だよ!と定義できるはずなんだが・・・・ |