第三章 EM78指令系统及程序设计.docx

上传人:b****3 文档编号:27450331 上传时间:2023-07-01 格式:DOCX 页数:34 大小:42.29KB
下载 相关 举报
第三章 EM78指令系统及程序设计.docx_第1页
第1页 / 共34页
第三章 EM78指令系统及程序设计.docx_第2页
第2页 / 共34页
第三章 EM78指令系统及程序设计.docx_第3页
第3页 / 共34页
第三章 EM78指令系统及程序设计.docx_第4页
第4页 / 共34页
第三章 EM78指令系统及程序设计.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

第三章 EM78指令系统及程序设计.docx

《第三章 EM78指令系统及程序设计.docx》由会员分享,可在线阅读,更多相关《第三章 EM78指令系统及程序设计.docx(34页珍藏版)》请在冰豆网上搜索。

第三章 EM78指令系统及程序设计.docx

第三章EM78指令系统及程序设计

第三章EM78指令系统

3.1.EM78指令概述

EM78156&EM78P156单片机共有的58条指令,其宽度为13位。

每一个指令码可分割成两部份,第一部分为标示指令功能的运算码(OPCODE),第二部份則指出运算时所需之參数,亦即运算码(OPERAND)。

而指令的类型大致可分为下列四种:

(1)控制型指令(controloperation):

INT...等等。

(2)面向寄存器(字节操作)型指令(registeroriented):

MOVA,Reg_B

;moveReg_BtoA

ADDReg_B,A

;addReg_BwithA,and

;saveinReg_B

...等等。

(3)位操作型指令(bitoriented):

BC,JBS...等等。

(4)常数型指令(constantoperation):

MOVA,@0x55;move0x55toA

XOR@0xFF;XorAwith0xFF

一般而言,EM78系列八位微控制器除一个指令需两个周期之外,其他的指令只需一个指令周期,除了对PC(ProgramCounter)做“写”的指令,需二个指令周期,如(MOVPC,A)。

3.2.EMC汇编语言指令集

符号解说:

1.符号‘R’:

代表一般用途寄存器中的其中一个。

2.符号‘B’:

代表一般用途寄存器中的某一位。

3.符号‘K’:

代表8位或10位的常数或内容。

4.符号‘A’:

代表累加寄存器。

3.2.1.面向寄存器(字节操作)型指令(26条)

助记符号

指令动作

标志影响

指令周期

语言描述

ADDA,R

A+R->A

Z,C,DC

1

ADD

ADDR,A

A+R->R

Z,C,DC

1

ADD

ANDA,R

A&R->A

Z

1

AND

ANDR,A

A&R->R

Z

1

AND

CLRR

0->R

Z

1

ClearRegister

CLRA

0->A

Z

1

CleartheAregister

COMR

/R->R

Z

1

ComplementR

助记符号

指令动作

标志影响

指令周期

语言描述

COMAR

/R->A

Z

1

ComplementR,PlaceinA

DAA

A寄存器调整为BCD值

C

1

DecimalAdjust

DECR

R-1->R

Z

1

DecrementR

DECAR

R-1->A

Z

1

DecrementR,PlaceinA

DJZR

R-1->R结果为零就跳过下一个指令

1

DecrementR,Skipif0

DJZAR

R-1->A结果为零就跳过下一个指令

1

DecrementR,PleaseinAregister,Skipif0

INCR

R+1->R

Z

1

IncrementR

INCAR

R+1->A

Z

1

IncrementR,PleaseinA

JZR

R+1->R,结果为零就跳过下一个指令

1

IncrementR,Skipif0

JZAR

R+1->A,结果为零就跳过下一个指令

1

IncrementR,PlaceintheAregiser,Skipif0

MOVR,A

A->R

1

MoveData

MOVA,R

R->A

Z

1

MoveData

MOVR,R

R->R

Z

1

MoveData

ORA,R

AORR->A

Z

1

InclusiveOR

ORR,A

AORR->R

Z

1

InclusiveOR

SUBA,R

R-A->A

Z,C,DC

1

Subtract

SUBR,A

R-A->R

Z,C,DC

1

Subtract

XORA,R

AXORR->A

Z

1

ExclusiveOR

XORR,A

AXORR->R

Z

1

ExclusiveOR

3.2.2.面向位操作类指令(10条)

助记符号

指令动作

标志影响

指令周期

语言描述

BCR,B

0->R(B)

1

BitClear

BSR,B

1->R(B)

1

BitSet

JBCR,B

如果R(B)=0,则跳过下一个指令

1

BitTest,SkipifClear

JBSR,B

如果R(B)=1,则跳过下一个指令

1

BitTest,SkipifSet

