日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
用匯編和C語(yǔ)言寫流水燈程序

現(xiàn)在可能很少看到匯編程序了,但單片機(jī)的啟動(dòng)文件、RTOS底層代碼等一些地方,依然還有匯編代碼的身影。

專業(yè)從事成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè),高端網(wǎng)站制作設(shè)計(jì),微信小程序開發(fā),網(wǎng)站推廣的成都做網(wǎng)站的公司。優(yōu)秀技術(shù)團(tuán)隊(duì)竭力真誠(chéng)服務(wù),采用H5高端網(wǎng)站建設(shè)+CSS3前端渲染技術(shù),成都響應(yīng)式網(wǎng)站建設(shè),讓網(wǎng)站在手機(jī)、平板、PC、微信下都能呈現(xiàn)。建站過程建立專項(xiàng)小組,與您實(shí)時(shí)在線互動(dòng),隨時(shí)提供解決方案,暢聊想法和感受。

不知道大家有沒有學(xué)過匯編,或者有沒有用匯編語(yǔ)言編過程?

今天就給大家分享一下匯編語(yǔ)言的那些事。

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

我在10年學(xué)習(xí)單片機(jī)編程的時(shí)候,老師教學(xué)都還是用匯編教我們,包括教學(xué)實(shí)驗(yàn),也是要求我們用匯編寫程序。

 
 
 
 
  1. MOV  A,#00H 
  2. MOV  P1,A 

我記得那會(huì)兒,老師要求我們把匯編指令背下來(lái)。雖然現(xiàn)在很多匯編指令寫不出來(lái)了,但看到很多匯編代碼,還是基本明白它的意思。

以前計(jì)算機(jī)三級(jí)(PC技術(shù))的上機(jī)考試,就是用匯編編程,我那個(gè)時(shí)候上機(jī)考試還是滿分。當(dāng)時(shí)覺得自己很牛逼,現(xiàn)在看來(lái)就是一菜鳥圖片

2匯編轉(zhuǎn)C語(yǔ)言

剛開始學(xué)習(xí)匯編那會(huì)兒,我真的用匯編在51單片機(jī)上寫流水燈程序。后面看了用C語(yǔ)言寫流水燈程序,突然發(fā)現(xiàn),哇,用C語(yǔ)言寫程序還能這么簡(jiǎn)單、方便。

于是,我就那個(gè)時(shí)候開始放棄了匯編,轉(zhuǎn)向了C語(yǔ)言。包括后面我在大學(xué)實(shí)驗(yàn)室自己學(xué)習(xí)、DIY做東西、以及后面的全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽,都是用C語(yǔ)言編寫的程序。

10行匯編程序,可能只需要一行C語(yǔ)言代碼就能實(shí)現(xiàn),這是C語(yǔ)言相比匯編簡(jiǎn)化的優(yōu)點(diǎn)。

但是,C語(yǔ)言編寫的程序,經(jīng)過編譯,也會(huì)轉(zhuǎn)為匯編。比如我們?cè)诰€調(diào)試代碼的時(shí)候,會(huì)看到類似的“匯編窗口”:

因?yàn)橐郧皢纹瑱C(jī)的運(yùn)行速度不高,且內(nèi)存和Flash容量不大,要求節(jié)約程序空間。

所以使用匯編的優(yōu)點(diǎn):代碼運(yùn)行效率更高、更節(jié)約代碼存儲(chǔ)空間。

3對(duì)比用匯編和C語(yǔ)言寫流水燈程序

匯編語(yǔ)言寫程序的主要缺點(diǎn):語(yǔ)法復(fù)雜、可讀性差、代碼量大等。

下面分享一個(gè)實(shí)例:51單片機(jī)上的流水燈程序。分別用C語(yǔ)言和匯編寫出來(lái),大家對(duì)比一下就知道了。

C語(yǔ)言版:

 
 
 
 
  1. /******************** 宏定義 **************************/ 
  2. #define   MAIN_Fosc    22118400L  //定義主時(shí)鐘 
  3.  
  4. /******************** 延時(shí)函數(shù) **************************/ 
  5. void  delay_ms(u8 ms) 
  6.      u16 i; 
  7.    do{ 
  8.         i = MAIN_Fosc / 13000; 
  9.       while(--i)  ;   //14T per loop 
  10.      }while(--ms); 
  11.  
  12. /******************** 主函數(shù) **************************/ 
  13. void main(void) 
  14.   P0M1 = 0;  P0M0 = 0;  //設(shè)置為準(zhǔn)雙向口 
  15.   P1M1 = 0;  P1M0 = 0;  //設(shè)置為準(zhǔn)雙向口 
  16.   P2M1 = 0;  P2M0 = 0;  //設(shè)置為準(zhǔn)雙向口 
  17.   P3M1 = 0;  P3M0 = 0;  //設(shè)置為準(zhǔn)雙向口 
  18.   P4M1 = 0;  P4M0 = 0;  //設(shè)置為準(zhǔn)雙向口 
  19.   P5M1 = 0;  P5M0 = 0;  //設(shè)置為準(zhǔn)雙向口 
  20.   P6M1 = 0;  P6M0 = 0;  //設(shè)置為準(zhǔn)雙向口 
  21.   P7M1 = 0;  P7M0 = 0;  //設(shè)置為準(zhǔn)雙向口 
  22.  
  23.   while(1) 
  24.   { 
  25.     P17 = 0; 
  26.     delay_ms(250); 
  27.     delay_ms(250); 
  28.     P17 = 1; 
  29.     P16 = 0; 
  30.     delay_ms(250); 
  31.     delay_ms(250); 
  32.     P16 = 1; 
  33.     P47 = 0; 
  34.     delay_ms(250); 
  35.     delay_ms(250); 
  36.     P47 = 1; 
  37.     P46 = 0; 
  38.     delay_ms(250); 
  39.     delay_ms(250); 
  40.     P46 = 1; 
  41.   } 

