0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式開發(fā)還有必要學(xué)匯編嗎?

strongerHuang ? 來源:嵌入式專欄 ? 2023-07-10 11:22 ? 次閱讀

關(guān)注+星標(biāo)公眾,不錯過精彩內(nèi)容

最近又看到關(guān)于【嵌入式開發(fā)有沒有必要學(xué)匯編話題。 我覺得學(xué)匯編有學(xué)匯編的道理,不學(xué)也有不學(xué)的道理,這個很正常。不同的人有不同的觀點(diǎn),討論激烈也很正常。 現(xiàn)在可能很少看到匯編程序了,但單片機(jī)的啟動文件、RTOS底層等一些地方,依然還有匯編代碼的身影。 不知道大家有沒有學(xué)過匯編,或者有沒有用匯編語言編過程? 下面結(jié)合我學(xué)習(xí)匯編的經(jīng)歷,以及匯編點(diǎn)燈給大家說說。

學(xué)習(xí)匯編語言

我在2010年學(xué)習(xí)單片機(jī)編程的時候,老師教學(xué)都還是用匯編教我們,包括教學(xué)實驗,也是要求我們用匯編寫程序。
MOV  A,#00H
MOV  P1,A
我記得那會兒,老師要求我們把匯編指令背下來。雖然現(xiàn)在很多匯編指令寫不出來了,但看到很多匯編代碼,還是基本明白它的意思。 以前計算機(jī)三級(PC技術(shù))的上機(jī)考試,就是用匯編編程,我那個時候上機(jī)考試還是滿分。當(dāng)時覺得自己很牛逼,現(xiàn)在看來就是一菜鳥

匯編轉(zhuǎn)C語言

剛開始學(xué)習(xí)匯編那會兒,我真的用匯編在51單片機(jī)上寫流水燈程序。后面看了用C語言寫流水燈程序,突然發(fā)現(xiàn),哇,用C語言寫程序還能這么簡單、方便。 于是,我就那個時候開始放棄了匯編,轉(zhuǎn)向了C語言。包括后面我在大學(xué)實驗室自己學(xué)習(xí)、DIY做東西、以及后面的全國大學(xué)生電子設(shè)計競賽,都是用C語言編寫的程序。 10行匯編程序,可能只需要一行C語言代碼就能實現(xiàn),這是C語言相比匯編簡化的優(yōu)點(diǎn)。 但是,C語言編寫的程序,經(jīng)過編譯,也會轉(zhuǎn)為匯編。比如我們在線調(diào)試代碼的時候,會看到類似的“匯編窗口”:0c18daa0-1eca-11ee-962d-dac502259ad0.png ?因為以前單片機(jī)的運(yùn)行速度不高,且內(nèi)存和Flash容量不大,要求節(jié)約程序空間。 所以使用匯編的優(yōu)點(diǎn):代碼運(yùn)行效率更高、更節(jié)約代碼存儲空間。

對比匯編和C語言點(diǎn)燈程序

匯編語言寫程序的主要缺點(diǎn):語法復(fù)雜、可讀性差等。 下面分享一個實例:51單片機(jī)上的流水燈程序。分別用C語言和編寫出來,大家對比一下就知道了。 C語言版:
/******************** 宏定義 **************************/
#define   MAIN_Fosc    22118400L  //定義主時鐘


/******************** 延時函數(shù) **************************/
void  delay_ms(u8 ms)
{
     u16 i;
   do{
        i = MAIN_Fosc / 13000;
      while(--i)  ;   //14T per loop
     }while(--ms);
}