RLCR

R(N)->R(N+1)

R(7)->C

C->R(0)

C

1

RotateLeftRthroughCarry

RLCAR

R(N)->A(N+1)

R(7)->C

C->A(0)

C

1

RotateLeftRthroughCarry,PlaceintheARegister

RRCR

R(N)->R(N-1)

R(0)->C

C->R(7)

C

1

RotateRightRthroughCarry

助记符号

指令动作

标志影响

指令周期

语言描述

RRCAR

R(N)->A(N-1)

R(0)->C

C->A(7)

C

1

RotateRightRthroughCarry,PlaceintheARegister

SWAPR

R(0-3)->R(4-7)

R(4-7)->R(0-3)

1

SwapR

SWAPAR

R(0-3)->A(4-7)

R(4-7)->A(0-3)

1

SwapR

3.2.3.常数操作和控制类指令(22条)

助记符号

指令动作

标志影响

指令周期

语言描述

ADDA,K

A+K->A

Z,C,DC

1

ADD

ANDA,K

A&K->A

Z

1

AND

CALLK

PC+1->[SP]

(PAGE,K)->PC

1

SubroutineCall

CONTR

CONT->A

1

MoveCONTtotheAregister

CONTW

A->CONT

1

MoveAtoCONT

DISI

禁止中断

1

DisableInterrupt

ENI

使能中断

1

EnableInterrupt

INT

PC+1->[SP]

001H->PC

1

Softwareinterrupt

IORR

IOCR->A

1

MoveIOCRtotheAregister

IOWR

A->IOCR

1

MoveAtoIOCR

JMPK

(PAGE,K)->PC

1

UnconditionalBranch

MOVA,K

K->A

1

MoveData

NOP

1

NoOperation

ORA,K

AORK->A

Z

1

InclusiveOR

RET

[堆栈顶端]->PC

1

ReturnfromSubroutine

RETI

[堆栈顶端]->PC,使能中断

1

ReturnfromInterrupt

RETLK

K->A,

[堆栈顶端]->PC

ReturnImmediateDatatotheARegister

SLEP

0->WDT,振荡器停止振荡

T,P

1

IntoSleepmode

SUBA,K

K-A->A

Z,C,DC

1

Subtract

TBL

PC+A->PC

Z,C,DC

2

TableLookUp

WDTC

0->WDT

T,P

1

ClearWatchdogTimer

XORA,K

AXORK->A

Z

1

ExclusiveOR

 

3.3.EM78指令寻址方式

关于对寄存器的存取,必须要先说明寄存器的位址,说明暂存的位址的方式称做寻址方式,EM78的寻址方式有两种,一种为直接寻址,一种为间接寻址。

3.3.1.立即数寻址

这种方式就是操作数为立即数,可直接从指令中获取。

例:

MOVA,@0x16;将常数0x16送给寄存器A

直接寻址

若是使用者要存取寄存器的内容,可以在运算码上直接描述。

●例:

将寄存器0X20的内容,COPY到寄存器0X21中。

MOVA,0X20

MOV0X21,A

3.3.2.间接寻址

这种寻址方式是通过寄存器R4来实现的,R4的bit0-5是用来选择寄存器(地址:

00-06,0F-3F)

若是使用者所需要存取的寄存器,有位址相邻的特性,使用间接寻址是很方便的。

●例:

写一个程序,將寄存器0X20~0X3F的值都填0。

;设定A=0X20。

;设定间接寻址寄存器(0X04)

;的內含值为0X20

;清除0X04所指的寄存器。

;递增间接寻址寄存器(0X04)

;设定A=0X04寄存器的值。

;比较间接寻址的位址是否

;以到0X3F。

若是则结束。

;否则在继续。

MOVA,@0X20

MOV0X04,A

AGAIN:

CLR0

INC0X04

MOVA,0X04

XORA,0X3F

JBS0X03,2

JMPAGAIN

END:

 

3.3.3.位寻址

这种位寻址是对寄存器中的任一位(bit)进行操作。

例:

BS0x12,2;将寄存器0x12的第2位置为“1”。

3.4.EM78指令说明

ADD

Add

语法

ADDA,R

编码

0

0011

10rr

rrrrr

操作內容

A+R-->A

受影响的标志

Z,C,DC﹔零标志﹐进位标志和辅助进位标志都会受影响

说明

將A寄存器的內含值加上R寄存器的內含值﹐並且把结果载入A寄存器中。

语法

ADDR,A

编码

0

0011

11rr

rrrrr

操作內容

A+R-->R

受影响的标志

Z,C,DC﹔零标志﹐进位标志和辅助标志都会受影响

说明

