上一節介紹了較複雜數據類型及順序語句生成的彙編代碼,而這一節將會介紹分支語句和循環語句如何生成彙編代碼。
直接看例程
對於簡單的分支結構語句如
例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中完全相同的彙編指令。
而對於以上的例程,細心的你會發現他們都是基於大括號內的複合語句生成的彙編代碼,而當涉及到函數及函數調用時,又該如何生成彙編呢?
下一節中介紹。