このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

2008-09-01から1ヶ月間の記事一覧

構造体もけっこう意外だったりして

#include struct person { unsigned short age; char *name; } ichiro = {23, "SUZUKI Ichiro"};struct person2 { unsigned short age; char name[20]; } jiro = {20, "SUZUKI Jiro"};main() { printf("sizeof(ichiro) = %d\n", sizeof(ichiro)); printf("si…

配列は意外なところもある

#include int a[] = {1, 2, 3}; char b[] = {1, 2, 3};main() { printf("a = %x, &a = %x, sizeof(a) = %d\n", a, &a, sizeof(a)); printf("a[0] = %x, &a[0] = %x, sizeof(a[0]) = %d\n", a[0], &a[0], sizeof(a[0])); printf("b = %x, &b = %x, sizeof(b) …

再帰の秘密を覗いてみる

#include int x = 1; int i = 1;void rec(int c) { int i = 0; printf("(c = %d) &x = %p, &c = %p, &i = %p\n", c, &x, &c, &i); if (c rec(c - 1); }main() { int c = 5; printf("(main ) &x = %p, &c = %p, &i = %p\n", &x, &c, &i); rec(c); }

言い忘れている

不等号比較でも符号が関係するな。 やっぱり関係しないな。 ニブル、MSBとLSB、桁位置と桁数 符号ビットという言葉はある。 3本指で8、片手で32、両手で1K (1024)、両手両足で1M (1024*1024) 型とサイズの一覧表 http://d.hatena.ne.jp/m-hiyama-memo/200809…

偏圏(partial category)

部分的に演算が定義された圏もどきをプレ圏と呼んでいたが、この用語法は都合が悪いことが分かってきた。プレを「部分的に定義された」という意味の形容詞には使いにくい。例えば、部分的に定義されたモノイド圏をプレモノイド圏と呼ぶのはまずい。かといっ…

圏の組み合わせ幾何

いくつかのヒントを書く。高次セルを忘れる関手Cが高次圏だとして、|C|kはk次までのセルを考えた圏だとする。特に |C|0 = |C| = Obj(C) となる。|C|は忘却関手となり、次に述べるK(A)と随伴になる。このような随伴関係が一般化できないか。完全有向グラフAを…

レジスタの変化

レジスタ 命令 F ADD, SH*, EQ, GT, GE SP POP, PUSH, CALL, RET, OSP (Offset SP) FP CALL, RET IP J*, CALL, RET

どうしても必要な命令

定数生成 メモリからのロード、メモリへのストア レジスタ間転送 算術論理演算 比較演算(条件(condition)の生成) 無条件ジャンプ、条件ジャンプ Jamp and Link(呼び出し用) レジスタやスタックトップをターゲットとしたジャンプ(戻り用) 入出力 定数…

大きな戻り値

構造体は値としてやり取りできる(コンパイラがやってくれる) 呼ぶ側にバッファを準備してもらう。サイズも渡すのが吉。 呼ばれた側にある静的バッファを使う。マルチスレッドで無理がある。 呼ばれた側で動的メモリを確保して返す。free忘れで問題も起きる…

エラーの通知

エラーは起きないと仮定 正常値と異常値を戻り値で 大域変数にエラー情報 エラー変数を出力引数に 戻り値を出力引数に 構造的データを使う 例:num ::= [0-9]* (8桁まで) エラーはBAD_CHARとTOO_LONG。

いろいろなアドレス