將A寄存器的內含值加上R寄存器的內含值﹐並且把结果载入R寄存器中。

语法

ADDA,k

编码

1

1111

kkkk

kkkk

操作內容

K+A-->A

受影响的标志

Z,C,DC﹔零标志﹐进位标志和辅助标志都会受影响

说明

將A寄存器的內含值加上立即值K﹐並且把结果载入A寄存器中。

举例说明

下两行指令敘述为A=R11+R12.

MOVA,0x11

ADDA,0x12;A=R11+R12

下两行指令敘述为R10=R11+R12.

MOVA,0x11

MOV0x10,A

MOVA,0x12

ADD0x10,A;R10=R11+R12

下两行指令敘述为A=0x01+0x01.

MOVA,@0x01;A=0x01

ADDA,@0x01;A=0x02

AND

And

语法

ANDA,R

编码

0

0010

10rr

rrrrr

操作內容

A&R-->A

受影响的标志

Z﹔零标志

说明

將A寄存器和R寄存器AND在一起﹐并将结果存入A寄存器。

 

语法

ANDR,A

编码

0

0010

11rr

rrrrr

操作內容

A&R-->R

受影响的标志

Z﹔零标志

说明

將A寄存器和R寄存器AND在一起﹐并将结果存入R寄存器。

语法

ANDA,K

编码

1

1010

kkkk

kkkk

操作內容

A&K-->A

受影响的标志

Z﹔零标志

说明

將A寄存器和立即值K﹐AND在一起﹐并将结果存入A寄存器。

举例说明

將port6和R10registerAND起來,并将结果输出到port6

MOVA,0x6;從port6输入内容

ANDA,0x10;把内容和R10做ANDMOV0x6,A;将结果输出到port6

R10=R11ANDR12

MOVA,0x11

MOV0x10,A

MOVA,0x12

AND0x10,A;R10=R11ANDR12

BC

BitClear

语法

BCR,b

编码

0

100b

bbrr

rrrrr

操作內容

0-->R(b)

受影响的标志

说明

R寄存器的位“b”被清为0。

举例说明

MOVA,@0x0f

MOV0x10,A;R10=00001111

BC0x10,3;R10=00000111

BS

BitSet

语法

BSR,b

编码

0

101b

bbrr

rrrrr

操作內容

1-->R(b)

受影响的标志

说明

R寄存器的位“b”被设成1。

举例说明

將狀态寄存器的零标志設成1。

BS0x3,2

CALL

SubroutineCall

语法

CALLk

编码

1

00kk

kkkk

kkkk

操作內容

PC+1-->[TopofStack]

k-->PC(9:

:

0)

R3(7:

:

5)-->PC(12:

:

10)

受影响的标志

说明

当呼叫一个子程序时﹐首先会將下一个指令的执行位址存入堆栈中﹐接下來将子程序的进入位址载入程序计数器中。

举例说明

HERE:

CALLSUBRTN

CONT:

MOVA,@10

执行CALL指令之前

PC=addressHERE

执行CALL指令之后

PC=addressSUBRTN

[TopofStack]=addressCONT

CLRA

CleartheAregister

语法

CLRA

编码

0

0000

1000

0000

操作內容

0-->A﹔A寄存器清除为0

受影响的标志

1-->Z﹔零标志设成1

说明

清除A寄存器﹐同時设定Z标志

举例说明

CLRA;清除A寄存器﹐同時設定Z标志

CLR

ClearRegister

语法

CLRR

编码

0

0000

11rr

rrrrr

操作內容

0-->R﹔R寄存器清除为0

受影响的标志

1-->Z﹔零标志設成1

说明

清除R寄存器﹐并设定零标志。

举例说明

CLR0x10;清除0x10寄存器

COMA

ComplementR,PlaceinA

语法

COMAR

编码

0

0100

10rr

rrrrr

操作內容

-->A

受影响的标志

Z﹔零标志

说明

将所指定的寄存器取补数﹐再放入A寄存器中。

从port6输入一个值﹐将其取补数之后在由port6输出。

MOVA,0x6

MOV0x10,A

COMA0x10

MOV0x6,A

COM

ComplementR

语法

COMR

编码

0

0100

11rr

rrrrr

操作內容

.-->R

受影响的标志

Z﹔零标志

说明

将R暂存取补数﹐再存入R寄存器中。

举例说明

将0x10寄存器的內含值﹐取补数。

MOVA,@0x11

MOV0x10,A;R10=0x11

COM0x10;R10=0xEE

 

DAA

DecimalAdjust

语法

DAA

编码

0

0000

0001

0001

操作內容

if[A<3:

:

0>>9].OR.[DC=1]

