003第三章ET44系列指令说明.docx

上传人:b****8 文档编号:9350455 上传时间:2023-02-04 格式:DOCX 页数:35 大小:45.08KB
下载 相关 举报
003第三章ET44系列指令说明.docx_第1页
第1页 / 共35页
003第三章ET44系列指令说明.docx_第2页
第2页 / 共35页
003第三章ET44系列指令说明.docx_第3页
第3页 / 共35页
003第三章ET44系列指令说明.docx_第4页
第4页 / 共35页
003第三章ET44系列指令说明.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

003第三章ET44系列指令说明.docx

《003第三章ET44系列指令说明.docx》由会员分享,可在线阅读,更多相关《003第三章ET44系列指令说明.docx(35页珍藏版)》请在冰豆网上搜索。

003第三章ET44系列指令说明.docx

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←A&#k。

說明:

將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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1