上一节介绍了较复杂数据类型及顺序语句生成的汇编代码,而这一节将会介绍分支语句和循环语句如何生成汇编代码。
直接看例程
对于简单的分支结构语句如
例1:
{
int i;
if (i >= 0)
i *= 2;
i = 10;
}
假如 i地址存储于寄存器R1中,则生成汇编代码为:
R2 = M[R1] ; load value of i into R2
BLT R2, 0, PC+12 ; if value < 0, skip to instr 12 bytes past current
R3 = R2 * 2 ; multiply i by 2
M[R1] = R3 ; store result back in i
M[R1] = 10 ; assign i constant value 10
首先把i的值Load到寄存器R2中,然后判断i的值,如果小于0,则使PC寄存器加上相应偏移量直接跳转到M[R1] = 10执行,否则顺序执行。
for循环
例2:
{
char ch;
int i;
for (i = 0; i < 10; i++)
ch = 'a'; // silly, just to have something in loop body
i = 25;
}
假设 i 存储于寄存器R1中, ch 的地址则为 R1 + 4,
则生成汇编代码为:
M[R1] = 0 ; initialize i to value 0
R2 = M[R1] ; load value of i into R2 (TOP of loop)
BGE R2, 10, PC+20 ; if value >= 10, get out of loop
M[R1 + 4] =.1 97 ; store 'a' in ch
R2 = R2 + 1 ; add one to value of i
M[R1] = R2 ; store result back in i
JMP PC-20 ; jump back to top of loop (BOTTOM of loop)
M[R1] = 25 ; assign i constant value 25
注意到此汇编中除了条件检测,还加入了无条件跳转指令JMP,以实现循环。
另外对于如下C代码,
{
char ch;
int i;
i = 0;
while (i < 10) {
ch = 'a';
i++;
}
i = 25;
}
可生成同例2中完全相同的汇编指令。
而对于以上的例程,细心的你会发现他们都是基于大括号内的复合语句生成的汇编代码,而当涉及到函数及函数调用时,又该如何生成汇编呢?
下一节中介绍。