第5章匯編語言程序設(shè)計(jì)_第1頁
第5章匯編語言程序設(shè)計(jì)_第2頁
第5章匯編語言程序設(shè)計(jì)_第3頁
第5章匯編語言程序設(shè)計(jì)_第4頁
第5章匯編語言程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 S12X匯編程序設(shè)計(jì)與實(shí)例匯編程序設(shè)計(jì)與實(shí)例3.4.0 匯編語言程序基礎(chǔ)匯編語言程序基礎(chǔ)特點(diǎn):與硬件相關(guān)不易移植,高效、直接面對硬件、代碼量小;特點(diǎn):與硬件相關(guān)不易移植,高效、直接面對硬件、代碼量小;程序:完成特定任務(wù)的指令的集合,程序:完成特定任務(wù)的指令的集合,程序設(shè)計(jì)語言:機(jī)器語言(二進(jìn)制指令代碼,可直接執(zhí)行)程序設(shè)計(jì)語言:機(jī)器語言(二進(jìn)制指令代碼,可直接執(zhí)行) 匯編語言(特定助記符指令語句,須匯編)匯編語言(特定助記符指令語句,須匯編) 高級(jí)語言(通用高級(jí)語句,須編譯)高級(jí)語言(通用高級(jí)語句,須編譯)單片機(jī)應(yīng)用系統(tǒng)的程序,多用匯編語言編制(單片機(jī)應(yīng)用系統(tǒng)的程序,多用匯編語言編制(*.a

2、sm文件)或文件)或C 一個(gè)匯編程序語句一個(gè)匯編程序語句一條單片機(jī)指令一條單片機(jī)指令 多個(gè)匯編語言語句多個(gè)匯編語言語句匯編語言程序(源代碼)匯編語言程序(源代碼)注:程序需要特定的編譯程序進(jìn)行編譯,生成二進(jìn)制機(jī)器碼注:程序需要特定的編譯程序進(jìn)行編譯,生成二進(jìn)制機(jī)器碼 3.4.1匯編語言指令格式與偽指令匯編語言指令格式與偽指令1.匯編指令格式匯編指令格式 標(biāo)號(hào):標(biāo)號(hào): 操作碼操作碼 操作數(shù)操作數(shù)1 ,操作數(shù),操作數(shù)2 ;注釋;注釋標(biāo)號(hào)標(biāo)號(hào)-該指令的符號(hào)地址,標(biāo)定程序入口或轉(zhuǎn)移位置該指令的符號(hào)地址,標(biāo)定程序入口或轉(zhuǎn)移位置 注:標(biāo)號(hào)必須以字母開始,注:標(biāo)號(hào)必須以字母開始,分大小寫。分大小寫。 用途:

3、數(shù)據(jù)定義、子程序、中斷、循環(huán)、跳轉(zhuǎn)。用途:數(shù)據(jù)定義、子程序、中斷、循環(huán)、跳轉(zhuǎn)。操作碼操作碼-助記符,指令所實(shí)現(xiàn)的操作功能助記符,指令所實(shí)現(xiàn)的操作功能 注:不分大小寫;前面無標(biāo)號(hào)時(shí),注:不分大小寫;前面無標(biāo)號(hào)時(shí),至少應(yīng)保留一個(gè)空格至少應(yīng)保留一個(gè)空格操作數(shù)操作數(shù)-參加操作的數(shù)據(jù)對象,常數(shù)、符號(hào)或表達(dá)式參加操作的數(shù)據(jù)對象,常數(shù)、符號(hào)或表達(dá)式 注:寄存器尋址已歸納到隱含尋址中,當(dāng)操作數(shù)部分注:寄存器尋址已歸納到隱含尋址中,當(dāng)操作數(shù)部分出現(xiàn)寄存器時(shí),一定是寄存器間址;出現(xiàn)寄存器時(shí),一定是寄存器間址;分大小寫;分大小寫;注釋注釋-為方便閱讀、修改而加的注釋,可有可無為方便閱讀、修改而加的注釋,可有可無 注

