2018年6月27日 星期三

指標,網路上資訊好亂喔(1-1): 嵌入式 C&C++ 重點語法技術淺談[連載1] at ET-Lab(挖挖挖技術實驗室)

就跟標題一樣,近日,不、應該說長期以來很多網上討論區、論壇、各種影片等等,有時我點看了一下,其講法可能跟我所知道的 ANSI C89、C99或C11[註1],有些差異!!! 搞得我思考好亂喔。
這裡就我明確所知道的,且要完全遵守ANSI C89、C99或C11標準[註1]重要的更要對照C編譯後的組合語言比對一下驗證,這樣才能撥亂反正

首先第一個觀念,因編譯時有最佳化,C的變數不一定會佔記憶體空間,如果加上 & 用以取對應operand的位址時,就會佔記憶體空間。這裡貼出C99的一段敘述:
The unary & operator yields the address of its operand. If the operand has type "type",the result has type "pointer to type"。
程式碼解說:
int a=10;
  &a --> 會取得"pointer to type"的型態,那a 是int, 就會得到 a變數的位址,這位址是 int* 的型態(稍後解說)
 
1. 驗證 因編譯時有最佳化,C的變數不一定會佔記憶體空間:
一Cortex Mx C語言如下,

int fun1( int n1 )
{
  n1++;
  return n1;
}
int main(int a1)
{
  int x1;
  x1 = fun1( 10  );
  return x1+a1;
}

C語言跟組語對照如下,看圖說故事:


看到
0x0800046A F7FFFFF9  BL.W     fun1 (0x08000460), 會跳到0x08000460,

0x08000460 1C40      ADDS     r0,r0,#1
0x08000462 4770      BX       lr,    返回 0x0800046A 下一指令

0x0800046E 4603      MOV      r3,r0
0x08000470 1898      ADDS     r0,r3,r2  <--- 這行是 return x1+a1;

所以驗證了,C的變數不一定會佔記憶體空間,上面情況是以 暫存器 完成,加快執行速度

再用另一種編譯器(網路上online comliler),一C語言如下,
int main(int num)
{
   return num;
}
編譯成組語,就有利用堆疊區記憶體空間了(請參考暫存器 r7 ),看圖說故事:


沒有留言:

張貼留言

FPGA Verilog 的學習經驗,提供給要入門的新手

今天簡單說說 FPGA Verilog 的學習經驗,提供給要入門的新手: 1.對自己寫的FPGA Verilog程式,所生成的數位電路要心中有數。 這一點個人認為很重要,就正如寫 C語言,心中要能生成對應的組合語言一樣,我是這樣要求自己的。 雖然 FPGA Verilog語言...