就跟標題一樣,近日,不、應該說長期以來很多網上討論區、論壇、各種影片等等,有時我點看了一下,其講法可能跟我所知道的 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 ),看圖說故事:
訂閱:
張貼留言 (Atom)
FPGA Verilog 的學習經驗,提供給要入門的新手
今天簡單說說 FPGA Verilog 的學習經驗,提供給要入門的新手: 1.對自己寫的FPGA Verilog程式,所生成的數位電路要心中有數。 這一點個人認為很重要,就正如寫 C語言,心中要能生成對應的組合語言一樣,我是這樣要求自己的。 雖然 FPGA Verilog語言...
-
今天簡單說說 FPGA Verilog 的學習經驗,提供給要入門的新手: 1.對自己寫的FPGA Verilog程式,所生成的數位電路要心中有數。 這一點個人認為很重要,就正如寫 C語言,心中要能生成對應的組合語言一樣,我是這樣要求自己的。 雖然 FPGA Verilog語言...
-
這影片是紀錄 【Python +OpenCV】Python 3 程式設計最佳入門到進階應用實戰工程師培訓班:基礎至進階語法+影像處理與辨識(OpenCV) 課程的DEMO部分,請參考相關網頁: 先決條件是必須先安裝好相關的程式: Python、Opencv。。。。。。 ...
-
使用Arduino完成 RFID 結合Keypad鍵,可控制門鎖(或開關)之應用系統 此範例參考自 Arduino 官網的RFID範例並改寫[註]。官網的周邊與我的有差異,所以需自行修改程式碼以符合我手上的硬體周邊。 此範例硬體系統有: 1. Arduino U...
沒有留言:
張貼留言