從彙編角度理解C語言(四) 原

上一節介紹了較複雜數據類型及順序語句生成的彙編代碼,而這一節將會介紹分支語句和循環語句如何生成彙編代碼。

直接看例程


對於簡單的分支結構語句如

例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中完全相同的彙編指令。


而對於以上的例程,細心的你會發現他們都是基於大括號內的複合語句生成的彙編代碼,而當涉及到函數及函數調用時,又該如何生成彙編呢?

下一節中介紹。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章