歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 從匯編來看C語言

從匯編來看C語言

日期:2017/3/1 9:07:25   编辑:Linux編程

一、 學習過程

從C語言的角度提出一些問題,這些問題再從匯編的角度考慮,還真的很有意思。

(1) 我們用高級語言編程時,一般不可能不用到變量,但是一定要用到變量嗎?還有這些變量從匯編的角度是怎麼實現的呢?畢竟寄存器和內存空間是不可能存儲一個變化的值的,要改變寄存器和內存空間的值,只有重新賦值。但是原來老師講過,變量的聲明是給變量名開辟一個固定大小的內存空間,所以聲明變量時一定要給定變量類型。如果不用變量的話,可以給每次要用到的參數重新賦值,但這樣就不能用循環等結構,會造成代碼重復冗長。

(2) C語言規定程序一定要從main函數開始運行,匯編規定程序要從end後面的標號(一般是start)開始運行,那麼這兩者有什麼聯系呢?是main函數在編譯時會變成start代碼段嗎?如果匯編裡end後面沒有標號,程序會從頂部從上到下開始執行,那麼如果C語言裡面沒有main函數,程序會由上到下執行嗎?匯編裡的start標號可以用其他標號代替,C語言裡可不可以用其他函數代替main函數呢?

(3) Printf函數可以接受不定量的參數,開始我覺得這沒什麼,但後來想了一下。我們自己定義的函數只能接受固定數量的參數,printf函數的這個功能是怎麼實現的呢?看了下函數原型,又查了下資料,printf使用了一種比較少見的語法叫“可變長參數”。但是我看了下資料介紹的實現可變長參數的宏VA_list如下:“(1)首先在函數裡定義一個VA_LIST類型的變量,這個變量是指向參數的指針;(2)然後用VA_START宏初始化剛定義的VA_LIST變量,這個宏的第二個參數是第一個可變參數的前一個參數,是一個固定的參數;(3)然後用VA_ARG返回可變的參數,VA_ARG的第二個參數是你要返回的參數的類型,如果函數有多個可變參數的,依次調用VA_ARG獲取各個參數;(4)最後用VA_END宏結束可變參數的獲取。”但是如果要自己寫一個printf()函數的話,我覺得對於我還是相當有難度的。

二、 解決的問題

(1) C語言程序一定要用到變量嗎?答:可以不用變量,但是用變量寫程序更加簡潔方便。

(2) C語言程序怎麼實現變量的功能的?答:聲明變量開辟內存空間再接受賦值。

(3) printf函數的接收參數數量不定的功能是怎麼實現的呢?答:使用可變長參數的語法。

三、 未解決的問題

(1) C語言編譯時函數是怎麼轉化函數代碼段地址的?

(2) 如果C語言裡面沒有main函數,程序會由上到下執行嗎?

(3) C語言裡可不可以用其他函數代替main函數呢?

四、 學習感想

我們往往為自己一貫的思想和別人的看法所束縛,這樣其實是很可悲的,而且更可悲的是我們平時沒有想法也沒有動力去搞清楚這些東西。只是簡單的會用就覺得這東西也就那樣了。但是其實簡單的東西也不簡單。Printf函數有那麼多人用,有多少注意到它與別的函數的不同呢?特別是在寫程序時,往往就是自己覺得最不可能出錯的地方錯了,結果把代碼翻來覆去看了多少遍也找不出bug來。我們平時在學習時,一定要注意細節,在編程時,思維一定要缜密,這樣才能減少錯誤,增加自己的效率。

Copyright © Linux教程網 All Rights Reserved