4、:以注:以“;”開始,本行之后的內(nèi)容不再編譯開始,本行之后的內(nèi)容不再編譯2.數(shù)據(jù)的表示方法數(shù)據(jù)的表示方法 Freescale規(guī)定,加前綴規(guī)定,加前綴$ 十六進(jìn)制十六進(jìn)制% 二進(jìn)制二進(jìn)制 八進(jìn)制八進(jìn)制 ASCII無無 十進(jìn)制十進(jìn)制# 立即數(shù)的標(biāo)記立即數(shù)的標(biāo)記如:如:LDAA #$32 ;立即數(shù)立即數(shù) LDAA $32 ;地址地址3. 匯編程序偽指令匯編程序偽指令 匯編程序使用的輔助性語句,不生成機(jī)器碼匯編程序使用的輔助性語句,不生成機(jī)器碼.1、起始地址偽指令、起始地址偽指令 ORG ORG $2000H START: LDAA #$FF2、賦值偽指令、賦值偽指令 EQU PORTB EQU $0

5、001 BIT0 EQU %00000001 BSET PORTB, BIT0 ;等價(jià)于;等價(jià)于 BSET $0001, %00000001Vtimovf: equ $0000FFDEVtimch7: equ $0000FFE0Vtimch6: equ $0000FFE2Vtimch5: equ $0000FFE4Vtimch4: equ $0000FFE6Vtimch3: equ $0000FFE8Vtimch2: equ $0000FFEAVtimch1: equ $0000FFECVtimch0: equ $0000FFEEVrti: equ $0000FFF0Virq: equ $00

6、00FFF2Vxirq: equ $0000FFF4Vswi: equ $0000FFF6Vtrap: equ $0000FFF8Vcop: equ $0000FFFAVclkmon: equ $0000FFFCVreset: equ $0000FFFE;* PORTB - Port B Register; 0 x00000001 *PORTB: equ $00000001 ;* PORTB - Port B Register; 0 x00000001 *; bit numbers for usage in BCLR, BSET, BRCLR and BRSETPORTB_PB0: equ 0

7、 ; Port B Bit 0PORTB_PB1: equ 1 ; Port B Bit 1PORTB_PB2: equ 2 ; Port B Bit 2PORTB_PB3: equ 3 ; Port B Bit 3PORTB_PB4: equ 4 ; Port B Bit 4PORTB_PB5: equ 5 ; Port B Bit 5PORTB_PB6: equ 6 ; Port B Bit 6PORTB_PB7: equ 7 ; Port B Bit 7; bit position masksmPORTB_PB0: equ %00000001mPORTB_PB1: equ %000000

8、10mPORTB_PB2: equ %00000100mPORTB_PB3: equ %00001000mPORTB_PB4: equ %00010000mPORTB_PB5: equ %00100000mPORTB_PB6: equ %01000000mPORTB_PB7: equ %100000004.常量存儲(chǔ)常量存儲(chǔ) (1)字節(jié)常量偽指令)字節(jié)常量偽指令 FCB ( DC.B ) ORG $0200 TABLE: FCB $13,18,N1+6,21 (2)雙字節(jié)常量偽指令)雙字節(jié)常量偽指令 FDB ( DC.W ) ORG $1000 LIST: FDB $0519, $2000 (3

9、)字符量偽指令)字符量偽指令 FCC ORG $2000 STAR: FCC ABCD注:定界符可以是()、(/)、(”),建議使用()5.關(guān)于數(shù)據(jù)變量偽指令使用需要注意的問題關(guān)于數(shù)據(jù)變量偽指令使用需要注意的問題 FLASH 常數(shù)可以讀,不能修改;常數(shù)可以讀,不能修改; RAM 常數(shù)可以讀寫;常數(shù)可以讀寫;n 絕對地址方式編譯的程序絕對地址方式編譯的程序, 可以將數(shù)據(jù)定義在可以將數(shù)據(jù)定義在RAMRAM區(qū)域,區(qū)域, 即即$0000-$4000;$0000-$4000;n 以可以重定位的方式編譯以可以重定位的方式編譯,需要建立不同的數(shù)據(jù)段。,需要建立不同的數(shù)據(jù)段。 常量段定義在常量段定義在FLAS

