有使用如下的簡單測試代碼驗證這個問題:
(有耐心的請看完,一定有所收穫)
測試代碼:
#include<htc.h>
__CONFIG(0X1FF2);
unsigned char a,b;
unsigned int c;
main()
{
c=a*256+b;
while(1);
}
截取關鍵ASM Code:
8: c = a*256+b;
7FA 1283 BCF 0x3, 0x5
7FB 0820 MOVF 0x20, W
7FC 00A3 MOVWF 0x23
7FD 0821 MOVF 0x21, W
7FE 00A2 MOVWF 0x22
9:
while(1);
7FF 2FFF GOTO 0x7ff
說明一下:
地址位置: 變量
0X20 a
0X21 b
0X22 c低8位
0X23 c高8位
c=a*256+b;
可以看到這段代碼非常簡單,優化的也很好;就兩步
1.直接將a的內容放到c的高8位(等於*256)
2.將b的內容放到c的低8位。
即完成了整個運算。
再看
c += a*256+b;
8: c +=a*256+b;
7EB 1283 BCF 0x3, 0x5
7EC 0820 MOVF 0x20, W
7ED 1283 BCF 0x3, 0x5
7EE 00A5 MOVWF 0x25
7EF 01A4 CLRF 0x24
7F0 0821 MOVF 0x21, W
7F1 00A6 MOVWF 0x26
7F2 01A7 CLRF 0x27
7F3 0824 MOVF 0x24, W
7F4 07A6 ADDWF 0x26, F
7F5 1803 BTFSC 0x3,0
7F6 0AA7 INCF 0x27, F
7F7 0825 MOVF 0x25, W
7F8 07A7 ADDWF 0x27, F
7F9 0826 MOVF 0x26, W
7FA 07A2 ADDWF 0x22, F
7FB 1803 BTFSC 0x3, 0
7FC 0AA3 INCF 0x23, F
7FD 0827 MOVF 0x27, W
7FE 07A3 ADDWF 0x23, F
9:
while(1);
7FF 2FFF GOTO 0x7ff
初看這個反彙編有些暈是嗎,不怕
其實很簡單0X24~0X27是兩個int型臨時變量,暫且命名為temp1L,temp1H,temp2L,temp2H。
這下就方便看了.
7EC 0820 MOVF a, W
7EE 00A5 MOVWF temp1H
7EF 01A4 CLRF temp1L //a放到臨時變量1高位(*256嘛),清臨時變量低位,作用:完成a*256 并將結果放到int型臨時變量temp1中
7F0 0821 MOVF b, W
7F1 00A6 MOVWF tempL
7F2 01A7 CLRF tempH //b放到臨時變量2低位,清臨時變量2高位,作用:完成 b複制到臨時變量temp2中
7F3 0824 MOVF temp1L, W
7F4 07A6 ADDWF temp2L, F //兩個臨時變量低位相加
7F5 1803 skpnc
7F6 0AA7 INCF temp2H, F //確認進位
7F7 0825 MOVF temp1H, W
7F8 07A7 ADDWF temp2H, F //高位相加
//典型的int型數據加法運算,結果放到temp2中
7F9 0826 MOVF temp2L, W
7FA 07A2 ADDWF c, F
7FB 1803 skpnc
7FC 0AA3 INCF (high)c, F
7FD 0827 MOVF temp2H, W
7FE 07A3 ADDWF (high)c, F
//不需要羅嗦了,temp2和c相加并將結果放到c,即告完成
這就完成了c +=a*256+b;
步驟是這樣的:
1.先計算a*256 并放到臨時變量,然後計算b(b就是一個複制過程)
2.用a*256的臨時結果与b相加
3.再用上一步的計算結果和c相加.
看到這裏,可見一切是多麽的正常;
好吧,那請再往下看::P |