从汇编角度理解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中完全相同的汇编指令。


而对于以上的例程,细心的你会发现他们都是基于大括号内的复合语句生成的汇编代码,而当涉及到函数及函数调用时,又该如何生成汇编呢?

下一节中介绍。


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