10、HFLASH中;中; 數(shù)據(jù)段定義在數(shù)據(jù)段定義在RAM RAM 中中 ; 不能用不能用ORGORG偽指令將偽指令將FLASHFLASH中的變量強(qiáng)制定義到中的變量強(qiáng)制定義到RAM;RAM;n 數(shù)據(jù)段數(shù)據(jù)段 僅使用僅使用DSDS偽指令的數(shù)據(jù)段;偽指令的數(shù)據(jù)段;可重定位方式的實(shí)例可重定位方式的實(shí)例-C1內(nèi)容方式變化內(nèi)容方式變化FG 內(nèi)容沒有變化不是內(nèi)容沒有變化不是18仍然是初始的仍然是初始的1偽指令偽指令ORG不能將不能將FLASH段段數(shù)據(jù)定位到數(shù)據(jù)定位到RAM絕對地址方式實(shí)例絕對地址方式實(shí)例Freescale MCU編程幾個(gè)提示編程幾個(gè)提示-1、程序是被編譯成二進(jìn)制碼放在程序存儲(chǔ)器、程序是被編譯成二

11、進(jìn)制碼放在程序存儲(chǔ)器(FLASH)的,通過的,通過PC遞加,自動(dòng)逐條執(zhí)行;遞加,自動(dòng)逐條執(zhí)行;PC值指向的下一條將要執(zhí)行的指令。值指向的下一條將要執(zhí)行的指令。2、程序處理主要是通過訪問寄存器、數(shù)據(jù)存儲(chǔ)器、程序處理主要是通過訪問寄存器、數(shù)據(jù)存儲(chǔ)器(RAM)的各單的各單元實(shí)現(xiàn)所需功能要求的,而元實(shí)現(xiàn)所需功能要求的,而CPU寄存器寄存器(A,B,X,Y,CCR)是經(jīng)常是經(jīng)常要用到的工作寄存器。要用到的工作寄存器。3、理解、理解MCU的存儲(chǔ)器空間分配圖,寄存器、的存儲(chǔ)器空間分配圖,寄存器、RAM、FLASH是是統(tǒng)一編址在統(tǒng)一編址在64K地址空間的,每單元地址空間的,每單元8位;訪問寄存器使用其位;訪問

12、寄存器使用其功能符號(hào)形式,訪問功能符號(hào)形式,訪問RAM區(qū)可用區(qū)可用16位地址形式位地址形式($xxxx)。5、適當(dāng)偽指令:輔助編程,便于修改、理解等。、適當(dāng)偽指令:輔助編程,便于修改、理解等。6、注意格式:大寫、縮進(jìn)、對齊、注釋。、注意格式:大寫、縮進(jìn)、對齊、注釋。7、編程方法:、編程方法: 熟悉指令,理解范例,套用實(shí)踐,舉一反三熟悉指令,理解范例,套用實(shí)踐,舉一反三 由小到大,優(yōu)化整理,結(jié)合硬件,完備應(yīng)用由小到大,優(yōu)化整理,結(jié)合硬件,完備應(yīng)用4、主程序通常是:初始化以后,循環(huán)等待或原地等待。、主程序通常是:初始化以后,循環(huán)等待或原地等待。 子程序用標(biāo)號(hào)定義開始,用子程序用標(biāo)號(hào)定義開始,用RT

13、S結(jié)束;結(jié)束; 主程序用主程序用BSR或或JSR調(diào)用之;調(diào)用之; 中斷服務(wù)子程序也用標(biāo)號(hào)定義開始,結(jié)束則用中斷服務(wù)子程序也用標(biāo)號(hào)定義開始,結(jié)束則用RTI;需;需要聲明中斷向量對應(yīng)的程序入口,其執(zhí)行是當(dāng)中斷發(fā)生時(shí)要聲明中斷向量對應(yīng)的程序入口,其執(zhí)行是當(dāng)中斷發(fā)生時(shí)自動(dòng)被執(zhí)行的。自動(dòng)被執(zhí)行的。3.4.2 匯編語言程序設(shè)計(jì)實(shí)例匯編語言程序設(shè)計(jì)實(shí)例【例】【例】2個(gè)個(gè)8字節(jié)數(shù)求和,字節(jié)數(shù)求和,結(jié)果保存在被加數(shù)所在地址中。結(jié)果保存在被加數(shù)所在地址中。 ;*ADD8: LDX #$0B01 LEAY 8,X LDAB #8 CLC LOOP: LDAA X ADCA 1,Y+ STAA 1,X+ DBNE B

