第167回 素人くさいSICP読書会(at 月島某所)
- 会場提供&コーラ&お菓子ありがとうございました
- 参加者は弾さんを入れて7人と近年まれに見る盛況
- Mac6台+マシンなし1人。すなわちMac率100%
- 問題5.10
- すでに必要十分な命令があるのに新命令を考えなきゃならないということでみんな悩んでた
- 自分は前回の帰り道に思いついたswapを書いてみた
;; (swap reg1 reg2) (define (make-swap inst machine pc) (let ((reg1 (get-register machine (cadr inst))) (reg2 (get-register machine (caddr inst)))) (let ((value1 (lambda () (get-contents reg1))) (value2 (lambda () (get-contents reg2)))) (lambda () (set-contents! reg1 (value2)) (set-contents! reg2 (value1)) (advance-pc pc)))))
- 最初、get-contentsをlambdaで囲むのを忘れてた。hisaさんに指摘されて修正。むき出しだと初期状態のmachineでレジスタの値を読み出そうとしてしまう
- swapは意外に好評でちょっとうれしい
- ググったらARMにSWAP命令があった。メモリーとレジスタの間で値を交換するらしい
- 「XORを3回使えば一時変数なしで値を交換できる」(弾さん)。XOR交換アルゴリズム。同じ値を交換しようとするとゼロになってしまうのが欠点
- バイナリの話から「main=-277」で盛り上がった
- shinhさんの元ネタ
- 弾さんのエントリ
- Cでmain=-277をコンパイルして実行すると無限ループする。ただしx86限定
- この場合のmainは関数ではなくint型の変数。かつmainはエントリポイントなので、そこにある数字が機械語の命令として実行される。すなわち相対ジャンプで無限ループ
- gdbでディスアセンブルとか
- gccで警告maxにすると、コンパイル時に警告は出る
- 参加者6人で久しぶりにもんじゃ