int g[] = {1, 2};main(int argc) { int i = 1; int j = 2; char *pc = (char *)g; start: printf("g = %p\n", g); printf("&g[0] = %p\n", &g[0]); printf("&g[1] = %p\n", &g[1]); printf("g + 1 = %p\n", g + 1); printf("g + 2 = %p\n", g + 2); printf(…

トレードオフ

現状では: IP(命令ポインタ)、SP(スタックポインタ)、FP(フレームポインタ)、F(フラグ)を直接見ることもさわることはできない。 関数のプロローグコード、エピローグコードはほとんど不要。FPの保存、スタックのアンワインド(後かたづけ、たたむこ…

Toyアーキテクチャのヒント

単に箇条書きで羅列。 昔はスタックがない機械もあったらしい。まー、自前でも作れるが、メンドーだからスタックはあったほうがいい。 明確なコール/リターン命令がない機械もある。が、メンドーだからあったほうがいい。 コールで、戻り番地(当該命令の次…

低水準データ型

numeric character boolean

足し算/引き算について、知らなかったよ

被加数 + 加数 = 和 被減数 - 減数 = 差 augend + addend = sum minuend - subtrahend = diffrerence 英語ではオシリにendが付くのね(オシリだからそりゃendだろうって?)

バイトオーダーとか

ポインターとキャストが(いずれ)わかったら、出力結果(表示)を予測してみよう。 #include main() { unsigned char c4[4] = {0x01, 0x02, 0x03, 0x04}; unsigned short s2[2] = {0x0001, 0x0002}; char *str = "hello"; unsigned u1 = *(unsigned *)c4; u…

バイナリモドキのロケーション指定

バイナリモドキに、ロケーション指定を入れる。 Addr ::= Hex Hex Hex Hex Location ::= '@' Addr PseudoBin ::= (Delm | Byte | Repeat | FillUntil | Location)*

力学系とオートマトン

s:R×X→X を連続力学系 x' = s(t, x) だとする。S⊆X が横断的とは次のことだとする。 x∈S に対して、時間を十分短い区間(-ε, +ε)に制限すると、s(0, x)以外はSに入らない。 つまり、時刻0の付近の軌道はSと1点でしか交わらない。横断的なS上には、「部分的に…

またHelloプログラム

#include void print_word(unsigned w) { int i, c; for (i = 0; i >= 5) { putchar(65 + c); } }main() { print_word(0x3ee5ac87); putchar('\n'); } #include char g[] = "pmmfi";main() { char *p = g + 4; while (g (*p)--; write(1, p, 1); p--; } putc…

Erlangの例外

スライド、教訓的。 http://www.erlang.se/euc/04/carlsson_slides.pdf もうひとつ。 http://www.erlang.se/workshop/2004/exception.pdf

Helloプログラム

これだって Hello。イイカゲンにしなさい、ペシッ。 /* hello.c */unsigned g[2] = {0x6c6c6548, 0x000a216f};main() { int i = 0, c; while (c = i++[(char *)g]) putchar(c); }

変な動作

クイズ:なんでこんな動作をするのだろう? (これはイタズラコード; インテル32ビットCPU + gcc) /* trick.c */void bar() { printf("Hi, this is bar.\n"); printf("... byebye from bar.\n"); exit(0); }unsigned _bar = (unsigned)&bar;void foo(int a…

バイナリモドキ修正

バイナリモドキを少し修正。 2進数はなくてもいいや。 ニブル単位ではなくて、常にバイト単位で扱う。 Hex ::= [1-9A-Za-z] S ::= LF | CR | TAB | SPACE D ::= S | ',' Hex2 ::= Hex Hex Char ::= "'" [^\] EscapedChar ::= "'" '\'' [stnr'] Byte ::= Hex2…

備忘メモ

低水準の基本的な概念・用語 - 檜山正幸のキマイラ飼育記 メモ編 データをビット/バイトのレベルで観察する - 檜山正幸のキマイラ飼育記 メモ編 数とビット模様 - 檜山正幸のキマイラ飼育記 メモ編 符号が関係するのは、符号拡張と算術シフト(MSB保存シフ…

バイナリモドキ

テキストエディタで書けるバイナリ 空白類(間隔、タブ、改行、復帰)、カンマは無視される。 #から次の改行まではコメント、無視される。 データ表現 16進ニブル : [0-9a-fA-F] アスキー文字 : 'に続けて文字 エスケープ表現 : \[\stnr'] sは間隔文字 2進ニ…

2の補数、1の補数

「2の補数」、「1の補数」 -- もう最悪の用語法だな。 2の補数: 2n + 1 の補数の最上位ビット切り落とし 1の補数:(2n + 1 - 1) の補数 = ビットごとのNOT なんでこんな用語が生き残っているのだろう? 歴史的な遺物。代替表現がないのでそのままなのだろ…

BCPL

マーチン・リチャーズ(Martin Richards)本人が今でもメンテナンスしている。 http://www.cl.cam.ac.uk/~mr10/BCPL.html

8進数の扱いがチグハグ

リテラル 012 と Number("012")が違うのでビックリ。

レジスタ

レジスタはあんまり意識しなくていい。そもそも、レジスタが面倒だから高級言語があるわけだから。だが、次は知っていると納得する(知らないと困惑する)場面も多い。 演算はレジスタに入れてから行う。結果もレジスタに入る。 関数の戻り値は多くの場合レ…

unsignedが素敵な理由

代入やキャストやビット演算に際して、とても素直な振る舞いをする。符号付き、あるいは符号付き/符号なしが混じるとなんだか複雑になる。いちおうコンパイラは値(ビットパターンではない)を守ろうとがんばってくれるが、がんばりきれないときの挙動がよ…