/******************** 主函數(shù) **************************/
void main(void)
{
  P0M1 = 0;  P0M0 = 0;  //設(shè)置為準(zhǔn)雙向口
  P1M1 = 0;  P1M0 = 0;  //設(shè)置為準(zhǔn)雙向口
  P2M1 = 0;  P2M0 = 0;  //設(shè)置為準(zhǔn)雙向口
  P3M1 = 0;  P3M0 = 0;  //設(shè)置為準(zhǔn)雙向口
  P4M1 = 0;  P4M0 = 0;  //設(shè)置為準(zhǔn)雙向口
  P5M1 = 0;  P5M0 = 0;  //設(shè)置為準(zhǔn)雙向口
  P6M1 = 0;  P6M0 = 0;  //設(shè)置為準(zhǔn)雙向口
  P7M1 = 0;  P7M0 = 0;  //設(shè)置為準(zhǔn)雙向口


  while(1)
  {
    P17 = 0;
    delay_ms(250);
    delay_ms(250);
    P17 = 1;
    P16 = 0;
    delay_ms(250);
    delay_ms(250);
    P16 = 1;
    P47 = 0;
    delay_ms(250);
    delay_ms(250);
    P47 = 1;
    P46 = 0;
    delay_ms(250);
    delay_ms(250);
    P46 = 1;
  }
}
匯編語言版:
;******************** 宏定義 **************************/
Fosc_KHZ  EQU  22118  ;22118KHZ


STACK_POIRTER  EQU    0D0H  ;堆棧開始地質(zhì)




;******************** 延時函數(shù) **************************/
F_delay_ms:
  PUSH  02H    ;入棧R2
  PUSH  03H    ;入棧R3
  PUSH  04H    ;入棧R4


  MOV    R2,A


L_delay_ms_1:
  MOV    R3, #HIGH (Fosc_KHZ / 13)
  MOV    R4, #LOW (Fosc_KHZ / 13)
  
L_delay_ms_2:
  MOV    A, R4      ;1T    Total 13T/loop
  DEC    R4        ;2T
  JNZ    L_delay_ms_3  ;4T
  DEC    R3
L_delay_ms_3:
  DEC    A        ;1T
  ORL    A, R3      ;1T
  JNZ    L_delay_ms_2  ;4T
  
  DJNZ  R2, L_delay_ms_1


  POP    04H    ;出棧R2
  POP    03H    ;出棧R3
  POP    02H    ;出棧R4
  RET




;******************** 主程序 **************************/
    ORG    0100H    ;reset
F_Main:
  CLR    A
  MOV    P0M1, A   ;設(shè)置為準(zhǔn)雙向口
   MOV    P0M0, A
  MOV    P1M1, A   ;設(shè)置為準(zhǔn)雙向口
   MOV    P1M0, A
  MOV    P2M1, A   ;設(shè)置為準(zhǔn)雙向口
   MOV    P2M0, A
  MOV    P3M1, A   ;設(shè)置為準(zhǔn)雙向口
   MOV    P3M0, A
  MOV    P4M1, A   ;設(shè)置為準(zhǔn)雙向口
   MOV    P4M0, A
  MOV    P5M1, A   ;設(shè)置為準(zhǔn)雙向口
   MOV    P5M0, A
  MOV    P6M1, A   ;設(shè)置為準(zhǔn)雙向口
   MOV    P6M0, A
  MOV    P7M1, A   ;設(shè)置為準(zhǔn)雙向口
   MOV    P7M0, A


  MOV    SP, #STACK_POIRTER
  MOV    PSW, #0    ;選擇第0組R0~R7


L_MainLoop:
  CLR    P1.7
  MOV    A, #250
  LCALL  F_delay_ms    ;延時250ms
  LCALL  F_delay_ms    ;延時250ms
  SETB  P1.7


  CLR    P1.6
  MOV    A, #250
  LCALL  F_delay_ms    ;延時250ms
  LCALL  F_delay_ms    ;延時250ms
  SETB  P1.6


  CLR    P4.7
  MOV    A, #250
  LCALL  F_delay_ms    ;延時250ms
  LCALL  F_delay_ms    ;延時250ms
  SETB  P4.7


  CLR    P4.6
  MOV    A, #250
  LCALL  F_delay_ms    ;延時250ms
  LCALL  F_delay_ms    ;延時250ms
  SETB  P4.6


  SJMP  L_MainLoop
上面兩個程序,實現(xiàn)的功能都一樣(流水燈),但對比代碼,大家發(fā)現(xiàn)有啥區(qū)別? 對于有匯編基礎(chǔ)的同學(xué)來說,可能這個簡單的流水燈程序還是很好理解。 但是,對于大部分人來說,肯定都會覺得匯編很難讀。是的,這個是匯編的“特點(diǎn)”。

