上次的课中都是使用C代码生成汇编代码,这次课中将使用C++代码生成汇编代码,对比结果发现这两种语言最终生成的代码形式很像。
C语言版本:
void foo()
{
int x;
int y;
x=11;
y=17;
swap(&x,&y);
}
对应的汇编代码:
SP=SP-8;
M[SP+4]=11;
M[SP]=17;
R1=SP;//&y
R2=SP+4;//&x
SP=SP-8;
M[SP]=R2;
M[SP+4]=R1;
CALL<swap>;
SP=SP+8;//与第6行代码抵消
SP=SP+8;//与第1行代码抵消
RET;
活动记录示意图:
注意:
1.Saved PC中关联着调用foo的函数的相关信息,在其他某个函数的汇编指令流中会有一条call foo指令,saved PC的值就是直接位于这条call指令之后的指令地址。
2.在函数内部,在返回之前栈指针需要指向刚刚进入函数时的位置(即指向saved PC)。
3.RET指令通常会在函数体生成汇编代码最后一行&#x