要想精通C語言,必須先學習彙編嗎?

愛達人編程達人


雖然說彙編是一門獨立的語言,C也是一門獨立的語言,它們看上去並沒有什麼聯繫,但是學習彙編可以幫助我們分析C語言程序的設計原理。要想精通C語言,必須先學習彙編才是正確的學習順序。

舉例:【“Hello World!”程序使用匯編表現】

使用“Hello World!”程序介紹,如圖3-5-1所示。

圖3-5-1中,我們只看到了C語言代碼,並沒有看到彙編,我們該怎麼查看呢?在Visual C++開發工具中,反彙編窗口,需要下斷點、按F7編譯、按F5調試運行才能切換到反彙編窗口。該如何下斷點哪?選中“int main(void)”這一行按F9,會在這一行代碼前出現一個紅色的圓點,說明已經斷下斷點,看圖3-5-2所示。【注:按F9下斷點只是在Visual C++開發工具中使用】

按F9下斷點後,我們接著按F7,讓程序編譯,程序通過編譯後再按F5調試,會出現如圖3-5-3所示。

出現圖3-5-3的界面之後,我們點擊鼠標左鍵,出現如圖3-5-4界面。

選擇Go To Disassembly,出現如圖3-5-5的界面,說明成功切換到反彙編窗口,按F10 一步一步執行。

看圖3-5-5中,有如下代碼示例:

以上是一個完整的函數調用,也是“Hello World!”程序的運行原理。

我們也可以在C語言程序中嵌入彙編,我們稱為內聯彙編。接下來介紹內聯彙編。

3.5.2【內聯彙編】

內聯彙編格式:

__asm

{

}


我們在裡面添加一些代碼:

#include

int main(void)

{

__asm

{

mov eax,eax

mov ecx,eax

mov edx,ecx

}

return 0;

}

我們在Visual C++中輸入代碼示例CH03_5_1,如圖3-5-6所示。

在main函數前下斷點,我們切換到反彙編窗口查看,如圖3-6-7所示。

圖3-6-7中的C語言代碼和彙編代碼如下:

1: #include

2: int main(void)

3: {

00401010 push ebp

00401011 mov ebp,esp

00401013 sub esp,40h

00401016 push ebx

00401017 push esi

00401018 push edi

00401019 lea edi,[ebp-40h]

0040101C mov ecx,10h

00401021 mov eax,0CCCCCCCCh

00401026 rep stos dword ptr [edi]

4: __asm

5: {

6: mov eax,eax

00401028 mov eax,eax

7: mov ecx,eax

0040102A mov ecx,eax

8: mov edx,ecx

0040102C mov edx,ecx

9: }

10: return 0;

0040102E xor eax,eax

11: }

00401030 pop edi

00401031 pop esi

00401032 pop ebx

00401033 add esp,40h

00401036 cmp ebp,esp

00401038 call __chkesp (00401050)

0040103D mov esp,ebp

0040103F pop ebp

00401040 ret

總結“Hello World!”程序一共只寫了9行代碼,而編譯器自動生成了很多彙編指令,同樣“CH03_5_1”中的程序也只有短短的11行代碼,編譯器也自動生成了很多彙編指令,雖說彙編指令可以讓我們知道自己寫的程序運行過程的原理,但是沒有C語言更直觀的體現出我們想要的結果。簡而言之,彙編語言更傾向於描述程序運行的過程,C語言更傾向於描述結果。

如果我們把程序運行的過程搞清楚,那麼肯定能分析出程序的結果,反之,如果只知道程序的結果並不知道程序運行中是怎樣一步一步實現的,那隻能說我們並沒有真正的學會C語言。所以這就是我們課程為什麼學習彙編,為什麼把彙編放在C語言之前講的原因。

當然這只是在下一己之見,歡迎大家一起來討論。


愛達人編程達人


編程語言裡面很少有人直接說出精通兩個字,特別是一些入行好多年的程序員,從語法來講C語言相對來講入門還是比較容易,在高級語言還沒有完全展開的年代,C語言算入門比較簡單的編程語言了,起碼要比語法細節繁雜的C++好太多了,現在很多做應用開發的程序員覺得能寫C語言的都是高手,這完全是一種這山看著那山高的心態了,做C語言還覺得高級語言編程模式複雜,現在越來越多的編程入門人員已經不選擇C語言作為入門語言覺得太難了,對於面向過程語言開發的C語言為什麼讓很多人覺得很難?

1.C語言硬件搭界由於很多人對硬件不熟悉,讓很多人覺得諱莫如深

2.C語言由於指針的存在很多人覺得難以理解,覺得很難。

但是大部分老程序員覺得C語言是一門相對入手比較容易的編程語言,但現在編程向著集成化的方向發展,相比較而言C語言顯得難了許多。

越是工作年限長的老程序員越是不輕易說出精通兩個字,C語言直接底層屬於彙編,彙編不僅僅是C語言的基礎,也是計算機運行的基石,如果真是一位精通C語言的高手,那麼對於彙編不說很熟悉,起碼會懂常見的語法,因為C語言調試過程中遇到的一些奇怪的現象,拿不準的情況深入到彙編層面就很容易解決問題。所以想更好的學好C語言,對於彙編語言還是需要多少了解一點。

但如果一定說只有學好彙編才能學好C語言,這種因果關係是不存在的,本來就是就屬於兩種不同的編程語言,在有些地方存在一些交集而已,比如對性能要求非常大的地方,直接在C語言裡面調用匯編來實現,這種在很多地方都使用過。

從市場上對於C語言的需求量依然很大,但對於比例相比別的語言少了許多,不是說C語言不重要了,主要是現在應用方便編程的需求更大,在很多領域C語言還是首選,通訊領域,操作系統,嵌入式開發等等還會選擇C語言,而且現在很多主流的編程語言的底層就是C語言來完成的,如果喊著C語言已經過時了或者不行的話,如果是這樣代表真的不懂編程。

希望能幫到你。


大學生編程指南


完全不需要!請把精力放在算法實現,模型建立,API調用,人機界面,網絡與通信等有用的地方。CPU發展很快,自己寫那幾句彙編比編譯器高明不了多少。做應用軟件開發,根本不需要彙編。你要是打算做操作系統等系統軟件,那倒是真得結合目標CPU好好研究彙編。


散居獵人


不是必須的,但有幫助。程序經過編譯基本上就是彙編語言的形態了。嚴格說,是二進制數據,彙編是把二進制的指令用詞語表現出來而已。如果理解了彙編你就能輕鬆理解C的指針是個什麼鬼,它加來加去的到底是在幹什麼。為什麼要編譯,什麼是鏈接。為什麼C要有主函數,為什麼變量要定義類型,函數是怎麼回事。


日衝信息 黃


實力回答一波!

不需要!不需要!不需要!重要的事情說三遍。

如果你自己對彙編感興趣,就當我沒說,限於時間可以看看。


分享到:


相關文章: