| 著作一覧 |
#includeをtest.cとしてstatic int size=16; int main(int argc, char* argv[]) { char buff[size]; strcpy(buff, "hello!"); puts(buff); return 0; }
gcc -S test.c
cat test.s
...今となってはオペランドがintelアセンブラと違って読みにくい……
.data
.balign 4
_size:
.long 16
...
movl _size, %eax #16をeaxに入れる
decl %eax #?
incl %eax #?
addl $15, %eax #0mod16にする
shrl $4, %eax # 続き
sall $4, %eax # 続き
movl %eax, -16(%ebp) # 引数を積む(?)
movl -16(%ebp), %eax # ? 無駄なコード(それともレジスタ渡しかも)
call __alloca # アロケーション
movl %esp, %ebx # espに結果が入るのか? というかallocaはespを指定したサイズだけ下へ進めるんだろう。
subl $8, %esp # ?
pushl $LC0 # "hello!"
pushl %ebx # buff
call _strcpy
addl $16, %esp # 引数×2と、その前にsubl $8した分らしい
subl $12, %esp # ? まただ
pushl %ebx # buff
call _puts
addl $16, %esp # 引数領域が0mod16になるようにしているのかな?
うーん、世の中変わったなぁ。
ジェズイットを見習え |