003第三章ET44系列指令说明.docx
《003第三章ET44系列指令说明.docx》由会员分享,可在线阅读,更多相关《003第三章ET44系列指令说明.docx(35页珍藏版)》请在冰豆网上搜索。
![003第三章ET44系列指令说明.docx](https://file1.bdocx.com/fileroot1/2023-2/3/2c87b3da-4f12-436f-b157-22a19b062d9d/2c87b3da-4f12-436f-b157-22a19b062d9d1.gif)
003第三章ET44系列指令说明
第三章ET44系列指令說明
3-1、簡介
微控制器所能執行的指令是二進位碼形式的指令,也就是所謂的機械碼(MachineCode)。
對程式設計者而言,記憶機械碼指令是一件非常困難的事情,並且也很難從機械碼中了解指令的動作,因此將每一個指令以一個助憶碼來替代,由助憶碼來了解程式的運作,這也就是所謂的組合語言。
由於微控制器只能執行機械碼指令,所以必須將組合語言指令轉換為機械碼指令,然後放入微控制器的程式記憶體中才能執行。
將組合語言指令轉換為機械碼指令的過程稱為組譯(Assemble),做這件工作的程式稱為組譯器(Assembler)。
如果所用的組譯器不同,則組合語言程式的寫法也可能不同。
3-2、ET44M210組合語言
ET44M210所用到的指令共有64個,比起其他微控制器而言,指令並不算太多。
在剛開始學習時,可以先將所有的指令瀏覽過,大概知道每個指令的用法,等到開始寫程式之後再對指令加強了解,如此,便可以很快的了解指令的用法。
ET44M210的指令格式包括標記欄、操作碼欄、運算元欄和註解欄。
I.標記欄(Label)
標記欄代表一個記憶體位址,也就是表示該指令所在的記憶體位址。
標記欄通常用來代表跳躍指令的進入點,例如以“JMP”指令跳躍至本指令時,“JMP”指令的運算元部分只需填入標記即可。
並非每一個指令都需要加入標記,程式設計者可以視需要決定是否在指令中加入標記。
標記欄也可以是單獨一行,例如:
Start:
MOVA,#0XFF
II.操作碼欄
操作碼欄有兩種情況:
功能助憶碼(Mnemonics)及假指令(PseudoInstruction)。
功能助憶碼是用來告訴微控制器要做什麼動作,例如MOV、ADD等。
假指令不會被組譯器組譯成機械碼指令,但它能幫助組譯器產生適當的機械碼指令,例如ORG、DB等。
III.運算元欄
運算元則是提供微控制器所需要的資訊,以完成一個指令的動作。
運算元的個數是由指令所決定的,可能有1~3個。
若有超過2個以上的運算元,則必須以逗點將運算元分開。
IV.註解欄
註解欄是供程式設計者寫文字說明的地方,增加程式的可讀性,因此組譯器會在組譯的過程將其忽略。
若註解欄的說明詳細,對程式的開發或除錯會有很大的幫助。
註解欄是以“;”或“//”來當開頭字元,組譯器會在組譯的過程對“;”或“//”後的資料完全忽略。
程式設計者也可以用“/*及“*/”做多行的註解。
例如:
/*********************
程式使用LCD,在LCD上顯示單一字元。
LCMEN ->PORTF BIT3
LCMRS ->PORTC BIT4
D0~D7 ->PORTD BIT0~7
*********************/
3-3、ET44M210指令說明
I.系統控制指令
(1)NOP(NoOperation)
1.NOP
功能:
不做任何動作。
說明:
NOP指令純粹是用來作時間延遲的指令。
影響旗標:
無。
例如:
BSPORTA,0
NOP;延遲兩個指令時間。
NOP
BCPORTA,0
(2)WDTC(ClearWatchDogTimer)
1.WDTC
功能:
將WDT設為0。
說明:
WDTC指令是用來將WatchDogTimer內的值重置。
影響旗標:
無。
例如:
BSPORTA,0
NOP
NOP
WDTC;清除WDT內的值。
(3)RET(ReturnFromSubroutine)
1.RET
功能:
從副程式返回。
說明:
從CALL呼叫的副程式,都是以RET為返回的指令。
微控制器將堆疊最頂端的值取出,送到程式計數器繼續執行。
影響旗標:
無。
例如:
TEST:
:
:
RET
START:
:
:
CALLTEST;執行RET之前,堆疊最頂端值為HERE的位址
HERE:
;執行RET之後,程式計數器值為HERE的位址
ADDA,#1
(4)RETI(ReturnFromInterrupt)
1.RETI
功能:
從中斷副程式返回。
說明:
當中斷發生時,微控制器會將程式計數器的值存入堆疊中,並且跳到對應的中斷副程式上,最後會以RETI為返回的指令。
影響旗標:
無。
例如:
INTRTN:
;中斷副程式
:
:
RETI
START:
:
:
;中斷發生
HERE:
;執行RETI之前,堆疊最頂端值為HERE的位址
:
;執行RETI之後,程式計數器值為HERE的位址
:
(5)SLEP(Sleep)
1.SLEP
功能:
將WDT設為0,並且振盪器停止振盪。
說明:
SLEP指令會將WatchDogTimer內的值重置,並且振盪器停止振盪讓微控制器進入睡眠模式。
影響旗標:
無。
例如:
BSPORTA,0
NOP
NOP
SLEP;微控制器進入睡眠模式。
(6)ENI(EnableInterrupt)
1.ENI
功能:
將GIE設為1。
說明:
GIE是所有中斷致能的位元,執行此指令會將GIE設為1,以致能所有的中斷。
當中斷發生時,微控制器會跳到對應的中斷副程式上。
首先微控制器會將程式計數器的值存入堆疊中,重置GIE旗標並且除能其他中斷,之後微控制器會將程式計數器的值設在中斷向量上,並執行相關的程式,中斷狀態暫存器會指出造成中斷的原因。
影響旗標:
無。
例如:
INTRTN:
;中斷副程式
:
:
RETI
START:
:
ENI;中斷致能
(7)DISI(DisableInterrupt)
1.DISI
功能:
將GIE設為0。
說明:
執行此指令會將GIE設為0,以除能所有的中斷。
影響旗標:
無。
例如:
INTRTN:
;中斷副程式
DISI;中斷除能
:
RETI
START:
:
ENI;中斷致能
(8)DAA(DecimalAdjustA)
1.DAA
功能:
將ACC的值作十進位調整。
說明:
DAA是將ACC內八位元的二進位值,拆成兩個四位元值後,以十進位來表示(BCD)。
影響旗標:
C旗標。
例如:
MOVA,#0X09
ADDA,#0X06;9+6
DAA;A=15H(BCD格式)
II.查表指令
(1)TBRDP(TableReadPlus)
此指令有兩種用法:
1.TBRDPR
功能:
若TABPT的Bit0=0則R←LowByte(ROM[(TABPT∕2)]);
TABPT的Bit0=1則R←HighByte(ROM[(TABPT∕2)]);
並且TABPT←TABPT+1。
Note:
TABPT為暫存器“HTBL”及“LTBL”的合稱。
說明:
在程式記憶體中的Table取得資料,並假設目前位址在TABPT∕2,執行此指令時,若TABPT的Bit0=0則會將ROM(TABPT∕2)內容的LowByte載入R暫存器;若TABPT的Bit0=1則會將ROM(TABPT∕2)內容的HighByte載入R暫存器;TABPT會自動加1。
影響旗標:
無。
2.TBRDPA
功能:
若TABPT的Bit0=0則A←LowByte(ROM[(TABPT∕2)]);
TABPT的Bit0=1則A←HighByte(ROM[(TABPT∕2)]);
並且TABPT←TABPT+1。
說明:
在程式記憶體中的Table取得資料,並假設目前位址在TABPT∕2,執行此指令時,若TABPT的Bit0=0則會將ROM(TABPT∕2)內容的LowByte載入A暫存器;若TABPT的Bit0=1則會將ROM(TABPT∕2)內容的HighByte載入A暫存器;TABPT會自動加1。
影響旗標:
無。
例如:
ORG0X0000
MOVA,#(CHK*2)/0x100
MOVHTBL,A
MOVA,#(CHK*2)%0x100
MOVLTBL,A
NOP
NOP
TBRDPA
:
:
ORG0X0010
CHK:
DB0xAA,0xBB,0xCC,0XDD
當上列程式經過組譯之後,其在ROM裡面的值入下所示:
ROM位址ROM的內容程式碼
0000A700MOVA,#(CHK*2)/0x100
0001A90CMOVHTBL,A
0002A720MOVA,#(CHK*2)%0x100
0003A90BMOVLTBL,A
00040000NOP
00050000NOP
0006000ATBRDPA
:
:
0010ORG0X0010
0010CHK:
0010BBAADB0xAA,0xBB,0xCC,0XDD
0011DDCC
“CHK”Label在ROM位址0x0010,因此TABPT=HTBL:
LTBL=0x0020,“HTBL”暫存器的值為0x00,“LTBL”暫存器的值為0x20。
而執行TBRDPA指令時:
A=LowByte(ROM[(0x0010)]=0XAA),
TABPT=TABPT+1=0x0021
(2)TBRD(TableRead)
此指令有兩種用法:
1.TBRDR
功能:
若TABPT的Bit0=0則R←LowByte(ROM[(TABPT∕2)]);
TABPT的Bit0=1則R←HighByte(ROM[(TABPT∕2)]);
說明:
在程式記憶體中的Table取得資料,並假設目前位址在TABPT∕2,執行此指令時,若TABPT的Bit0=0則會將ROM(TABPT∕2)內容的LowByte載入R暫存器;若TABPT的Bit0=1則會將ROM(TABPT∕2)內容的HighByte載入R暫存器。
影響旗標:
無。
2.TBRDA
功能:
若TABPT的Bit0=0則A←LowByte(ROM[(TABPT∕2)]);
TABPT的Bit0=1則A←HighByte(ROM[(TABPT∕2)]);
說明:
在程式記憶體中的Table取得資料,並假設目前位址在TABPT∕2,執行此指令時,若TABPT的Bit0=0則會將ROM(TABPT∕2)內容的LowByte載入A暫存器;若TABPT的Bit0=1則會將ROM(TABPT∕2)內容的HighByte載入A暫存器。
影響旗標:
無。
例如:
ORG0X0000
MOVA,#(CHK*2)/0x100
MOVHTBL,A
MOVA,#(CHK*2)%0x100
MOVLTBL,A
NOP
NOP
TBRDPA
:
:
ORG0X0010
CHK:
DB0xAA,0xBB,0xCC,0XDD
;TABPT=0x0020,A=ROM[(0x0010)]=0xAA,TABPT=0x0020
(3)TBRDM(TableReadMinus)
此指令有兩種用法:
1.TBRDMR
功能:
若TABPT的Bit0=0則R←LowByte(ROM[(TABPT∕2)]);
TABPT的Bit0=1則R←HighByte(ROM[(TABPT∕2)]);
並且TABPT←TABPT-1。
說明:
在程式記憶體中的Table取得資料,並假設目前位址在TABPT∕2,執行此指令時,若TABPT的Bit0=0則會將ROM(TABPT∕2)內容的LowByte載入R暫存器;若TABPT的Bit0=1則會將ROM(TABPT∕2)內容的HighByte載入R暫存器;TABPT會自動減1。
影響旗標:
無。
2.TBRDMA
功能:
若TABPT的Bit0=0則A←LowByte(ROM[(TABPT∕2)]);
TABPT的Bit0=1則A←HighByte(ROM[(TABPT∕2)]);
並且TABPT←TABPT-1。
說明:
在程式記憶體中的Table取得資料,並假設目前位址在TABPT∕2,執行此指令時,若TABPT的Bit0=0則會將ROM(TABPT∕2)內容的LowByte載入A暫存器;若TABPT的Bit0=1則會將ROM(TABPT∕2)內容的HighByte載入A暫存器;TABPT會自動減1。
影響旗標:
無。
例如:
ORG0X0000
MOVA,#(CHK*2)/0x100
MOVHTBL,A
MOVA,#(CHK*2)%0x100
MOVLTBL,A
NOP
NOP
TBRDPA
:
:
ORG0X0010
CHK:
DB0xAA,0xBB,0xCC,0XDD
;TABPT=0x0020,A=ROM[(0x0010)]=0xAA,TABPT=TABPT-1=0x001F
(4)TBL(TableLookUp)
1.TBL
功能:
R2←R2+A。
說明:
將A暫存器的值加到R2(程式計數器)暫存器內,結果會取代R2(程式計數器)暫存器。
影響旗標:
Z,C,DC旗標。
例如:
TBL
RETL#50;A=1
RETL#100;A=2
RETL#150;A=3
RETL#200;A=4
(5)RETL(ReturnImmediateDataToTheARegister)
1.RETL
功能:
A←#k,堆疊最頂端的值取出,送到程式計數器。
說明:
此指令將資料“k”存入A暫存器,並且將堆疊最頂端的值取出,送到程式計數器繼續執行。
影響旗標:
無。
III.邏輯指令
(1)OR(InclusiveOR)
此指令有三種用法:
1.ORA,R
功能:
A←AˇR。
說明:
將A暫存器與R暫存器作OR運算後,將結果存入A暫存器內。
影響旗標:
Z旗標。
2.ORR,A
功能:
R←RˇA。
說明:
將A暫存器與R暫存器作OR運算後,將結果存入R暫存器內。
影響旗標:
Z旗標。
3.ORA,#k
功能:
A←Aˇ#k。
說明:
將A暫存器與k值作OR運算後,將結果存入A暫存器內。
影響旗標:
Z旗標。
例如:
R==0x40
MOVA,#0x12
MOVR,A;R=0x12
MOVA,#0x03
ORA,R;R=0x12,A=0x13
(2)AND(And)
此指令有三種用法:
1.ANDA,R
功能:
A←A&R。
說明:
將A暫存器與R暫存器作AND運算後,將結果存入A暫存器內。
影響旗標:
Z旗標。
2.ANDR,A
功能:
R←R&A。
說明:
將A暫存器與R暫存器作AND運算後,將結果存入R暫存器內。
影響旗標:
Z旗標。
3.ANDA,#k
功能:
A←Ak。
說明:
將A暫存器與k值作AND運算後,將結果存入A暫存器內。
影響旗標:
Z旗標。
例如:
R==0x40
MOVA,#0x12
MOVR,A;R=0x12
MOVA,#0x03
ORA,R;R=0x12,A=0x02
(3)XOR(ExclusiveOR)
此指令有三種用法:
1.XORA,R
功能:
A←A♁R。
說明:
將A暫存器與R暫存器作XOR運算後,將結果存入A暫存器內。
影響旗標:
Z旗標。
2.XORR,A
功能:
R←R♁A。
說明:
將A暫存器與R暫存器作XOR運算後,將結果存入R暫存器內。
影響旗標:
Z旗標。
3.XORA,#k
功能:
A←A♁#k。
說明:
將A暫存器與k值作XOR運算後,將結果存入A暫存器內。
影響旗標:
Z旗標。
例如:
R==0x40
MOVA,#0x12
MOVR,A;R=0x12
MOVA,#0x03
ORA,R;R=0x12,A=0x11
(4)COMA(ComplementR,PlaceInA)
1.COMAA
功能:
A←/R。
說明:
將R暫存器值作反向運算後,將結果存入A暫存器內。
影響旗標:
Z旗標。
例如:
R==0x40
MOVA,#0x12
MOVR,A;R=0x12
COMAR;R=0x12,A=0xED
(5)COM(ComplementR)
1.COMR
功能:
R←/R。
說明:
將R暫存器值作反向運算後,將結果存入R暫存器內。
影響旗標:
Z旗標。
例如:
R==0x40
MOVA,#0x12
MOVR,A;R=0x12
COMR;R=0xED,A=0x12
(6)RRCA(RotateRightRThroughCarry,PlaceInA)
1.RRCAR,n
功能:
[C,R]右旋n個位元到[C,A]。
說明:
將R暫存器與C旗標一起右旋n個位元後,將結果存入A暫存器內,R暫存器的值不變,如圖3-1所示。
右旋n次
圖3-1:
RRCA
影響旗標:
C旗標。
例如:
R==0x40
MOVA,#0x12
MOVR,A;R=0x12
RRCAR,2;R=0x12,A=0x04,n=2,C=1
(7)RRC(RotateRightRThroughCarry)
1.RRCR,n
功能:
[C,R]右旋n個位元到[C,R]。
說明:
將R暫存器與C旗標一起右旋n個位元後,將結果存入R暫存器,如圖3-2所示。
右旋n次
圖3-2:
RRC
影響旗標:
C旗標。
例如:
R==0x40
MOVA,#0x12
MOVR,A;R=0x12
RRCR,2;R=0x04,n=2,C=1
(8)RLCA(RotateLeftRThroughCarry,PlaceInA)
1.RLCAR,n
功能:
[C,R]左旋n個位元到[C,A]。
說明:
將R暫存器與C旗標一起左旋n個位元後,將結果存入A暫存器內,R暫存器的值不變,如圖3-3所示。
左旋n次
圖3-3:
RLCA
影響旗標:
C旗標。
例如:
R==0x40
MOVA,#0x12
MOVR,A;R=0x12
RLCAR,2;R=0x12,A=0x48,n=2,C=0
(9)RLC(RotateLeftRThroughCarry)
1.RLCR,n
功能:
[C,R]左旋n個位元到[C,R]。
說明:
將R暫存器與C旗標一起左旋n個位元後,將結果存入R暫存器內,如圖3-4所示。
左旋n次
圖3-4:
RLC
影響旗標:
C旗標。
例如:
R==0x40
MOVA,#0x12
MOVR,A;R=0x12
RLCR,2;R=0x48,n=2,C=0
(10)SHRA(ShiftRightR,PlaceInA)
1.SHRAR,n
功能:
[C,R]右移n個位元到A暫存器。
說明:
將R暫存器右移n個位元後,將C旗標插入高位元,並將結果存入A暫存器內,R暫存器的值不變,如圖3-5所示。
右移n次
圖3-5:
SHRA
影響旗標:
無。
例如:
MOVA,#0x12
MOVR,A;R=0x12
SHRAR,2;R=0x12,A=0x04,n=2
(11)SHLA(ShiftLeftR,PlaceInA)
1.SHLAR,n
功能:
[C,R]左移n個位元到A暫存器。
說明:
將R暫存器左移n個位元後,將C旗標插入低位元,並將結果存入A暫存器內,R暫存器的值不變,如圖3-6所示。
左移n次
圖3-6:
SHLA
影響旗標:
無。
例如:
MOVA,#0x12
MOVR,A;R=0x12
SHLAR,2;R=0x12,A=0x48,n=2
IV.比較分支指令
(1)JBC(BitTest,JumpIfClear)
1.JBCR,b,addr
功能:
若R(b)=0,jumptoaddr。
說明:
若R暫存器的第“b”個位元等於0,則程式跳至addr執行。
影響旗標:
無。
例如:
R40_0equal“1”
JBC0x10,0,addr;測試R10的第0個位元是否為0
BS0x40,0;若是則R40_0==0
Addr:
;否則R40_0==1
BC0x40,1
(2)JBS(BitTest,JumpIfSet)
1.JBSR,b,addr
功能:
若R(b)=1,jumptoaddr。
說明:
若R暫存器的第“b”個位元等於1,則程式跳至addr執行。
影響旗標:
無。
例如:
R40_0equal“1”
JBS0x10,0,addr;測試R10的第0個位元是否為1
BS0x40,0;若是則R40_0==0
Addr:
;否則R40_0==1
BC0x40,1
(3)DJZA(DecrementR,PlaceInA,JumpIf0)
1.DJZAR,addr
功能:
若A←R-1=0,jumptoaddr。
說明:
若R暫存器的值減1後存入A暫存器等於0,則程式跳至addr執行。
影響旗標:
無。
例如:
HERE:
DJZA0x40,SKIP;A=R40-1
CONT:
;當A=0,程式計數器=addrSKIP
MOVA,#10;當A≠0,程式計數器=addrCONT
SKIP:
ADDA,#3
(4)DJZ(DecrementR,JumpIf0)
1.DJZR,addr
功能:
若R←R-1=0,jumptoaddr。
說明:
若R暫存器的值減1後存入R暫存器等於0,則程式跳至addr執行。
影響旗標:
無。
例如:
HERE:
DJ