新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 幾種延時的匯編執行代碼對比與總結

        幾種延時的匯編執行代碼對比與總結

        作者: 時間:2013-04-07 來源:網絡 收藏

        拜讀了網上《 Keil C 的簡單研究 》(by: InfiniteSpace Studio/isjfk, 1.21.2004 )一文,借鑒了文中的方法,測試發現有一點點出入,原文作者在計算延時時間的時候是否忘了加上RET指令……下面介紹我的測試結果,歡迎交流探討——

        一、單獨定義變量,for語句

        28: delay1(1);

        C:0x0005 7F01 MOV R7,#0x01

        C:0x0007 1121 ACALL delay1(C:0021)

        12: void delay1(unsigned char k)

        13: {

        17: unsigned char i=0;

        C:0x0021 E4 CLR A

        C:0x0022 FE MOV R6,A

        18: for(i=0;i0;i--);相同

        C:0x0023 EE MOV A,R6

        C:0x0024 C3 CLR C

        C:0x0025 9F SUBB A,R7

        C:0x0026 5003 JNC C:002B

        C:0x0028 0E INC R6

        C:0x0029 80F8 SJMP C:0023

        19: }

        C:0x002B 22 RET

        分析:

        delay1(1); 410-390=20

        delay1(2); 439-411=28

        delay1(3); 476-440=36

        即:指令周期(即實際延時)= 12 + 延時參數 * 8

        二、不再重新定義變量,for語句

        28: delay1(1);

        C:0x0005 7F01 MOV R7,#0x01

        C:0x0007 1123 ACALL delay1(C:0023)

        12: void delay1(unsigned char k)

        13: {

        18: for(;k>0;k--);

        C:0x0023 EF MOV A,R7

        C:0x0024 D3 SETB C

        C:0x0025 9400 SUBB A,#0x00

        C:0x0027 4003 JC C:002C

        C:0x0029 1F DEC R7

        C:0x002A 80F7 SJMP delay1(C:0023)

        19: }

        C:0x002C 22 RET

        分析:

        delay1(1); 491-473=18

        delay1(2); 518-492=26

        指令周期(即實際延時)= 10 + 延時參數 * 8

        對比一和二可知,延時函數中有重新定義循環變量i時,理所當然地多了2行代碼

        不知原文中 “其生成的代碼是一樣的?!钡慕Y論是如何得來的?

        三、for語句,改變循環結束條件

        23: delay1(1);

        C:0x0005 7F01 MOV R7,#0x01

        C:0x0007 1123 ACALL delay1(C:0023)

        11: void delay1(unsigned char i)

        12: {

        13: // while(--i);

        14: // while(i--);

        15: for(; i != 0; i--);

        C:0x0023 EF MOV A,R7

        C:0x0024 6003 JZ C:0029

        C:0x0026 1F DEC R7

        C:0x0027 80FA SJMP delay1(C:0023)


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 黑山县| 方山县| 遵义市| 墨玉县| 永福县| 海伦市| 金乡县| 浮山县| 林口县| 洛宁县| 嘉禾县| 绥中县| 乌拉特前旗| 阿勒泰市| 高淳县| 通州市| 东至县| 拜泉县| 洛阳市| 霍林郭勒市| 确山县| 西丰县| 策勒县| 莱州市| 翼城县| 合山市| 车致| 从化市| 乾安县| 惠来县| 台东市| 灌云县| 驻马店市| 调兵山市| 罗江县| 涪陵区| 毕节市| 江川县| 安塞县| 左权县| 湖州市|