自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

用匯編和C語(yǔ)言 寫流水燈程序

開(kāi)發(fā) 后端
現(xiàn)在可能很少看到匯編程序了,但單片機(jī)的啟動(dòng)文件、RTOS底層代碼等一些地方,依然還有匯編代碼的身影。不知道大家有沒(méi)有學(xué)過(guò)匯編,或者有沒(méi)有用匯編語(yǔ)言編過(guò)程?

 [[394717]]

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

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

今天就給大家分享一下匯編語(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í)覺(jué)得自己很牛逼,現(xiàn)在看來(lái)就是一菜鳥(niǎo)圖片

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

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

于是,我就那個(gè)時(shí)候開(kāi)始放棄了匯編,轉(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)過(guò)編譯,也會(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  ;堆棧開(kāi)始地質(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)說(shuō),可能這個(gè)簡(jiǎn)單的流水燈程序還是很好理解。

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

4最后

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

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

 

責(zé)任編輯:武曉燕 來(lái)源: 嵌入式專欄
相關(guān)推薦

2017-01-12 22:36:30

2020-12-14 08:48:45

C語(yǔ)言嵌入式gcc

2009-08-13 17:04:09

C#語(yǔ)言C#程序

2014-04-15 15:35:32

CC語(yǔ)言

2010-03-25 18:13:06

Python編程語(yǔ)言

2009-09-11 08:44:36

2022-02-19 22:47:46

編程語(yǔ)言開(kāi)發(fā)C++

2024-06-03 09:04:30

2015-03-19 09:46:32

程序員

2020-12-22 11:54:42

C語(yǔ)言Cortex-A9LED匯編

2012-03-20 09:20:40

Go語(yǔ)言

2011-01-14 14:08:17

Linux匯編語(yǔ)言

2010-04-07 14:54:20

Unix操作系統(tǒng)

2022-03-25 21:57:49

匯編Go語(yǔ)言

2014-12-24 09:41:05

x86C#

2014-08-22 16:29:12

應(yīng)用匯游戲評(píng)級(jí)資源策略

2011-01-14 14:39:32

Linux匯編語(yǔ)言

2009-06-15 11:03:10

Java語(yǔ)言C#語(yǔ)言

2021-05-27 08:59:09

Go匯編命令

2010-01-22 11:23:06

C++程序
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)