亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-07-06 11:40:51 來源:億速云 閱讀:526 作者:chen 欄目:編程語言

本篇內容介紹了“如何用匯編和C語言寫流水燈程序”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

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

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

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

1學習匯編語言

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

MOV  A,#00H MOV  P1,A

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

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

2匯編轉C語言

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

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

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

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

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

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

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

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

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

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

C語言版:

/******************** 宏定義 **************************/ #define   MAIN_Fosc    22118400L  //定義主時鐘  /******************** 延時函數 **************************/ void  delay_ms(u8 ms) {      u16 i;    do{         i = MAIN_Fosc / 13000;       while(--i)  ;   //14T per loop      }while(--ms); }  /******************** 主函數 **************************/ void main(void) {   P0M1 = 0;  P0M0 = 0;  //設置為準雙向口   P1M1 = 0;  P1M0 = 0;  //設置為準雙向口   P2M1 = 0;  P2M0 = 0;  //設置為準雙向口   P3M1 = 0;  P3M0 = 0;  //設置為準雙向口   P4M1 = 0;  P4M0 = 0;  //設置為準雙向口   P5M1 = 0;  P5M0 = 0;  //設置為準雙向口   P6M1 = 0;  P6M0 = 0;  //設置為準雙向口   P7M1 = 0;  P7M0 = 0;  //設置為準雙向口    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  ;堆棧開始地質   ;******************** 延時函數 **************************/ 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   ;設置為準雙向口    MOV    P0M0, A   MOV    P1M1, A   ;設置為準雙向口    MOV    P1M0, A   MOV    P2M1, A   ;設置為準雙向口    MOV    P2M0, A   MOV    P3M1, A   ;設置為準雙向口    MOV    P3M0, A   MOV    P4M1, A   ;設置為準雙向口    MOV    P4M0, A   MOV    P5M1, A   ;設置為準雙向口    MOV    P5M0, A   MOV    P6M1, A   ;設置為準雙向口    MOV    P6M0, A   MOV    P7M1, A   ;設置為準雙向口    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

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

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

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

4最后

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

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

“如何用匯編和C語言寫流水燈程序”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

虞城县| 郁南县| 延川县| 博白县| 衡东县| 景谷| 大邑县| 从化市| 德惠市| 东安县| 花莲县| 洞头县| 即墨市| 襄樊市| 兰州市| 萝北县| 濉溪县| 集安市| 郧西县| 宾阳县| 通许县| 内黄县| 三明市| 吉林省| 乌什县| 耒阳市| 鸡西市| 威信县| 津市市| 天台县| 沙湾县| 利川市| 峨山| 遂平县| 进贤县| 昌邑市| 塘沽区| 枣阳市| 东乡族自治县| 毕节市| 马公市|