首頁>Club>
5
回覆列表
  • 1 # 愛達人程式設計達人

    雖然說彙編是一門獨立的語言,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所示。

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

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

    以上是一個完整的函式呼叫,也是“Hello World!”程式的執行原理。

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

    3.5.2【內聯彙編】

    內聯彙編格式:

    __asm

    {

    }

    我們在裡面新增一些程式碼:

    #include <stdio.h>

    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 <stdio.h>

    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語言之前講的原因。

  • 2 # 大學生程式設計指南

    程式語言裡面很少有人直接說出精通兩個字,特別是一些入行好多年的程式設計師,從語法來講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語言已經過時了或者不行的話,如果是這樣代表真的不懂程式設計。

  • 3 # 散居獵人

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

  • 4 # kevinlq

    實力回答一波!

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

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

  • 5 # 日衝資訊 黃

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

  • 6 # 導盲小Q

    不一定要懂彙編,至少不需要先學習彙編。

    彙編對分析底層驅動有一定幫助,尤其是嵌入式開發。

    彙編並不難,每個晶片平臺定義的彙編指令千差萬別。 因專案需要,臨時去翻指令理解也來得及,沒有必要去強記。

    要學的東西太多,在彙編上花費太多精力沒有必要。

  • 7 # 鍵盤上的信仰

    2、建議在linux下用gcc學習c語言,c語言是一門系統級語言,只要掌握了指標,就可以很靈活的控制記憶體和程式流程;

    3、c語言的很多庫都是透過指標對外提供api;

    4、很多嵌入式晶片都有提供c語言的庫封裝;多執行緒庫在不同的平臺和晶片庫裡面有不同的實現方式;記得以前做arduino的時候,多執行緒要自己控制中斷;而lpc2368的armv7架構的多執行緒是用mailbox方式實現。只要掌握了linux平臺的gcc的c語言,就能很輕鬆的進行不同晶片的嵌入式開發。

    5、原來開發lpc2368的bootloader的時候,官方的例子是彙編,而我直接用c語言的指標實現了同樣的功能。

  • 中秋節和大豐收的關聯?
  • 巔峰時期的關羽,能做到速斬龐德嗎?