14、,LOOP $0B01.$0B09被加數(shù)被加數(shù)0字節(jié)字節(jié)被加數(shù)被加數(shù)1字節(jié)字節(jié) 加數(shù)加數(shù)0字節(jié)字節(jié)加數(shù)加數(shù)1字節(jié)字節(jié)RAM區(qū)區(qū)n計(jì)數(shù)器控制次數(shù)計(jì)數(shù)器控制次數(shù)n16位加法指令沒有帶位加法指令沒有帶Cn加法指令沒有加法指令沒有M+MnLDAA 不影響不影響C位位n自動(dòng)加減尋址方便自動(dòng)加減尋址方便nX,Y作為指針使用作為指針使用【例】將【例】將A中的兩個(gè)中的兩個(gè)4位十六進(jìn)制數(shù)轉(zhuǎn)換為位十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼,分別存入碼,分別存入$1080、$1081中。中。(09的的ASCII碼碼:$30$39,AF:$41$46);*;子程序子程序TRANS:十六進(jìn)制數(shù)轉(zhuǎn)換為:十六進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼碼;

15、入口參數(shù):入口參數(shù):(A)=十六進(jìn)制數(shù),十六進(jìn)制數(shù),高高4位為位為0;出口參數(shù):出口參數(shù):(B)=ASCII碼碼;*TRANS: PSHX ;壓棧壓棧 LDX #TABLE ;置表地址置表地址 LDAB A,X ;查表查表,(X+A)B PULX ; 出棧出棧 RTS ; 返回返回TABLE: FCC 0123456789ABCDEF;主程序段主程序段* ORG $8000HEXA: TFR A,X ANDA #$0F JSR TRANS STAB $1080 TFR X,A LSRA LSRA LSRA LSRA JSR TRANS STAB $1081 討論:討論:1.子程序壓棧,保存數(shù)據(jù)

16、子程序壓棧,保存數(shù)據(jù) 2.子程序定義入口出口參數(shù)子程序定義入口出口參數(shù) 3.TABLE 是是ASCII碼碼【例】比較【例】比較RAM區(qū)內(nèi)兩相鄰單元中無符號(hào)數(shù)的大小,按小數(shù)在區(qū)內(nèi)兩相鄰單元中無符號(hào)數(shù)的大小,按小數(shù)在前、大數(shù)在后重新存放前、大數(shù)在后重新存放(首址在首址在$2000)。若等則。若等則Y寄存器加寄存器加1。 LDX #$2000 ;首地址首地址 CLC ;C清零清零 LDY #0 ;Y清零清零BEGIN: LDAA 0,X ;(0+X)A LDAB 1,X ;(1+X)B CBA ;(A)-(B) BCS DONE ;減有借位減有借位(前小后大前小后大),無需調(diào)整,跳轉(zhuǎn)無需調(diào)整,跳轉(zhuǎn)

