版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第三章AVR單片機(jī)指令系統(tǒng)計(jì)算機(jī)的指令系統(tǒng)是一套控制計(jì)算機(jī)操作的代碼(二進(jìn)制),稱之為機(jī)器語(yǔ)言。計(jì)算機(jī)只能識(shí)別和執(zhí)行機(jī)器語(yǔ)言的指令。難記!易出錯(cuò)!為了便于人們理解、記憶及使用,通常用匯編語(yǔ)言指令來(lái)描述計(jì)算機(jī)的指令系統(tǒng)。匯編語(yǔ)言指令可通過(guò)匯編器(軟件,如AVR Studio,51系列的ASM51等)翻譯成計(jì)算機(jī)能識(shí)別的機(jī)器語(yǔ)言。相對(duì)較易記,不易出錯(cuò)CISC結(jié)構(gòu)存在指令系統(tǒng)不等長(zhǎng),指令數(shù)多,CPU利用效率低,執(zhí)行速度慢等缺陷 AVR單片機(jī)指令系統(tǒng)是先進(jìn)的RISC體系結(jié)構(gòu),采用了大型快速存取寄存器組(32個(gè)通用工作寄存器)、快速的單周期指令系統(tǒng)以及單級(jí)流水線等先進(jìn)技術(shù) 16/32位定長(zhǎng)指令流水線操作
2、大型快速存取寄存器組 3.1 指令格式3. 1 . 1 匯編語(yǔ)言源文件AVR的指令的一般格式為: 目的地址 指令的三種表示方式指令的二進(jìn)制表示形式 指令的十六進(jìn)制形式 指令的助記符形式又稱為指令的匯編形式或匯編語(yǔ)句 操作碼第1操作數(shù)或操作數(shù)地址第2操作數(shù)或操作數(shù)地址匯編語(yǔ)言源文件是由匯編語(yǔ)言代碼和匯編程序指令所組成的ASCII 字符文件。匯編語(yǔ)言源文件包括指令助記符、標(biāo)號(hào)和偽指令。指令助記符和偽指令常帶操作數(shù)語(yǔ)句有以下種形式: 標(biāo)號(hào)偽指令操作數(shù);注釋 標(biāo)號(hào)指令操作數(shù);注釋 ;注釋 空行例子:Label: .EQU Var1=100 ;置Var1 等于100 偽指令 .EQU Var2=200
3、;置Var2 等于200test: rjmp test ;無(wú)限循環(huán)指令 ;純注釋行注意:不限制有關(guān)標(biāo)號(hào)偽指令注釋或指令的列位置指令助記符 匯編器認(rèn)可指令集中的指令助記符。指令集中綜合了助記符并給出了參數(shù)3.1.2 指令集名詞(符號(hào))1、狀態(tài)寄存器SREG: 狀態(tài)寄存器C: 進(jìn)位標(biāo)志位Z: 零標(biāo)志位N: 負(fù)數(shù)標(biāo)志位V: 2 的補(bǔ)碼溢出指示位S: NV, 符號(hào)測(cè)試位H: 半進(jìn)位標(biāo)志位 T: 用于 BLD 和 BST 指令傳送位 I: 全局中斷觸發(fā) 禁止標(biāo)志位 SREG2、寄存器和操作數(shù) Rd: 寄存器區(qū)中的目的(或源)寄存器 Rr: 寄存器區(qū)中的源寄存器 R: 指令執(zhí)行后的結(jié)果 K: 常數(shù)項(xiàng)或字節(jié)
4、數(shù)據(jù) (8位) k: 程序計(jì)數(shù)器的常量地址數(shù)據(jù) b: 在寄存器區(qū)中或I/O寄存器中的位(3 位) S: 在狀態(tài)寄存器中的位(3位) X, Y, Z: 間接地址寄存器(X=R27:R26, Y=R29:R28, Z=R31:R30) P(或A): I/O 寄存器地址 q: 直接尋址的偏移(6 位) 3、堆棧STACK: 作為返回地址和壓棧寄存器的堆棧 SP:STACK 的堆棧指針 4、標(biāo)志 (Flags): 標(biāo)志受指令的影響Flag affected by instruction,在指令表“標(biāo)志”欄寫(xiě)出相應(yīng)字母0: 標(biāo)志被指令清零Flag cleared by instruction,寫(xiě)出相應(yīng)字
5、母并標(biāo)以下標(biāo)01: 標(biāo)志被指令置位 Flag set by instruction,寫(xiě)出相應(yīng)字母并標(biāo)以下標(biāo)1-: 標(biāo)志不受指令影響Flag not affected by instruction,不寫(xiě)出相應(yīng)字母3.1.3 ATmega8指令A(yù)Tmega8共有130條指令,按功能可分為5大類(lèi):數(shù)據(jù)傳送指令(35條);算術(shù)和邏輯運(yùn)算指令(28條);位操作和位測(cè)試指令(28條);比較和轉(zhuǎn)移指令(36條);MCU控制指令(3條)。(1) 89 條指令器件:AT90S1200,最基本指令;(2) 90 條指令器件:Attiny11/12/15/22; 90 條指令= +89 條基本指令(3) 118 條
6、指令器件: AT90S2313/2323/2343/2333,/4414/4433/4434/8515/90S8534/8535; 118 條指令= + 90 條;(4) 121 條指令器件:ATmega603/103; 121 條指令= + 118 條;(5) 130 條指令器件ATmega8/ATmega8535/161等; 130 條指令= +121 條(6) 131條指令器件 ATmega16等3.1.4匯編器偽指令偽指令并不直接轉(zhuǎn)換成操作數(shù),而是用于調(diào)整存儲(chǔ)器中程序的位置,定義宏,初始化存儲(chǔ)器等偽指令表序號(hào)偽指令說(shuō) 明序號(hào)偽指令說(shuō) 明1BYTE在RAM中定義預(yù)留存儲(chǔ)單元10EXIT退
7、出文件2CSEG聲明代碼段11INCLUDE包含指定的文件3DB定義字節(jié)常數(shù)12MACRO宏定義開(kāi)始4DEF定義寄存器符號(hào)名13ENDMACRO宏定義結(jié)束5DEVICE指定為何器件生成匯編代碼14LISTMAC列表宏表達(dá)式6DSEG聲明數(shù)據(jù)段15LIST列表文件生成允許器7DW定義字常數(shù)16NOLIST關(guān)閉列表文件生成8EQU定義標(biāo)識(shí)符常量17ORG設(shè)置程序起始位置9ESEG聲明E2PROM段18SET賦值給標(biāo)識(shí)符3.1.5 表達(dá)式匯編器的表達(dá)式由操作數(shù)、運(yùn)算符和函數(shù)組成。所有的表達(dá)式內(nèi)部為32位(二進(jìn)制)操作數(shù)(1)用戶定義的標(biāo)號(hào),該標(biāo)號(hào)給出了放置標(biāo)號(hào)位置的定位計(jì)數(shù)器的值(2)用戶用SET偽
8、指令定義的變量(3)用戶用EQU偽指令定義的常數(shù)(4)整數(shù)常數(shù),包括下列幾種形式十進(jìn)制缺省值10 255十六進(jìn)制數(shù)二進(jìn)制表示法0 x0a,$0a,0 xff,$ff二進(jìn)制數(shù)0b00001010,0b11111111(5)PC, 程序存儲(chǔ)器定位計(jì)數(shù)器的當(dāng)前值匯編器的函數(shù)(而非單片機(jī)內(nèi)的函數(shù))有LOW、HIGH、BYTE2、BYTE3匯編器所認(rèn)的運(yùn)算符部分運(yùn)算符表序 號(hào)運(yùn)算符名 稱優(yōu)先級(jí)說(shuō) 明1!邏輯非14單目運(yùn)算符,表達(dá)式是0則返回1,表達(dá)式為非0則返回02逐位非14單目運(yùn)算符,將表達(dá)式的值按位取反3-負(fù)號(hào)14單目運(yùn)算符,使表達(dá)式為算術(shù)負(fù)4*乘法13雙目運(yùn)算符,兩個(gè)表達(dá)式相乘5/除法13雙目運(yùn)算
9、符,左邊表達(dá)式除以右邊表達(dá)式,得整數(shù)的商值6+加法12雙目運(yùn)算符,兩個(gè)表達(dá)式相加7減法12雙目運(yùn)算符,左邊表達(dá)式減去右邊表達(dá)式8右移11雙目運(yùn)算符,左邊表達(dá)式值右移右邊表達(dá)式給出的次數(shù)10小于10雙目運(yùn)算符,左邊帶符號(hào)表達(dá)式值小于右邊帶符號(hào)表達(dá)式值,則為1,否則為011大于10雙目運(yùn)算符,左邊帶符號(hào)表達(dá)式值大于右邊帶符號(hào)表達(dá)式值,則為1,否則為013=大于等于10雙目運(yùn)算符,左邊帶符號(hào)表達(dá)式值大于或等于右邊帶符號(hào)表達(dá)式值,則為1,否則為014=等于9雙目運(yùn)算符,左邊帶符號(hào)表達(dá)式值等于右邊帶符號(hào)表達(dá)式值,則為1,否則為015!=不等于9雙目運(yùn)算符,左邊帶符號(hào)表達(dá)式值不等于右邊帶符號(hào)表達(dá)式值,則為
10、1,否則為016&逐位與8雙目運(yùn)算符,兩個(gè)表達(dá)式值之間逐位與17逐位異或7雙目運(yùn)算符,兩個(gè)表達(dá)式值之間逐位異或18|逐位或6雙目運(yùn)算符,兩個(gè)表達(dá)式值之間逐位或19&邏輯與5雙目運(yùn)算符,兩個(gè)表達(dá)式值之間邏輯與,全非0則為1,否則為020|邏輯或4雙目運(yùn)算符,兩個(gè)表達(dá)式值之間邏輯或,非0則為1,全0為03.1.6器件定義頭文件“m8def.inc”在AVR的器件手冊(cè)中,對(duì)所有的內(nèi)部寄存器進(jìn)行了標(biāo)稱化的定義,如32個(gè)通用寄存器組用R0R31表示,系統(tǒng)狀態(tài)寄存器用SREG表示,端口C數(shù)據(jù)寄存器用PORTC表示等,便于記憶、理解和使用。而當(dāng)編寫(xiě)程序時(shí),在指令中實(shí)際出現(xiàn)的應(yīng)該是這些寄存器的空間地址,這就給
11、編寫(xiě)程序造成了麻煩。為了能讓程序員編寫(xiě)程序時(shí),不去使用那些不易記憶的寄存器地址,而是直接使用這些寄存器的標(biāo)稱名稱,在AVR的開(kāi)發(fā)軟件平臺(tái)中都含有各個(gè)AVR器件的標(biāo)稱定義頭文件。 3.2 尋址方式指令的一個(gè)重要組成部分是操作數(shù),指令給出參與運(yùn)算的數(shù)據(jù)的方式稱為尋址方式。AVR 單片機(jī)指令操作數(shù)的尋址方式有以下幾種:?jiǎn)渭拇嫫髦苯訉ぶ?、雙寄存器直接尋址、I /O 寄存器直接尋址、數(shù)據(jù)存儲(chǔ)器直接尋址、帶位移的數(shù)據(jù)存儲(chǔ)器間接尋址、數(shù)據(jù)存儲(chǔ)器間接尋址、帶預(yù)減量的數(shù)據(jù)存儲(chǔ)器間接尋址、帶后增量的數(shù)據(jù)存儲(chǔ)器間接尋址、從程序存儲(chǔ)器取常數(shù)尋址、程序直接尋址、程序間接尋址、程序相對(duì)尋址單寄存器直接尋址INC Rd ;
12、RdRd+1雙寄存器直接尋址ADD Rd,Rr ; RdRd+RrI/O寄存器直接尋址IN Rd,A ; RdA(A為64個(gè)I/O寄存器之一)數(shù)據(jù)存儲(chǔ)器直接尋址LDS Rd,K ; Rd(K)地址為K的SRAM的內(nèi)容送Rd數(shù)據(jù)存儲(chǔ)器間接尋址LD Rd,Y ; Rd(Y) 注意與數(shù)據(jù)存儲(chǔ)器直接尋址的區(qū)別帶后增量的數(shù)據(jù)存儲(chǔ)器間接尋址LD Rd,Y+ ; Rd(Y), Y=Y+1帶預(yù)減量的數(shù)據(jù)存儲(chǔ)器間接尋址LD Rd,-Y ;Y=Y-1, Rd(Y)帶位移的數(shù)據(jù)存儲(chǔ)器間接尋址LDD Rd,Y+q ; Rd(Y+q) 0q63從程序存儲(chǔ)器取常數(shù)尋址LPM ; R0(Z) 無(wú)操作數(shù)程序直接尋址JMP ;
13、mega系列程序間接尋址IJMP ;PC(Z)程序相對(duì)尋址RJMP ;PCPC+1+k -2048k20473.3 數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令是在編程時(shí)使用最頻繁的一類(lèi)指令。 數(shù)據(jù)傳送指令是否靈活快速對(duì)程序的執(zhí)行速度產(chǎn)生很大影響。 數(shù)據(jù)傳送指令執(zhí)行操作是寄存器與寄存器, 寄存器與數(shù)據(jù)存儲(chǔ)器 (SRAM), 寄存器與 I/O 端口之間的數(shù)據(jù)傳送。 另外還有從程序存儲(chǔ)器直接取數(shù)指令 LPM (ELPM)以及 PUSH 壓棧和 POP 出棧 的堆棧指令3.3.1 直接尋址數(shù)據(jù)傳送指令(1)寄存器間傳送數(shù)據(jù)MOV Copy RegisterMOV Rd,Rr ; Rd Rr, 0 d 31, 0 r 3
14、1, PC PC + 1將一個(gè)寄存器Rr內(nèi)容復(fù)制到另一個(gè)寄存器Rd. 源寄存器 Rr 的內(nèi)容不改變, 而目的寄存器 Rd 復(fù)制了 Rr 的內(nèi)容所有的傳送指令對(duì)SREG的標(biāo)志位無(wú)影響Example: mov r16,r0 ; Copy r0 to r16 call check ; Call subroutine .check: cpi r16,$11 ; Compare r16 to $11 . ret ; Return from subroutine3.3.1 直接尋址數(shù)據(jù)傳送指令(*)寄存器字復(fù)制(mega系列)MOVW Copy Register WordMOVW Rd+1:Rd,Rr+1
15、:RrMOVW Rd,Rr ; Rd+1:Rd Rr+1:Rr, d 0,2,4,30 , r 0,2,4,30 , PC PC + 1將一個(gè)寄存器對(duì)Rr+1:Rr內(nèi)容復(fù)制到另一個(gè)寄存器對(duì)Rd+1:Rd. 源寄存器對(duì)Rr+1:Rr的內(nèi)容不改變, 而目的寄存器對(duì) Rd+1:Rd 復(fù)制了Rr+1:Rr 的內(nèi)容Example:movw r17:16,r1:r0; Copy r1:r0 to r17:r16call check ; Call subroutine.check: cpi r16,$11 ; Compare r16 to $11.cpi r17,$32 ; Compare r17 to $
16、32.ret ; Return from subroutine3.3.1 直接尋址數(shù)據(jù)傳送指令(2) SRAM 數(shù)據(jù)直接送寄存器LDS Load Direct from Data SpaceLDS Rd,k ; Rd (k), 0 d 31, 0 k 65535, PC PC + 2把 SRAM 中 1 個(gè)字節(jié)裝入到寄存器,其中k是SRAM的地址(16 位)(3)寄存器數(shù)據(jù)直接送 SRAMSTS Store Direct to Data SpaceSTS k,Rr ; (k) Rr, 0 r 31 其余同上Example:LP:lds r2,$0200 ;把片內(nèi) SRAM 地址$0200 數(shù)據(jù)
17、裝入R2,設(shè):($0200)=$11 add r2,r1 ;R2 與 R1 內(nèi)容相加,結(jié)果存于 R2 中,設(shè):(r1)=$88 sts $0200,r2 ;R2 的內(nèi)容送到片內(nèi) SRAM 地址$0200 RJMP LP ;打開(kāi)片內(nèi) SRAM 窗口(data)觀察,反復(fù)測(cè)試3.3.1 直接尋址數(shù)據(jù)傳送指令(4)立即數(shù)送寄存器LDI Load ImmediateLDI Rd,K ; Rd K, 16 d 31, 0 K 255, PC PC + 1裝入一個(gè) 8 位常數(shù)到寄存器R16R31中clr r31 ;Z高字節(jié)清零 ldi r30,$F0 ;Z低字節(jié)送$F0lpm ;從程序存儲(chǔ)器取數(shù)送R0,請(qǐng)
18、觀察 R0 寄存器內(nèi)容3.3.2 間接尋址數(shù)據(jù)傳送指令1、使用 X 指針寄存器間接尋址傳送數(shù)據(jù)(1)使用指針 X 間接將 SRAM 內(nèi)容裝入到寄存器LD Load Indirect from Data Space to Register using Index XLD Rd, X ; Rd (X) (X不變)LD Rd, X+ ; Rd (X), X X + 1 (X后增1) LD Rd, -X ; X X 1, Rd (X) (X先減1) 0 d 31, PC PC + 1 以下未定義:LD r26, X+;LD r27, X+;LD r26, -X;LD r27, -XExample:cl
19、r r27 ; Clear X high byteldi r26,$60 ; Set X low byte to $60ld r0,X+ ; Load r0 with data space loc. $60(X post inc)ld r1,X ; Load r1 with data space loc. $61ldi r26,$63 ; Set X low byte to $63ld r2,X ; Load r2 with data space loc. $63 ld r3,X ; Load r3 with data space loc. $62(X pre dec)3.3.2 間接尋址數(shù)據(jù)
20、傳送指令1、使用 X 指針寄存器間接尋址傳送數(shù)據(jù)(2)使用指針 X 間接將寄存器內(nèi)容存儲(chǔ)到 SRAMST Store Indirect From Register to Data Space using Index XST X, Rr ; (X) Rr (X不變)ST X+, Rr ; (X) Rr, X X + 1 (X后增1) ST -X, Rr ; X X 1, (X) Rr (X先減1) 0 r 31, PC PC + 1 以下未定義:ST X+, r26;ST X+, r27;ST -X, r26;ST -X, r27Example:clr r27 ; Clear X high by
21、teldi r26,$60 ; Set X low byte to $60st X+,r0 ; Store r0 in data space loc. $60(X post inc)st X,r1 ; Store r1 in data space loc. $61ldi r26,$63 ; Set X low byte to $63st X,r2 ; Store r2 in data space loc. $63 st -X,r3 ; Store r3 in data space loc. $62(X pre dec)2、使用 Y 指針寄存器間接尋址傳送數(shù)據(jù)(3)使用指針 Y 間接將 SRAM
22、 中的內(nèi)容裝入寄存器LD (LDD) Load Indirect from Data Space to Register using Index YLD Rd, Y ; Rd (Y) (Y不變)LD Rd, Y+ ; Rd (Y), Y Y + 1 (Y后增1)LD Rd, -Y ; Y Y 1, Rd (Y) (Y先減1)LDD Rd, Y+q ; Rd (Y+q) (Y不變) 0 d 31, 0 q 63, PC PC + 1 以下未定義:LD r28, Y+;LD r29, Y+;LD r28, -Y;LD r29, -YExample:clr r29 ; Clear Y high by
23、teldi r28,$60 ; Set Y low byte to $60ld r0,Y+ ; Load r0 with data space loc. $60(Y post inc)ld r1,Y ; Load r1 with data space loc. $61ldi r28,$63 ; Set Y low byte to $63ld r2,Y ; Load r2 with data space loc. $63 ld r3,-Y ; Load r3 with data space loc. $62(Y pre dec)ldd r4,Y+2 ; Load r4 with data spa
24、ce loc. $642、使用 Y 指針寄存器間接尋址傳送數(shù)據(jù)(4)使用指針 Y 間接將寄存器內(nèi)容存儲(chǔ)到 SRAMST (STD) Store Indirect From Register to Data Space using Index YST Y, Rr ; (Y) Rr (Y不變)ST Y+, Rr ; (Y) Rr, Y Y + 1 (Y后增1)ST -Y, Rr ; Y Y 1, (Y) Rr (Y先減1)STD Y+q, Rr ; (Y+q) Rr (Y不變) 0 r 31, 0 q 63, PC PC + 1 以下未定義:ST Y+, r28;ST Y+, r29;ST -Y,
25、 r28;ST -Y, r29Example:clr r29 ; Clear Y high byteldi r28,$60 ; Set Y low byte to $60st Y+,r0 ; Store r0 in data space loc. $60(Y post inc)st Y,r1 ; Store r1 in data space loc. $61ldi r28,$63 ; Set Y low byte to $63st Y,r2 ; Store r2 in data space loc. $63 st -Y,r3 ; Store r3 in data space loc. $62(
26、Y pre dec)std Y+2,r4 ; Store r4 in data space loc. $643、使用 Z 指針寄存器間接尋址傳送數(shù)據(jù)(5)使用指針 Z 間接將 SRAM 中的內(nèi)容裝入到寄存器LD (LDD) Load Indirect from Data Space to Register using Index ZLD Rd, Z ; Rd (Z) (Z不變)LD Rd, Z+ ; Rd (Z), Z Z + 1 (Z后增1)LD Rd, -Z ; Z Z 1, Rd (Z) (Z先減1)LDD Rd, Z+q ; Rd (Z+q) (Z不變) 0 d 31, 0 q 63,
27、 PC PC + 1 以下未定義:LD r30, Z+;LD r31, Z+;LD r30, -Z;LD r31, -ZExample:clr r31 ; Clear Z high byteldi r30,$60 ; Set Z low byte to $60ld r0,Z+ ; Load r0 with data space loc. $60(Z post inc)ld r1,Z ; Load r1 with data space loc. $61ldi r30,$63 ; Set Z low byte to $63ld r2,Z ; Load r2 with data space loc.
28、 $63 ld r3,-Z ; Load r3 with data space loc. $62(Z pre dec)ldd r4,Z+2 ; Load r4 with data space loc. $643、使用 Z 指針寄存器間接尋址傳送數(shù)據(jù)(6)使用指針 Z 間接將寄存器內(nèi)容存儲(chǔ)到 SRAMST (STD) Store Indirect From Register to Data Space using Index ZST Z, Rr ; (Z) Rr (Z不變)ST Z+, Rr ; (Z) Rr, Z Z + 1 (Z后增1)ST -Z, Rr ; Z Z 1, (Z) Rr (Z
29、先減1)STD Z+q, Rr ; (Z+q) Rr (Z不變) 0 r 31, 0 q 63, PC PC + 1 以下未定義:ST Z+, r30;ST Z+, r31;ST -Z, r30;ST -Z, r31Example:clr r31 ; Clear Z high byteldi r30,$60 ; Set Z low byte to $60st Z+,r0 ; Store r0 in data space loc. $60(Z post inc)st Z,r1 ; Store r1 in data space loc. $61ldi r30,$63 ; Set Z low byt
30、e to $63st Z,r2 ; Store r2 in data space loc. $63 st -Z,r3 ; Store r3 in data space loc. $62(Z pre dec)std Z+2,r4 ; Store r4 in data space loc. $643.3.3 從程序存儲(chǔ)器中取數(shù)據(jù)指令1、從程序存儲(chǔ)器中取數(shù)裝入寄存器R0LPM Load Program Memory (3個(gè)時(shí)鐘周期)LPM ; R0 (Z), 無(wú)操作數(shù), R0隱含,PC PC + 1將 Z 寄存器指向的程序存儲(chǔ)器空間的一個(gè)字節(jié)裝入到寄存器 R0. 由于程序存儲(chǔ)器是按字(雙字節(jié))排序的
31、,Z(16位)指針的高15位為程序存儲(chǔ)器的地址,最低位LSB為0選擇低字節(jié),為1選擇高字節(jié)。該指令能尋址程序存儲(chǔ)器第一個(gè)64K字節(jié)(32K字).org $0010 ;字地址clr r31 ;Z 寄存器高位,存放程序存儲(chǔ)器高位地址 ldi r30,$F0 ;Z 寄存器低位,存放程序存儲(chǔ)器低位地址 CLR R29 ;清零 Y 寄存器高位 LDI R28,$F0 ;將$F0 裝入 Y 寄存器低位 LP: NOP ;也可設(shè)程序存儲(chǔ)器($000F0)=$00,以此類(lèi)推至設(shè)($00FF)=$FF LPM ;將 Z 寄存器所指向的程序存儲(chǔ)器低位數(shù)送 R0 ST Y+,R0 ;Y變址, 先將 R0 送 SRA
32、M($00F0),后 Y=Y+1 INC R30 ; R30(Z 寄存器低位)增1,即Z=Z+1CPI R30,$00 ;R30 內(nèi)容(Z 寄存器低位)與立即數(shù)$00 比較 BRNE LP ;R30 內(nèi)容不為 0 轉(zhuǎn),為 0 順執(zhí) INC R31 ;Z寄存器高位加1 ,(Z)=$0100 RJMP LP ;反復(fù)取數(shù)送數(shù),怎樣修改程序,使數(shù)據(jù)存儲(chǔ)器與 ;程序存儲(chǔ)器數(shù)據(jù)大小排列相同, .ORG $0078 ;字地址 (FLASH).DW 0X1122,0X2233,0X4455,0X6677,0X8899,0XAABB,0XCCDD .DW $0208,$5510,$1910,$8750,$501
33、2,$8757,$8872,$8757,$8852 Example:ldi ZH, high(Table_11) ; Initialize Z-pointerldi ZL, low(Table_11)lpm ; Load constant from Program ; Memory pointed to by Z (r31:r30).Table_1:.dw 0 x5876 ; 0 x76 is addresses when ZLSB= 0 ; 0 x58 is addresses when ZLSB= 從程序存儲(chǔ)器中取數(shù)據(jù)指令2、從程序存儲(chǔ)器中取數(shù)裝入寄存器RdLPM Rd,Z
34、 ; Rd (Z), PC PC + 1將 Z 寄存器指向的程序存儲(chǔ)器空間的一個(gè)字節(jié)裝入到寄存器 Rd. 3、帶后增量的從程序存儲(chǔ)器中取數(shù)裝入寄存器RdLPM Rd,Z+ ; Rd (Z), Z Z+1, PC PC + 1將 Z 寄存器指向的程序存儲(chǔ)器空間的一個(gè)字節(jié)裝入到寄存器 Rd.然后Z指針加13.3.3 從程序存儲(chǔ)器中取數(shù)據(jù)指令4、從程序存儲(chǔ)器中取數(shù)裝入寄存器R0(擴(kuò)展)ELPM Extended Load Program MemoryELPM ; R0 (RAMPZ:Z), 無(wú)操作數(shù), R0隱含,PC PC + 1(ATmega8無(wú)此指令)將 RAMPZ:Z 指向的程序存儲(chǔ)器空間的一
35、個(gè)字節(jié)裝入到寄存器 R0. 由于程序存儲(chǔ)器是按字(雙字節(jié))排序的,RAMPZ寄存器(在I/O空間)的最低位,加上Z(16位)指針的高15位,組成程序存儲(chǔ)器的尋址字地址,最低位LSB為0選擇低字節(jié),為1選擇高字節(jié)。3.3.3 從程序存儲(chǔ)器中取數(shù)據(jù)指令5、從程序存儲(chǔ)器中取數(shù)裝入寄存器Rd (擴(kuò)展)ELPM Rd,Z ; Rd (RAMPZ:Z), PC PC + 1 (ATmega8無(wú)此指令)將 RAMPZ:Z 指向的程序存儲(chǔ)器空間的一個(gè)字節(jié)裝入到寄存器 Rd.6、帶后增量的從程序存儲(chǔ)器中取數(shù)裝入寄存器Rd (擴(kuò)展)ELPM Rd,Z+ ; Rd (RAMPZ:Z), PC PC + 1 (ATm
36、ega8無(wú)此指令)將 RAMPZ:Z 指向的程序存儲(chǔ)器空間的一個(gè)字節(jié)裝入到寄存器 Rd.然后RAMPZ:Z指針加13.3.4 寫(xiě)程序存儲(chǔ)指令寫(xiě)程序存儲(chǔ)器SPM Store Program MemorySPM ; (Z) R1:R0, PC PC + 1將寄存器對(duì)R1:R0的內(nèi)容(16位字)寫(xiě)入Z指向的程序存儲(chǔ)器空間。用于具有IAP功能的的單片機(jī)。可以在程序運(yùn)行(一般在BootLoad過(guò)程)中修改Flash中的程序,實(shí)現(xiàn)動(dòng)態(tài)修改系統(tǒng)程序。(用于設(shè)備升級(jí))該指令能尋址程序存儲(chǔ)器第一個(gè)64K字節(jié)(32K字)3.3.5 I/O口數(shù)據(jù)傳送1、I/O口數(shù)據(jù)傳送到寄存器IN - Load an I/O Lo
37、cation to RegisterIN Rd,A ; Rd I/O(A), 0 d 31, 0 A 63, PC PC + 1將I/O空間(口、定時(shí)器、配置寄存器等)的數(shù)據(jù)傳送到寄存器區(qū)中的寄存器 Rd 中in r25,$16 ; Read Port Bcpi r25,4 ; Compare read value to constantbreq exit ; Branch if r25=4.exit: nop ; Branch destination (do nothing)3.3.5 I/O口數(shù)據(jù)傳送2、寄存器數(shù)據(jù)送I/O口OUT Store Register to I/O Locatio
38、nOUT A,Rr ; I/O(A) Rr, 0 r 31, 0 A 63, PC PC + 1將寄存器區(qū)中寄存器 Rr 的數(shù)據(jù)傳送到 I/O空間(口、定時(shí)器、配置寄存器等)clr r16 ; Clear r16ser r17 ; Set r17out $18,r16 ; Write zeros to Port Bnop ; Wait (do nothing)out $18,r17 ; Write ones to Port B3.3.6 堆棧操作指令1、進(jìn)棧指令PUSH Push Register on StackPUSH Rr ; STACK Rr, 0 r 31, PC PC + 1, S
39、P SP - 1存儲(chǔ)寄存器 Rr 的內(nèi)容到堆棧(SP后減1)2、出棧指令POP Pop Register from Stack POP Rd ; SP SP + 1, Rd STACK, 0 d 31, PC PC + 1(SP先加1)將堆棧中的字節(jié)裝入到寄存器 Rd 中 (堆棧的內(nèi)容不變,只是SP增1了)Example: call routine ; Call subroutine .routine: push r14 ; Save r14 on the Stack push r13 ; Save r13 on the Stack . pop r13 ; Restore r13 pop r1
40、4 ; Restore r14 ret ; Return from subroutine應(yīng)用舉例(一)點(diǎn)亮LED;ATmega8的PC0接一LED的陰極,再串300歐姆的限流電阻后接Vcc.include $000ldi r16,$ff ;set portc as outputout ddrc,r16ldi r16,$00 ;輸出低led亮out porta,r16here: rjmp here(二)LED閃爍;ATmega16的PA口PA0PA7分別接LED(D1D8)的陰極,各串300R限流電阻后接Vcc.include $000r
41、jmp $02Astart:ldi r16,low(RAMend) ;Set stackpointerout spl,r16ldi r16,high(RAMend)out sph,r16ldi r16,$ff ;set porta as outputout ddra,r16;(Continued)loop:ldi r16,$00 ;輸出低led亮out porta,r16ldi r24,6 ;設(shè)延時(shí)rcall delayldi r16,$ff ;輸出高led滅out porta,r16ldi r24,4rcall delayrjmp loop;(Continued)dela
42、y:d1:ldi r25,200d2:ldi r26,200d3:dec r26brne d3dec r25brne d2dec r24brne d1ret若要實(shí)現(xiàn)流水燈效果,如何更改程序?(三)數(shù)字撥碼盤(pán)輸入兩位 BCD 碼, 數(shù)碼管靜態(tài)顯示出來(lái)B 口定義為帶內(nèi)部上拉的輸入口, 外接兩個(gè) BCD碼數(shù)字撥盤(pán)。撥盤(pán)被撥到某一個(gè)位置時(shí), 輸入控制線A分別與 4 位數(shù)據(jù)線中的某幾位接通, A 端接地. 例把撥盤(pán)撥為3, 則數(shù)據(jù)線 2、1 與 A 相通,讀入低電平,8、4 與 A 不通,讀入高電平,即讀入為1100,取反即為0011(3)。C口、D口定義為輸出,經(jīng) 300電阻接兩共陰數(shù)碼管各段,數(shù)碼管
43、公共端(陰極)接地.include 8535def.inc rjmp reset tab:.db $3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f ;七段碼表(09,共陰) reset:ldi r16,$02 ;棧指針置初值 out sph,r16 ldi r16,$5f out spl,r16 ldi r16,0 ;定義 B 口輸入帶上拉 out ddrb,r16ldi r16,$ff out portb,r16 out ddrc,r16 ;定義 C 口 D 口為輸出 out ddrd,r16 loop: in r16,pinb ;讀 B 口引腳,開(kāi)關(guān)閉合為0
44、com r16 ;取反,開(kāi)關(guān)閉合對(duì)應(yīng)為1 mov r17,r16 andi r16,$0f ;取個(gè)位 BCD 碼 swap r17 ;半字節(jié)交換 andi r17,$0f ;取十位 BCD 碼 ldi ZH,high(tab*2) ;查個(gè)位七段碼 ldi ZL,low(tab*2) add ZL,r16 lpm out portc,r0 ;送 C 口靜態(tài)輸出 ldi ZH,high(tab*2) ;查十位七段碼 ldi ZL,low(tab*2) add ZL,r17 lpm out portd,r0 ;送 D 口靜態(tài)輸出 h: rjmp h ;3.4 算術(shù)和邏輯運(yùn)算指令3.4.1加法指令 A
45、DD Add without Carry例子Example:; Add R1:R0 to R3:R2add r2,r0 ; Add low byteadc r3,r1 ; Add with carry high byteADC Add with Carry3. 字加立即數(shù)ADIW Add Immediate to WordAdds an immediate value (0 - 63) to a register pair and places the result in the register pair. This instruction operates on the upper fou
46、r register pairs, and is well suited for operations on the pointer registers.ADIW Rd,K ; Rd+1:RdRd+1:Rd + K , d 24,26,28,30, 0 K 63, PC PC + 1Example:adiw r24,1 ; Add 1 to r25:r24 adiw ZL,63 ; Add 63 to the Z-pointer (r31:r30)4.增1指令I(lǐng)NC IncrementINC Rd ;RdRd + 1 0d31寄存器 Rd 的內(nèi)容加 1,結(jié)果送目的寄存器 Rd 中。該操作不改變
47、 SREG 中的 C 標(biāo)志, 所以允許INC 指令在多倍字長(zhǎng)計(jì)算中用作循環(huán)計(jì)數(shù)當(dāng)對(duì)無(wú)符號(hào)數(shù)操作時(shí),僅 BREQ(相等跳轉(zhuǎn))和BRNE(不為零跳轉(zhuǎn))指令有效(即跟所期望的一樣)。當(dāng)對(duì)二進(jìn)制補(bǔ)碼值操作時(shí),所有的帶符號(hào)跳轉(zhuǎn)指令都有效4.增1指令I(lǐng)NC IncrementExample: clr r22 ; clear r22loop: inc r22 ; increment r22 . cpi r22,$4F ; Compare r22 to $4f brne loop ; Branch if not equal nop ; Continue (do nothing)3.4.2減法指令1.不帶進(jìn)位減
48、法SUB Subtract without CarrySUB Rd,Rr ; Rd Rd Rr, 0 d 31, 0 r 31, PC PC + 1Example:sub r13,r12 ; Subtract r12 from r13brne noteq ; Branch if r12r13.noteq: nop ; Branch destination (do nothing)2. (字節(jié))減立即數(shù) SUBI Subtract ImmediateSUBI Rd,K ; Rd Rd K, 16 d 31, 0 K 255, PC PC + 1Example:subi r22,$11 ; Sub
49、tract $11 from r22brne noteq ; Branch if r22$11.noteq: nop ; Branch destination (do nothing)3.帶進(jìn)位減法 SBC Subtract with CarrySBC Rd,Rr ;RdRdRr C, 0 d 31, 0 r 31, PC PC + 1Example: ; Subtract r1:r0 from r3:r2sub r2,r0 ; Subtract low bytesbc r3,r1 ; Subtract with carry high byte4.帶進(jìn)位立即數(shù)減法 SBCI Subtract
50、Immediate with CarrySBCI Rd,K ; RdRdKC, 16 d 31, 0 K 255, PC PC + 1Example: ; Subtract $4F23 from r17:r16subi r16,$23 ; Subtract low bytesbci r17,$4F ; Subtract with carry high byte5. (字)減立即數(shù) SBIW Subtract Immediate from WordSBIW Rd,K ;Rd+1:Rd Rd+1:Rd - K , d 24,26,28,30, 0 K 63, PC PC + 1Example:sb
51、iw r24,1 ; Subtract 1 from r25:r24 sbiw YL,63 ; Subtract 63 from the Y-pointer (r29:r28)6.減1指令DEC DecrementDEC Rd ; Rd Rd 1, 0 d 31, PC PC + 1寄存器 Rd 的內(nèi)容減 1, 結(jié)果送目的寄存器 Rd 中. 該操作不改變 SREG 中的 C 標(biāo)志, 所以允許DEC 指令在多倍字長(zhǎng)計(jì)算中用作循環(huán)計(jì)數(shù).當(dāng)對(duì)無(wú)符號(hào)值操作時(shí),僅有 BREQ(不相等跳轉(zhuǎn))和 BRNE(不為零跳轉(zhuǎn))指令有效。當(dāng)對(duì)二進(jìn)制補(bǔ)碼值操作時(shí),所有的帶符號(hào)跳轉(zhuǎn)指令都有效Example: ldi r1
52、7,$10 ; Load constant in r17loop: add r1,r2 ; Add r2 to r1 dec r17 ; Decrement r17 brne loop ; Branch if r170 nop ; Continue (do nothing)3.4.3取反碼指令COM 取反碼Ones Complement(1的補(bǔ)碼)COM Rd ;Rd$FF Rd, 0 d 31, PC PC + 1對(duì)標(biāo)志位的影響:S、N、Z、V(0)、C(1)Example:com r4 ; Take ones complement of r4breq zero ; Branch if ze
53、ro.zero: nop ; Branch destination (do nothing)NEG 取補(bǔ)碼Twos Complement(2的補(bǔ)碼)注意:值$80 不改變NEG Rd ;Rd$00 Rd, 0 d 31, PC PC + 1Example:sub r11,r0 ; Subtract r0 from r11brpl positive ; Branch if result positiveneg r11 ; Take twos complement of r11 positive: nop ; Branch destination (do nothing)3.4.4 取補(bǔ)碼指令3.
54、4.5 比較指令1、寄存器比較CP Compare CP Rd,Rr ;Rd Rr, 0 d 31, 0 r 31, PC PC + 1該指令完成兩個(gè)寄存器Rd 和Rr 相比較操作,而寄存器的內(nèi)容不改變。該指令后能使用所有條件跳轉(zhuǎn)指令(根據(jù)SREG中的相關(guān)標(biāo)志位)Example:lp:cp r24,r19 ;單步執(zhí)行到此行,開(kāi)始時(shí)在調(diào)試窗口的對(duì)應(yīng)寄存器輸入數(shù)據(jù) ;第一次操作設(shè):(r24)=$AA,(r19)=$55 ;第二次操作設(shè):(r14)=$11, (r19)=$55brsh lp1 ;(r24)(r19)則轉(zhuǎn)lp1, (r24)小于(r19)順執(zhí)rjmp lp2 ;lp1:sub r24
55、,r19 ;(r24)相減(r19)brne lp ;(r24)不為0 轉(zhuǎn),為0 順執(zhí)lp2:adiw r24,$11 ;立即數(shù)加,要求d24,26,28,30, 0K63rjmp lp ;反復(fù)測(cè)試2、帶進(jìn)位比較CPC Compare with CarryCPC Rd,Rr ;Rd Rr C, 0 d 31, 0 r 31, PC PC + 1該指令完成兩個(gè)寄存器Rd 和Rr 相比較操作,并考慮了前面的進(jìn)位(借位)C,而寄存器的內(nèi)容不改變。該指令后能使用所有條件跳轉(zhuǎn)指令(根據(jù)SREG中的相關(guān)標(biāo)志位)Example:cp r2,r0 ; 單步執(zhí)行到此行,開(kāi)始時(shí)在調(diào)試窗口的對(duì)應(yīng)寄存器輸入數(shù)據(jù) ;設(shè)
56、:(R2)=$AA,(R0)=$55lp:sec ;(c)=1 cpc r3,r1 ;第一次操作設(shè):(r3)=$11, (r1)=$10, ;第二次操作設(shè):(R3)=$12,(R1)=$10,brne lp1 ;比較不相等跳轉(zhuǎn),相等順執(zhí) rjmp lp2 ; 相對(duì)跳轉(zhuǎn) lp1:inc r1 ;+1 rjmp lp lp2:dec r1 ;-1 rjmp lp ;反復(fù)測(cè)試 3、帶立即數(shù)比較CPI Compare with ImmediateCPI Rd,K ;Rd K, 16 d 31, 0 K 255, PC PC + 1該指令完成寄存器 Rd 和常數(shù)的比較操作,而寄存器的內(nèi)容不改變。該指令后
57、能使用所有條件跳轉(zhuǎn)指令(根據(jù)SREG中的相關(guān)標(biāo)志位)Example:LP:CPI R19,3 ; 單步執(zhí)行到此行,開(kāi)始時(shí)在調(diào)試窗口的對(duì)應(yīng)寄存器輸入數(shù)據(jù) ;設(shè)(R19)=4 BRNE LP1 ;不相等轉(zhuǎn),相等順執(zhí) INC R19 ;(R19)+1 RJMP LP ;反復(fù)測(cè)試 LP1:DEC R19 ;(R19)-1 RJMP LP ;反復(fù)測(cè)試3.4.6 邏輯與指令1、寄存器邏輯與AND Logical AND AND Rd,Rr ; Rd Rd Rr , 0 d 31, 0 r 31, PC PC + 1寄存器 Rd 和寄存器 Rr 的內(nèi)容位邏輯與,結(jié)果送目的寄存器 Rd。應(yīng)用:清 0,使某位為
58、 0,用 0 去與;保留,用 1 去邏輯與;代替硬件與門(mén)Example:LP:add r2,r3 ; 單步執(zhí)行到此行,開(kāi)始時(shí)在調(diào)試窗口的對(duì)應(yīng)寄存器輸入數(shù)據(jù) ;設(shè):(R2)=0B1000 0000,(R3)=0B0001 0011 LDI R16,1 ;(R16)=0B0000 0001, and r2,r16 ;(R2)= RJMP LP ;反復(fù)測(cè)試2、帶立即數(shù)與ANDI Logical AND with ImmediateANDI Rd,K ; Rd Rd K , 16 d 31, 0 K 255, PC PC + 1寄存器 Rd 的內(nèi)容與常數(shù)邏輯與,結(jié)果送目的寄存器 Rd。應(yīng)用:清 0,使
59、某位為 0,用 0 去與;保留,用 1 去邏輯與;代替硬件與門(mén)Example:LP: andi r17,$0F ; 單步執(zhí)行到此行,開(kāi)始時(shí)在調(diào)試窗口的對(duì)應(yīng)寄存器輸入數(shù)據(jù) ;設(shè):(r17)=$F0 ,(R18)=$EF ,(R19)=$FF,單步執(zhí)行后,(R17)= andi r18,$10 ;(R18)= andi r19,$AA ;(R19)= RJMP LP ;反復(fù)測(cè)試3、寄存器位清零CBR Clear Bits in RegisterCBR Rd,K ; Rd Rd ($FF - K), 16 d 31, 0 K 255, PC PC + 1清除寄存器 Rd 中的指定位。利用寄存器Rd的
60、內(nèi)容與常數(shù)K 的反碼相與完成的,其結(jié)果放在寄存器Rd中。Example:lp:cbr R16,$F0 ; 單步執(zhí)行到此行,在調(diào)試窗口的對(duì)應(yīng)寄存器輸入數(shù)據(jù) ;(r16)=$FF, Clear upper nibble of r16CBR R18,1 ;(r18)=$80,Clear bit 0 in r18RJMP lp ;反復(fù)測(cè)試4、測(cè)試寄存器為零或負(fù)TST Test for Zero or Minus TST Rd ; Rd Rd Rd , 0 d 31, PC PC + 1測(cè)試寄存器是否是零或是負(fù)。完成同一寄存器之間的邏輯與操作,而寄存器內(nèi)容不改變。Example:sub r0,r2 ;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 黃頁(yè)廣告前臺(tái)工作總結(jié)
- 門(mén)診輸液室護(hù)理工作總結(jié)
- 2021年安徽省蕪湖市公開(kāi)招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- 2022年云南省德宏自治州公開(kāi)招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- 2024年陜西省漢中市公開(kāi)招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- 2022年河南省駐馬店市公開(kāi)招聘警務(wù)輔助人員輔警筆試自考題2卷含答案
- 2023年河南省焦作市公開(kāi)招聘警務(wù)輔助人員輔警筆試自考題2卷含答案
- 甘肅省平?jīng)鍪?2024年-2025年小學(xué)六年級(jí)語(yǔ)文)統(tǒng)編版階段練習(xí)((上下)學(xué)期)試卷及答案
- 甘肅省蘭州市(2024年-2025年小學(xué)六年級(jí)語(yǔ)文)部編版摸底考試(下學(xué)期)試卷及答案
- 2025年作物收獲機(jī)械項(xiàng)目申請(qǐng)報(bào)告模范
- 四川新農(nóng)村建設(shè)農(nóng)房設(shè)計(jì)方案圖集川西部分
- 《陸上風(fēng)電場(chǎng)工程設(shè)計(jì)概算編制規(guī)定及費(fèi)用標(biāo)準(zhǔn)》(NB-T 31011-2019)
- 我和我的祖國(guó)拼音版
- 2023年生態(tài)環(huán)境綜合行政執(zhí)法考試參考題庫(kù)(400題)
- 北師大七年級(jí)上數(shù)學(xué)易錯(cuò)題(共8頁(yè))
- 供應(yīng)商供方履約評(píng)價(jià)表(參考模板)
- 徒步行軍pt課件
- 國(guó)家電網(wǎng)公司電網(wǎng)設(shè)備缺陷管理規(guī)定國(guó)網(wǎng)(運(yùn)檢3)(文號(hào)國(guó)家電網(wǎng)企管
- 輸血科(血庫(kù))儀器設(shè)備使用、保養(yǎng)記錄表
- 《目標(biāo)管理》PPT課件
- 膨脹?;⒅闊o(wú)機(jī)保溫砂漿檢測(cè)報(bào)告
評(píng)論
0/150
提交評(píng)論