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 バイトとなる。これであってるかな。