int fn(int);
int main()
{
int a=10; subq $8, %rsp
int b=15; movl $20, %edi //c=20
int c=20; call fn
int d; leal 1(%rax), %edi //b=a+1
a=fn(c); call fn
b=a+1; movl $0, %eax //return 0
d=fn(b); addq $8, %rsp
}
int fn(int);
int main() main:
{ subq $24, %rsp
volatile int a=10; movl $10, (%rsp) //a=10
volatile int b=15; movl $15, 4(%rsp) //b=15
volatile int c=20; movl $20, 8(%rsp) //c=20
volatile int d; movl 8(%rsp), %edi //fn(c)
call fn
a=fn(c); movl %eax, (%rsp) //a=fn(c)
b=a+1; movl (%rsp), %eax //b=a
d=fn(b); addl $1, %eax //b=b+1
} movl %eax, 4(%rsp) //写回
movl 4(%rsp), %edi //fn(b)
call fn
movl %eax, 12(%rsp)
movl $0, %eax
addq $24, %rsp
ret
小结:
用volatile声明的变量,每次使用的时候都会重新从内存中读取其值,比如第二
个例子中的变量b,在第二次调用fn()的时候,并不是从寄存器eax中将值传递给
fn,而是从寄存器中重新读取,在第一个例子中是直接将b的值传递到edi(edi
一般是函数第一个参数所在寄存器)。另外,对于声明volatile的变量,会阻止
编译器优化它,第一个例子中,其c程序中前面三段变量声明直接被优化了,而第
二个例子中,依然会声明。