成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用匯編和C語言 寫流水燈程序

開發 后端
現在可能很少看到匯編程序了,但單片機的啟動文件、RTOS底層代碼等一些地方,依然還有匯編代碼的身影。不知道大家有沒有學過匯編,或者有沒有用匯編語言編過程?

 [[394717]]

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

不知道大家有沒有學過匯編,或者有沒有用匯編語言編過程?

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

1學習匯編語言

我在10年學習單片機編程的時候,老師教學都還是用匯編教我們,包括教學實驗,也是要求我們用匯編寫程序。

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

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

以前計算機三級(PC技術)的上機考試,就是用匯編編程,我那個時候上機考試還是滿分。當時覺得自己很牛逼,現在看來就是一菜鳥圖片

2匯編轉C語言

剛開始學習匯編那會兒,我真的用匯編在51單片機上寫流水燈程序。后面看了用C語言寫流水燈程序,突然發現,哇,用C語言寫程序還能這么簡單、方便。

于是,我就那個時候開始放棄了匯編,轉向了C語言。包括后面我在大學實驗室自己學習、DIY做東西、以及后面的全國大學生電子設計競賽,都是用C語言編寫的程序。

10行匯編程序,可能只需要一行C語言代碼就能實現,這是C語言相比匯編簡化的優點。

但是,C語言編寫的程序,經過編譯,也會轉為匯編。比如我們在線調試代碼的時候,會看到類似的“匯編窗口”:

因為以前單片機的運行速度不高,且內存和Flash容量不大,要求節約程序空間。

所以使用匯編的優點:代碼運行效率更高、更節約代碼存儲空間。

3對比用匯編和C語言寫流水燈程序

匯編語言寫程序的主要缺點:語法復雜、可讀性差、代碼量大等。

下面分享一個實例:51單片機上的流水燈程序。分別用C語言和匯編寫出來,大家對比一下就知道了。

C語言版:

  1. /******************** 宏定義 **************************/ 
  2. #define   MAIN_Fosc    22118400L  //定義主時鐘 
  3.  
  4. /******************** 延時函數 **************************/ 
  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. /******************** 主函數 **************************/ 
  13. void main(void) 
  14.   P0M1 = 0;  P0M0 = 0;  //設置為準雙向口 
  15.   P1M1 = 0;  P1M0 = 0;  //設置為準雙向口 
  16.   P2M1 = 0;  P2M0 = 0;  //設置為準雙向口 
  17.   P3M1 = 0;  P3M0 = 0;  //設置為準雙向口 
  18.   P4M1 = 0;  P4M0 = 0;  //設置為準雙向口 
  19.   P5M1 = 0;  P5M0 = 0;  //設置為準雙向口 
  20.   P6M1 = 0;  P6M0 = 0;  //設置為準雙向口 
  21.   P7M1 = 0;  P7M0 = 0;  //設置為準雙向口 
  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.   } 

匯編語言版:

  1. ;******************** 宏定義 **************************/ 
  2. Fosc_KHZ  EQU  22118  ;22118KHZ 
  3.  
  4. STACK_POIRTER  EQU    0D0H  ;堆棧開始地質 
  5.  
  6.  
  7. ;******************** 延時函數 **************************/ 
  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   ;設置為準雙向口 
  42.    MOV    P0M0, A 
  43.   MOV    P1M1, A   ;設置為準雙向口 
  44.    MOV    P1M0, A 
  45.   MOV    P2M1, A   ;設置為準雙向口 
  46.    MOV    P2M0, A 
  47.   MOV    P3M1, A   ;設置為準雙向口 
  48.    MOV    P3M0, A 
  49.   MOV    P4M1, A   ;設置為準雙向口 
  50.    MOV    P4M0, A 
  51.   MOV    P5M1, A   ;設置為準雙向口 
  52.    MOV    P5M0, A 
  53.   MOV    P6M1, A   ;設置為準雙向口 
  54.    MOV    P6M0, A 
  55.   MOV    P7M1, A   ;設置為準雙向口 
  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    ;延時250ms 
  65.   LCALL  F_delay_ms    ;延時250ms 
  66.   SETB  P1.7 
  67.  
  68.   CLR    P1.6 
  69.   MOV    A, #250 
  70.   LCALL  F_delay_ms    ;延時250ms 
  71.   LCALL  F_delay_ms    ;延時250ms 
  72.   SETB  P1.6 
  73.  
  74.   CLR    P4.7 
  75.   MOV    A, #250 
  76.   LCALL  F_delay_ms    ;延時250ms 
  77.   LCALL  F_delay_ms    ;延時250ms 
  78.   SETB  P4.7 
  79.  
  80.   CLR    P4.6 
  81.   MOV    A, #250 
  82.   LCALL  F_delay_ms    ;延時250ms 
  83.   LCALL  F_delay_ms    ;延時250ms 
  84.   SETB  P4.6 
  85.  
  86.   SJMP  L_MainLoop 