最后

匯編語法,對于絕大部分讀者來說,我現(xiàn)在是不建議再深入學(xué)習(xí)了,只需要了解一些基礎(chǔ)的內(nèi)容即可。 有少部分人,想從事底層開發(fā),比如底層驅(qū)動、單片機(jī)驗證、固件庫開發(fā)等這些讀者,有時間還是可以進(jìn)一步了解匯編的一些技術(shù)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134087
  • 嵌入式開發(fā)
    +關(guān)注

    關(guān)注

    18

    文章

    1006

    瀏覽量

    47352
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4671

    瀏覽量

    67767

原文標(biāo)題:嵌入式開發(fā)還有必要學(xué)匯編嗎?

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    學(xué)嵌入式軟件開發(fā)需要些什么知識??

    CE。linux C linux shell 等都要會。另外,嵌入式肯定要學(xué)的是arm,因為要以arm為平臺開發(fā)項目。還有就是QTdesigner ,是做圖形化界面用的,
    發(fā)表于 09-30 09:32

    嵌入式開發(fā)學(xué)什么內(nèi)容 嵌入式開發(fā)學(xué)習(xí)路線介紹

    ,創(chuàng)客學(xué)院嵌入式開發(fā)講師在這里介紹嵌入式開發(fā)學(xué)習(xí)路線,希望對于嵌入式開發(fā)學(xué)習(xí)內(nèi)容不了解的讀者可以有所幫助?! ?b class='flag-5'>嵌入式開發(fā)要學(xué)什么內(nèi)容
    發(fā)表于 03-01 10:13

    嵌入式開發(fā)學(xué)什么內(nèi)容 嵌入式開發(fā)學(xué)習(xí)路線介紹

    客學(xué)院嵌入式開發(fā)講師在這里介紹嵌入式開發(fā)學(xué)習(xí)路線,希望對于嵌入式開發(fā)學(xué)習(xí)內(nèi)容不了解的讀者可以有所幫助。嵌入式開發(fā)學(xué)什么內(nèi)容
    發(fā)表于 06-30 10:07

    嵌入式開發(fā)學(xué)什么內(nèi)容 嵌入式開發(fā)學(xué)習(xí)路線介紹

    學(xué)院嵌入式開發(fā)講師在這里介紹嵌入式開發(fā)學(xué)習(xí)路線,希望對于嵌入式開發(fā)學(xué)習(xí)內(nèi)容不了解的讀者可以有所幫助。嵌入式開發(fā)學(xué)什么內(nèi)容
    發(fā)表于 07-27 09:49

    嵌入式開發(fā)學(xué)什么?

      隨著智能硬件的迅速發(fā)展,越來越多的人把目光投向了嵌入式開發(fā),想要更快進(jìn)入嵌入式開發(fā)領(lǐng)域,先來了解一下嵌入式開發(fā)學(xué)什么?  以下是學(xué)員總結(jié)的心得,具體
    發(fā)表于 09-06 16:21

    嵌入式開發(fā)學(xué)什么

    。嵌入式開發(fā)學(xué)哪些,嵌入式可以簡單分為硬件與軟件,然而其中的知識體系卻是異常的龐大,這也是眾多新手望而卻步的一個原因,那究竟要如何才能成為一名嵌入式大咖呢?
    發(fā)表于 01-18 06:36

    嵌入式開發(fā)的基礎(chǔ)知識和入門必要步驟

    ARM嵌入式開發(fā)嵌入式開發(fā)領(lǐng)略比較熱門的技術(shù),本文針對ARM嵌入式開發(fā)的入門者給出嵌入式開發(fā)的基礎(chǔ)知識和入門必要步驟。1. 做個最小系統(tǒng)板
    發(fā)表于 12-14 07:32

    嵌入式開發(fā)

    嵌入式開發(fā)就是指在嵌入式操作系統(tǒng)下進(jìn)行開發(fā),嵌入式Linux是以Linux為基礎(chǔ)的嵌入式作業(yè)系統(tǒng)。這里提供了
    發(fā)表于 12-20 13:21
    <b class='flag-5'>嵌入式開發(fā)</b>

    學(xué)嵌入式開發(fā)入門_學(xué)嵌入式開發(fā)需要看哪些書籍

    現(xiàn)在嵌入式開發(fā)越來越吃香,很多人都想要學(xué)習(xí)卻不知道要從何下手。本文分析了學(xué)習(xí)嵌入式軟件開發(fā)需要具備哪些基本知識和技能,開發(fā)學(xué)習(xí)的基本步驟,并給出了各種參考資料及網(wǎng)站,同時小編還推薦了學(xué)
    的頭像 發(fā)表于 04-04 10:25 ?2.4w次閱讀

    什么是嵌入式開發(fā)板_學(xué)嵌入式用什么開發(fā)

    本文首先介紹了嵌入式開發(fā)板的功能作用,其次闡述了學(xué)嵌入式用什么開發(fā)板,分別推薦了fs4412開發(fā)板、mini2440
    發(fā)表于 05-18 11:14 ?6963次閱讀

    嵌入式開發(fā)學(xué)什么嵌入式開發(fā)的一些入門教材推薦

    本文檔的主要內(nèi)容詳細(xì)介紹的是嵌入式開發(fā)學(xué)什么嵌入式開發(fā)的一些入門教材推薦資料免費(fèi)下載教材包括了:ARM嵌入式項目開發(fā)三位一體實戰(zhàn)精講,C
    發(fā)表于 01-10 14:46 ?27次下載
    <b class='flag-5'>嵌入式開發(fā)</b>要<b class='flag-5'>學(xué)</b>什么<b class='flag-5'>嵌入式開發(fā)</b>的一些入門教材推薦

    嵌入式開發(fā)的產(chǎn)品有哪些_嵌入式開發(fā)的流程

    本文主要闡述了嵌入式開發(fā)的產(chǎn)品,其次介紹了嵌入式開發(fā)的流程。
    發(fā)表于 08-31 15:38 ?1.1w次閱讀

    嵌入式開發(fā)資料免費(fèi)分享

    嵌入式開發(fā)資料免費(fèi)分享嵌入式工程師經(jīng)驗分享:如何學(xué)習(xí)嵌入式開發(fā)截取文檔部分學(xué)習(xí)嵌入式工程師經(jīng)驗分享的資料分享給大家,文檔上從、嵌入式系統(tǒng)的概
    發(fā)表于 10-21 11:07 ?46次下載
    <b class='flag-5'>嵌入式開發(fā)</b>資料免費(fèi)分享

    嵌入式開發(fā)培訓(xùn)學(xué)什么?嵌入式開發(fā)板知識講解

    嵌入式開發(fā)就是指在嵌入式操作系統(tǒng)下進(jìn)行開發(fā),一般常用的系統(tǒng)有WinCE,ucos,vxworks,linux,android等。另外,用c,c++或匯編
    發(fā)表于 11-02 20:21 ?16次下載
    <b class='flag-5'>嵌入式開發(fā)</b>培訓(xùn)<b class='flag-5'>學(xué)</b>什么?<b class='flag-5'>嵌入式開發(fā)</b>板知識講解

    嵌入式學(xué)習(xí)培訓(xùn)能學(xué)會嗎?嵌入式開發(fā)培訓(xùn)都要學(xué)什么?

    嵌入式學(xué)習(xí)培訓(xùn)能學(xué)會嗎?嵌入式開發(fā)培訓(xùn)都要學(xué)什么?掌握Linux常用操作命令,與系統(tǒng)管理;理解嵌入式系統(tǒng)進(jìn)程管理,文件管理,Linux內(nèi)核;熟悉ARM在不同硬件平臺下的操作系統(tǒng)移植和設(shè)
    發(fā)表于 11-03 10:06 ?15次下載
    <b class='flag-5'>嵌入式</b>學(xué)習(xí)培訓(xùn)能學(xué)會嗎?<b class='flag-5'>嵌入式開發(fā)</b>培訓(xùn)都要<b class='flag-5'>學(xué)</b>什么?