17、BEQ FLAG ;相等,跳轉(zhuǎn)相等,跳轉(zhuǎn) STAA 1,X ;A(1+X) STAB 0,X ;B(0+X) BRA DONE ;調(diào)整完畢,跳轉(zhuǎn)調(diào)整完畢,跳轉(zhuǎn)FLAG: INY ;Y+1Y DONE: BRA * ;結(jié)束結(jié)束 EXTERN CHAR YEAR , MONTHCHAR M-LENGTH() IF (MONTH = 2 ) IF ( YEAR%4) RETURN (28); ELSE RETURN (29) ELSE IF( MONTH=4| MONTH=6|MONTH=9|MONTH=11) RETURN(30); ELSE (RETURN (31); 匯編語言編程技巧匯編語言編

18、程技巧- 計(jì)算年月對應(yīng)的天數(shù)計(jì)算年月對應(yīng)的天數(shù)月月對對應(yīng)應(yīng)bit01112203314405516607718919100101111112012131n變換后:變換后: 大月是奇數(shù),大月是奇數(shù), 小月是偶數(shù);小月是偶數(shù);n方法:方法: 大于等于大于等于8月加月加1;n算法:算法:30+bit0;n特殊:特殊: 2月是奇點(diǎn),月是奇點(diǎn), 需要特殊需要特殊處理;處理; 算法分析算法分析入口:入口: MONTH , YEAR ;出口:出口:A寄存器返回天數(shù)。寄存器返回天數(shù)。M_LENGTH: LDAA #30 ; A寄存器存放天數(shù),初始寄存器存放天數(shù),初始30天天 LDAB #2 CMPB MONT

19、H ;是二月特殊月份?;是二月特殊月份? BEQ FEBRARY ;是,;是, 轉(zhuǎn)到二月處理轉(zhuǎn)到二月處理 LDAB MONTH ;進(jìn)入非二月份;進(jìn)入非二月份 CMPB #8 ;變換,使得大月始終為奇數(shù);變換,使得大月始終為奇數(shù) BLT ODDBIG INCBODDBIG: ANDB #1 ;寄存器;寄存器B 大月為大月為1, 小月為小月為0 ABA ; A寄存器為返回的天數(shù)寄存器為返回的天數(shù)30 或或31天天 RTSFEBRARY: DECA ;二月最大;二月最大29天天 LDAB YEAR ;取年;取年 ANDB %00000011 ;被;被4整除后的余數(shù)整除后的余數(shù) BEQ FINI ;閏

20、年?;閏年? 是返回是返回29天天 DECA ;否;否 返回返回28天天FINI: RTS ENDEND 匯編特點(diǎn):匯編特點(diǎn):nAND 實(shí)現(xiàn)取余數(shù)效率高;實(shí)現(xiàn)取余數(shù)效率高;n變換用變換用INC指令快、短指令快、短n操作在寄存器進(jìn)行操作在寄存器進(jìn)行3. 數(shù)據(jù)查表程序數(shù)據(jù)查表程序【例】數(shù)碼管顯示按鍵數(shù)值。【例】數(shù)碼管顯示按鍵數(shù)值。;*COUNT1 EQU $2000 DELAY: CLC LDAA #$00 STAA COUNTER1 LDY #TABLE2LP3: LDAB Y INY LDAA PORTA SBA BEQ DISPLAY1 INC COUNTER1 BRA LP3DISPLAY

21、1: LDAA #$00 STAA PTT LDAB COUNTER1;相對量相對量COUNTER1: LDY #TABLE3 LDAA B,Y STAA PTP RTS TABLE2: FCB $ee,$de,$be,$7e,$ed,$dd,$bd,$7d,$eb,$db,$bb,$7b,$e7,$d7,$b7,$77 ;4x4行列鍵值,預(yù)定義的,行列鍵值,預(yù)定義的,16個(gè)可能的讀回值個(gè)可能的讀回值TABLE3: FCB $f9,$a4,$b0,$99,$92,$82,$f8,$80,$90,$c0,$88,$83,$c6,$a1,$86,$8e;共陽字符編碼共陽字符編碼: 1, 2, 3,

22、 4, 5, 6, 7, 8, 9, 0, A, B, C, D, E, F 討論:討論:1.假設(shè)假設(shè)A口輸入一定是規(guī)定范圍口輸入一定是規(guī)定范圍 2.變量變量COUNTER1可以不用;可以不用; 3. #TABLE2 4.BEQ DISPLAY1? CPU執(zhí)行時(shí)間:執(zhí)行時(shí)間: T = N x TB T-總執(zhí)行時(shí)間總執(zhí)行時(shí)間 , N-總時(shí)鐘周期數(shù),總時(shí)鐘周期數(shù), TB-總線時(shí)鐘周期總線時(shí)鐘周期(例如:晶振頻率為(例如:晶振頻率為16MHz,則總線時(shí)鐘頻率為則總線時(shí)鐘頻率為8MHz,TB = 1/8M=125ns )【例】【例】2ms延時(shí)。延時(shí)。(晶振頻率為晶振頻率為16MHz) 則需則需N=T / TB = 2ms / 125ns = 16000程序運(yùn)行:程序運(yùn)行:N=4+2+3+(1+3)(TCOUNT-1)+(1)+3+5 故:故:TCOUNT=3996.2539962. 延時(shí)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論