愛達人編程達人
雖然說彙編是一門獨立的語言,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要有主函數,為什麼變量要定義類型,函數是怎麼回事。
日衝信息 黃
實力回答一波!
不需要!不需要!不需要!重要的事情說三遍。
如果你自己對彙編感興趣,就當我沒說,限於時間可以看看。