匯編語(yǔ)言版:

 
 
 
 
  1. ;******************** 宏定義 **************************/ 
  2. Fosc_KHZ  EQU  22118  ;22118KHZ 
  3.  
  4. STACK_POIRTER  EQU    0D0H  ;堆棧開始地質(zhì) 
  5.  
  6.  
  7. ;******************** 延時(shí)函數(shù) **************************/ 
  8. F_delay_ms: 
  9.   PUSH  02H    ;入棧R2 
  10.   PUSH  03H    ;入棧R3 
  11.   PUSH  04H    ;入棧R4 
  12.  
  13.   MOV    R2,A 
  14.  
  15. L_delay_ms_1: 
  16.   MOV    R3, #HIGH (Fosc_KHZ / 13) 
  17.   MOV    R4, #LOW (Fosc_KHZ / 13) 
  18.    
  19. L_delay_ms_2: 
  20.   MOV    A, R4      ;1T    Total 13T/loop 
  21.   DEC    R4        ;2T 
  22.   JNZ    L_delay_ms_3  ;4T 
  23.   DEC    R3 
  24. L_delay_ms_3: 
  25.   DEC    A        ;1T 
  26.   ORL    A, R3      ;1T 
  27.   JNZ    L_delay_ms_2  ;4T 
  28.    
  29.   DJNZ  R2, L_delay_ms_1 
  30.  
  31.   POP    04H    ;出棧R2 
  32.   POP    03H    ;出棧R3 
  33.   POP    02H    ;出棧R4 
  34.   RET 
  35.  
  36.  
  37. ;******************** 主程序 **************************/ 
  38.     ORG    0100H    ;reset 
  39. F_Main: 
  40.   CLR    A 
  41.   MOV    P0M1, A   ;設(shè)置為準(zhǔn)雙向口 
  42.    MOV    P0M0, A 
  43.   MOV    P1M1, A   ;設(shè)置為準(zhǔn)雙向口 
  44.    MOV    P1M0, A 
  45.   MOV    P2M1, A   ;設(shè)置為準(zhǔn)雙向口 
  46.    MOV    P2M0, A 
  47.   MOV    P3M1, A   ;設(shè)置為準(zhǔn)雙向口 
  48.    MOV    P3M0, A 
  49.   MOV    P4M1, A   ;設(shè)置為準(zhǔn)雙向口 
  50.    MOV    P4M0, A 
  51.   MOV    P5M1, A   ;設(shè)置為準(zhǔn)雙向口 
  52.    MOV    P5M0, A 
  53.   MOV    P6M1, A   ;設(shè)置為準(zhǔn)雙向口 
  54.    MOV    P6M0, A 
  55.   MOV    P7M1, A   ;設(shè)置為準(zhǔn)雙向口 
  56.    MOV    P7M0, A 
  57.  
  58.   MOV    SP, #STACK_POIRTER 
  59.   MOV    PSW, #0    ;選擇第0組R0~R7 
  60.  
  61. L_MainLoop: 
  62.   CLR    P1.7 
  63.   MOV    A, #250 
  64.   LCALL  F_delay_ms    ;延時(shí)250ms 
  65.   LCALL  F_delay_ms    ;延時(shí)250ms 
  66.   SETB  P1.7 
  67.  
  68.   CLR    P1.6 
  69.   MOV    A, #250 
  70.   LCALL  F_delay_ms    ;延時(shí)250ms 
  71.   LCALL  F_delay_ms    ;延時(shí)250ms 
  72.   SETB  P1.6 
  73.  
  74.   CLR    P4.7 
  75.   MOV    A, #250 
  76.   LCALL  F_delay_ms    ;延時(shí)250ms 
  77.   LCALL  F_delay_ms    ;延時(shí)250ms 
  78.   SETB  P4.7 
  79.  
  80.   CLR    P4.6 
  81.   MOV    A, #250 
  82.   LCALL  F_delay_ms    ;延時(shí)250ms 
  83.   LCALL  F_delay_ms    ;延時(shí)250ms 
  84.   SETB  P4.6 
  85.  
  86.   SJMP  L_MainLoop 

上面兩個(gè)程序,實(shí)現(xiàn)的功能都一樣(流水燈),但對(duì)比代碼,大家發(fā)現(xiàn)有啥區(qū)別?

對(duì)于有匯編基礎(chǔ)的同學(xué)來(lái)說,可能這個(gè)簡(jiǎn)單的流水燈程序還是很好理解。

但是,對(duì)于大部分人來(lái)說,肯定都會(huì)覺得匯編很難讀。是的,這個(gè)是匯編的“特點(diǎn)”。

4最后

匯編語(yǔ)法,對(duì)于絕大部分讀者來(lái)說,我現(xiàn)在是不建議再深入學(xué)習(xí)了,只需要了解一些基礎(chǔ)的內(nèi)容即可。

有少部分人,想從事底層開發(fā),比如底層驅(qū)動(dòng)、單片機(jī)驗(yàn)證、固件庫(kù)開發(fā)等這些讀者,有時(shí)間還是可以進(jìn)一步了解匯編的一些技術(shù)。


分享標(biāo)題:用匯編和C語(yǔ)言寫流水燈程序
文章位置:http://www.dlmjj.cn/article/cccegec.html