No Such Blog or Diary

«Prev || 1 | 2 | 3 |...| 1246 | 1247 | 1248 |...| 1292 | 1293 | 1294 || Next»

ICPCの問題を久々に

ある期間内に存在する指定した曜日と日にちをもつ日の数を数えたり,グラフ上を巡回するアリ全部に対して情報伝達可能かどうかをしらべたり.そんな問題を解いたわけだが... コーディングが遅くなっているような... 最近この手のプログラムかいとらんかったからなぁ.いや,むしろ日付問題が苦手なだけだだろうか? まあ,そんなことはどうでもよいのでさっさといやらしい入力を作るか.

永夜抄のデータ解析

友人がリプレイファイルの解析をやっていたのでデータファイルの解析をやってみた.結論としてはブロックに切ってスクランブルしてマスクでXORして,LZで圧縮かけて(アドレス13bit, 長さ4bit, 絶対アドレス(開始オフセット1)),全部をがしゃんとくっつけて最後にファイル名とアドレスと展開後のサイズの情報をまとめてLZかけてスクランブルしてくっつけてあると.んで,先頭には識別文字4つとファイル情報のエントリ数,アドレス,展開後のサイズがスクランブルされて格納されていると.

いやぁ,結構手間がかかってるもんだなぁと関心しつつ,ここまでやらなきゃだめなのかと思ったり.あと,LZのパラメータが何でこの数字になっているのかよくわからない.バイト境界になるようにアドレスと長さのビットを割り振って,さらにフラグを8つまとめて置いておくほうが展開が速いと思うのだが... そこまで速度はいらないのかな.むしろビットストリームのほうがぱっと見で元データがわからないからいいのかも.

どうでもいいけど,何でこの永夜抄のアーカイブに妖々夢のPhantasm出現時に表示される画像データが入っているのだろう?

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

八月ももう終わり

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

«Prev || 1 | 2 | 3 |...| 1246 | 1247 | 1248 |...| 1292 | 1293 | 1294 || Next»
Search
Feeds

Page Top