No Such Blog or Diary

«Prev || 1 | 2 | 3 |...| 1236 | 1237 | 1238 |...| 1282 | 1283 | 1284 || Next»

第25回高校生クイズ

パソコンで作業中にふと聞こえてきたので.

問題.パソコンのキーで
 'o' と一緒に押すとオープン
 's' と一緒に押すと保存
 'p' と一緒に押すと印刷
なのは?

これの答えは「コントロールキー」らしいのだが...

シフトイン(漢字変換開始)
インクリメンタルサーチ
カーソルを一行上に動かす

じゃないのかと言ってみたり.

自転車をリフレッシュ

昨日から前輪の空気が抜け続けとうとうぺしゃんこになってしまったので,ついでだからとタイヤ・チューブ・ブレーキシューを全とっかえ.前輪がスリックで後輪がブロックな状態に.にしてもブレーキの効きが異様に良くなってしまって危険だ...

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};

八月ももう終わり

論文の英訳して寝ようと思います.

PHPのあっぷろーだ

とある事情でアップローダが必要になったので,ついでだからと PHP の勉強のためにゼロから組んでみた.とにかくファイルをあげるだけでいいので名前を「あげるだけ」にしつつ適当に組んだはいいが,PHPはデバッグがしにくいことに後で気づき,実際デバッグに時間をむちゃくちゃとられた.とにかくセミコロン忘れて何も表示されないとかいうのがやたらと... ああ,面倒だ.とりあえずアップと削除ができるようになったから一段落.どっかにやっちゃう可能性が高いのでソースを置いておこう.

DirectX + LayeredWindow

WS_EX_LAYERED を指定して透明色を指定した上でその指定職を背景にしてDirect3Dで描画するとうまく背景をすかしたDirect3Dができるだろう,と考えて実験してみた.面倒なのでテスト用のソースは人からもらっといていろいろやってみたら,なぜかウィンドウの一部を画面外にするとうまくいくことを発見.何かのバグなのかなぁとか思ったりするけど面白い現象ではある.何とかうまくできないかなぁ,面白いねたになりそうな.

«Prev || 1 | 2 | 3 |...| 1236 | 1237 | 1238 |...| 1282 | 1283 | 1284 || Next»
Search
Feeds

Page Top