上面兩個程序,實現的功能都一樣(流水燈),但對比代碼,大家發現有啥區別?

對于有匯編基礎的同學來說,可能這個簡單的流水燈程序還是很好理解。

但是,對于大部分人來說,肯定都會覺得匯編很難讀。是的,這個是匯編的“特點”。

4最后

匯編語法,對于絕大部分讀者來說,我現在是不建議再深入學習了,只需要了解一些基礎的內容即可。

有少部分人,想從事底層開發,比如底層驅動、單片機驗證、固件庫開發等這些讀者,有時間還是可以進一步了解匯編的一些技術。

 

責任編輯:武曉燕 來源: 嵌入式專欄
相關推薦

2017-01-12 22:36:30

2020-12-14 08:48:45

C語言嵌入式gcc

2009-08-13 17:04:09

C#語言C#程序

2014-04-15 15:35:32

CC語言

2010-03-25 18:13:06

Python編程語言

2022-02-19 22:47:46

編程語言開發C++

2009-09-11 08:44:36

2024-06-03 09:04:30

2015-03-19 09:46:32

程序員

2020-12-22 11:54:42

C語言Cortex-A9LED匯編

2012-03-20 09:20:40

Go語言

2010-04-07 14:54:20

Unix操作系統

2011-01-14 14:08:17

Linux匯編語言

2014-12-24 09:41:05

x86C#

2022-03-25 21:57:49

匯編Go語言

2014-08-22 16:29:12

應用匯游戲評級資源策略

2021-05-27 08:59:09

Go匯編命令

2011-01-14 14:39:32

Linux匯編語言

2010-01-22 11:23:06

C++程序

2018-04-26 15:18:49

RTOS應用MPU
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: h片在线看 | 久久美女网 | 久久精品亚洲精品国产欧美 | 成人激情视频免费在线观看 | 欧美一级视频免费看 | 99久久亚洲 | 青青草华人在线视频 | 亚洲高清视频一区二区 | 在线视频日韩 | 亚洲精品久久久久久久久久久久久 | 99久久精品免费看国产四区 | 黄网站在线播放 | 操久久| 久久久久久久久久久久久久国产 | 欧美精品一区二区三区一线天视频 | 午夜精品一区二区三区在线 | 精品视频一区二区三区在线观看 | 成人不卡一区二区 | 免费成人高清 | 天天干天天草 | 免费能直接在线观看黄的视频 | 伊人一二三 | 免费黄色片在线观看 | 久草新在线 | 久久久tv | 中文字幕一区二区三区四区不卡 | 欧美中文 | 亚洲a在线观看 | 欧美国产精品一区二区 | 亚洲成人一区二区三区 | av色在线| 久久国产精品视频 | 国产一级在线观看 | 国产成人午夜精品影院游乐网 | 国产乱码高清区二区三区在线 | 久在线| 国产精品99久久久久久动医院 | 羞羞的视频免费看 | 国产一区二区成人 | av毛片免费 | 欧美日韩视频在线第一区 |