No Such Blog or Diary
自転車をリフレッシュ
- 2005-09-02 (Fri)
- 一般
昨日から前輪の空気が抜け続けとうとうぺしゃんこになってしまったので,ついでだからとタイヤ・チューブ・ブレーキシューを全とっかえ.前輪がスリックで後輪がブロックな状態に.にしてもブレーキの効きが異様に良くなってしまって危険だ...
- Comments: 0
- TrackBack (Close): -
C言語のmain関数を変数として定義
なんとなく思いついたのでやってみた.C 言語で書いたプログラムの(ブートストラップ後の)エントリポイントは main 関数なわけだけど,アセンブラレベルでは結局のところ call main して main というラベルにとんでいるだけ.ということは,main は別にC言語の関数ではなく変数でもよい(main というラベルが作られる).これを実証するコードは以下のとおり.
こいつは HelloWorld を表示するが,main は関数でなく変数である.
#include <stdio.h> int f() { printf("HelloWorld!\n"); return 0; } int main[] = {0xB8909090, (int)f, 0x9090E0FF}; /* int main = 0xB8909090; int main2 = (int)f; int main3 = 0x9090E0FF; */ /* struct main { int m1; int m2; int m3; } main = {0xB8909090, (int)f, 0x9090E0FF}; */
main の定義をコメントアウトしている形(構造体,複数個の連続した変数)にしても動く.原理としては main というラベルに飛ばされてくるので,そこに関数本体である f へのジャンプを行うマシン語を埋め込んで f へジャンプさせる.ジャンプのコードはi386で
90 NOP 90 NOP 90 NOP B8 XXXXXXXX MOVE EAX, f FF E0 JMP EAX 90 NOP 90 NOP
とかけるので,これらのマシン後が実行されるように main 変数に値を入れている.
ついでに C++ 版も.
#include <cstdio> struct main { int ins[5]; static int f() { puts("HelloWorld!"); return 0; } } main = {0xB8909090, (int)(main::f), 0xE0FF};
- Comments: 0
- TrackBack (Close): -
PHPのあっぷろーだ
- 2005-08-30 (Tue)
- プログラミング
とある事情でアップローダが必要になったので,ついでだからと PHP の勉強のためにゼロから組んでみた.とにかくファイルをあげるだけでいいので名前を「あげるだけ」にしつつ適当に組んだはいいが,PHPはデバッグがしにくいことに後で気づき,実際デバッグに時間をむちゃくちゃとられた.とにかくセミコロン忘れて何も表示されないとかいうのがやたらと... ああ,面倒だ.とりあえずアップと削除ができるようになったから一段落.どっかにやっちゃう可能性が高いのでソースを置いておこう.
- Comments: 0
- TrackBack (Close): -
DirectX + LayeredWindow
WS_EX_LAYERED を指定して透明色を指定した上でその指定職を背景にしてDirect3Dで描画するとうまく背景をすかしたDirect3Dができるだろう,と考えて実験してみた.面倒なのでテスト用のソースは人からもらっといていろいろやってみたら,なぜかウィンドウの一部を画面外にするとうまくいくことを発見.何かのバグなのかなぁとか思ったりするけど面白い現象ではある.何とかうまくできないかなぁ,面白いねたになりそうな.
- Comments: 0
- TrackBack (Close): -