thenA<3:

:

0>+6->A<3:

:

0>;

if[A<7:

:

4>>9].OR.[C=1]

thenA<7:

:

4>+6->A<7:

:

4>;

受影响的标志

C进位标志

说明

DAA用来调整在累加器中的8位的2进位数值﹐使累加器中的数值变成10进位的表示法﹐分別用两个4位來表示十位及个位。

举例说明

做一个十进位加法运算6+9

MOVA,@0x6

MOV0x10,A

MOVA,@0x9

ADDA,0x10;A=0xf

DAA;A=15H(packedBCD)

DECA

DecrementR,PlaceinA

语法

DECAR

编码

0

0001

10rr

rrrrr

操作內容

R-1-->A

受影响的标志

Z零标志

说明

递减R寄存器的值﹐并且将结果存入A寄存器中。

举例说明

说明如何作一个计数16次的循环

STATUS==3﹔状态寄存器

Z_FLAG==2﹔零标志在状态暂存中是BIT2

MOVA,@0x10

MOV0x10,A

LOOP:

DECA0x10

MOV0x10,A

JBSSTATUS,Z_FLAG

JMPLOOP

DEC

DecrementR

语法

DECR

编码

0

0001

11rr

rrrrr

操作內容

R-1-->R

受影响的标志

Z﹔零标志

说明

将所指定的R寄存器內含值减1。

举例说明

说明如何作一个计数16次的循环

STATUS==3;状态寄存器

Z_FLAG==2﹔零标志在状态暂存中是BIT2

MOVA,@0x10

MOV0x10,A

LOOP:

DEC0x10

JBSSTATUS,Z_FLAG

JMPLOOP

DJZA

DecrementR,PlaceintheAregister,Skipif0

语法

DJZAR

编码

0

0101

10rr

rrrrr

操作內容

R-1-->A,skipif0

受影响的标志

说明

将所指定R寄存器的內含值减1﹐并将结果存於A寄存器上﹔如果结果为0﹐则下一个指令将被跳过。

举例说明

HERE:

DJZA0x9

CONT:

MOVA,0x10

SKIP:

ADDA,@10

在执行DJZA指令之前

PC=addressHERE

在执行DJZA指令之后

A=R9-1

ifA=0,PC=addressSKIP

ifA0,PC=addressCONT

DJZ

DecrementR,Skipif0

语法

DJZR

编码

0

0101

11rr

rrrrr

操作內容

R-1-->R,skipif0

受影响的标志

说明

将所指定R寄存器的內含值减1﹐并将结果存回R寄存器上﹔如果结果为0﹐则下一个指令将被跳过。

举例说明

MOVA,@100

MOV0x10,A

LOOP:

DJZ0x10;寄存器R10递减﹐若结果不等于

;0,执行JMP指令﹐若結果等于0﹐;JMP指令不执行JMPLOOP

INCA

IncrementR,PlaceintheAregister

语法

INCAR

编码

0

0101

00rr

rrrrr

操作內容

R+1-->A

受影响的标志

Z﹔零标志

说明

将被指定R寄存器的內含值加1,并将结果储于A寄存器中。

举例说明

MOVA,@0x11

MOV0x10,A;R10=0x11

INCA0x10;A=0x12

INC

IncrementR

语法

INCR

编码

0

0101

01rr

rrrrr

操作內容

R+1-->R

受影响的标志

Z﹔零标志

说明

将被指定R寄存器的內含值加1﹐並且将结果再存回R寄存器中。

举例说明

MOVA,@0x11

MOV0x10,A;R10=0x11

INC0x10;R10=0x12

 

INT

SoftwareInterrupt

语法

INT

编码

1

1110

0000

0001

操作內容

PC+1-->[TopofStack]

0001H-->PC

受影响的标志

说明

软件中断指令﹐首先将下一个位址存入堆栈中﹐然后将0x01载入程序寄存器中。

举例说明

ORG0x001

JMPSET_INT

SET_INT﹕

RET

MAIN﹕

HERE﹕

INT

CONT﹕

CLRA

执行INT指令之前

PC=addressHERE

执行INT指令之后

PC=0001H

[TopofStack]=addressCONT

 

IOR

MoveIOCRtotheAregister

语法

IORR

编码

0

0000

0001

rrrr

操作內容

IOCR-->A

受影响的标志

说明

将控制寄存器IOCR中的值移到寄存器A中。

举例说明

IOR0xf;取得IOCF中的內容﹐并载入A中

MOV0x10,A;储存在寄存器0x10中

IOW

MovetheAregistertoIOCR

语法

IOWR

编码

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

当前位置:首页 > 农林牧渔 > 林学

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

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