Scheme Compiler の勉強(35) - vector
vector 実装中。
movl %eax, %ebx addl $11, %ebx andl $-8, %ebx addl %ebx,%esi
11を足して-8とANDした値を%esiに足している?「align size to next object boundary」と書いているけど納得できないので手を動かして試してみた。
- まず %esi は、3ビットをタグに使うので、常に8の倍数に取る必要がある。こうしておかないとタグの値なのかアドレスなのか識別できない。
- コンスセルは car と cdr に4バイトずつ使うので合計8バイトでぴったり。
- vector はサイズn と実際にサイズ分確保するメモリで 4+n*4となる。nが奇数の場合はぴったりだけど、偶数の場合は4バイト余分に確保して調整する。
- %eax にはvectorのサイズn が格納される。あーこれはサイズnそのものじゃなくて、タグがついているのでnの4倍の値か。
- -8 は下3ビットが0。あとはビット演算の練習。えーと。電車の中でやってて大丈夫そうな気がしたけど、 logand 使ってプログラム書いて検算。
- サイズを1ずつ増やすと 8, 16, 16, 24, 24, 32, 32 バイトとなる。これであってるかな。