标签:
寄存器指令集操作数访问模式条件转移 |
分类: 学习共享 |
SAM88RCRI 指令集
概述
SAM88RCRI 指令集支持寄存器卷操作,它可完成8 位算术操作和逻辑操作,共有41 条指令集。由于采用了存贮器影射方式,所以没有具体的I/O 口操作指令。指令支持位操作,循环、移位等数据操作。
为访问个别寄存器,应指定寄存器卷中0--255 的8 位地址或工作寄存器中的4 位地址。工作寄存器中,寄存器对可以访问13 位程序存贮空间和数据存贮空间。SAM88CRI 支持6 种地址访问方法,方便了编程操作。
指令简介
数据传送类指令
CLR | dst | 清0 |
LD | dst,src | 传输数据 |
LDC | dst,src | 传送数据(访问程序存贮空间) |
LDE | dst,src | 传送数据(访问数据存贮空间) |
LDCD | dst,src | 传送数据后地址减1(访问程序存贮空间) |
LDED | dst,src | 传送数据后地址减1(访问数据存贮空间) |
LDCI | dst,src | 传送数据后地址加1(访问程序存贮空间) |
LDEI | dst,src | 传送数据后地址加1(访问数据存贮空间) |
POP | dst,src | 弹栈 |
PUSH | dst,src | 压栈 |
算术操作
ADC dst,src 带进位加法
ADD dst,src 不带进位加法
CP dst,src 比较指令
DEC dst 减1 指令
INC dst 加1 指令
SBC dst,src 带进位减法
SUB dst,src 不带进位减法
逻辑操作
AND dst,src 逻辑与
COM dst 取反
OR dst,src 逻辑或
XOR dsr,src 逻辑异或
程序控制类指令 | ||
---|---|---|
CALL | dst | 调子程序 |
IRET | 中断返回 | |
JP | cc,dst | 有条件跳转 |
JP | dst | 无条件跳转 |
JR | cc,dst | 有条件相对跳转 |
RET | 子程序返回 | |
位操作指令 | ||
TCM | dst,src | 取反而后测试 |
TM | dst,src | 测试指令 |
循环移位指令 | ||
RL | dst | 循环左移 |
RLC | dst | 带进位循环左移 |
RR | dst | 循环右移 |
RRC | dst | 带进位循环右移 |
SRA | dst | 算术左移 |
CPU 控制类指令 | ||
CCF | C 取反 | |
DI | 禁止中断 | |
EI | 允许中断 | |
IDLE | 空闲指令 | |
NOP | 空操作 | |
RCF | C 清0 | |
SCF | C 置1 | |
STOP | 冻结指令 |
标志寄存器(FLAGS)
8 位标志寄存器描述当前CPU 的操作状态。其中的4 位(FLAGS.4-FLAGS.7 )可以测试并用于条件转移指令。FLAGS 寄存器是可以读写操作的,数据传送类指令并不影响标志寄存器,逻辑算术操作如AND、OR、XOR、ADD 、SUB 则影响标志寄存器。例如,与操作将会影响Z、S、O 标志寄存器,标志寄存器的状态有操作结果决定。如果与指令的目的操作数是标志寄存器,则将会两次对标志寄存器进行写操作,其结果将是不确定的,最好不要把标志寄存器作为目的操作数。
标志寄存器描述
溢出标志(FLAGS.4 V)
当操作结果大于+127 小于-128 时,溢出标志将会置1。逻辑操作之后,他将会被清0。符号标志位(FLAGS.5 S)
算术、逻辑、循环、移位操作之后,符号位标志操作结果最高位的状态。逻辑0 表示操作结果是正数,逻辑1 表示操作结果是负数。零标志位(FLAGS.6 Z)
如果算术、逻辑操作的结果为0,则此标志位为1。位操作指令、移位指令、循环移位指令都会影响此标志位。进(借)位标志位(FLAGS.7 C)
如果算术操作后,最高位产生进位或借位,则此标志位为1。移位、循环移位操作之后,此位保存的值为最后溢出的值。指令可以对此位置1、清0、取反操作。表6-2 标志位符号
标志位 | 特性描述 |
C | 进(借)位标志位 |
Z | 零标志位 |
S | 符号标志位 |
V | 溢出标志 |
0 | 清为逻辑0 |
1 | 置为逻辑1 |
* | 根据相应操作置1 或清0 |
- | 不受影响 |
× | 不确定 |
表6-3 指令系统标号
标号 | 特性描述 |
dst | 目的操作数 |
src | 源操作数 |
@ | 间接寄存器寻址前缀 |
PC | 程序计数器 |
FLAGS | 状态寄存器 |
# | 立即数或寄存器访问的前缀 |
H | 16 进制数后缀 |
D | 10 进制数后缀 |
B | 二进制数后缀 |
opc | 操作代码 |
符号 | 描述 | 实际操作范围 |
cc | 条件转移代码 | 参考表6-6 |
r | 工作寄存器 | Rn(n=0-15) |
rr | 工作寄存器对 | RRp(p=0,2,4,…..,14) |
R | 寄存器或工作寄存器 | reg 或Rn(reg=0-255,n=0-15) |
RR | 寄存器对或工作寄存器对 | Reg 或RRp(reg=0-254,p=0,2,4,….,14) |
Ir | 间接地址访问工作寄存器 | @Rn(n=0-15) |
IR | 间接地址访问寄存器或工作寄存器 | @Rn 或@reg(reg=0-254,p=0,2,4,….,14) |
Irr | 间接地址访问工作 | @RRp(p=0,2,4,…,14) |
IRR | 间接寄存器对或工作寄存器对访问 | @RRp 或@reg(reg=0-254,p=0,2,4,…,14) |
X | 偏址访问模式 | #reg[Rn](reg=0-255,n=0-15) |
XS | 短偏址访问模式 | #addr[RRp](addr=-128—127,p=0,2,4,…,14) |
XL | 长偏址访问模式 | #addr[RRp](addr=0-8191, p=0,2,4,…,14) |
DA | 直接地址访问模式 | addr(addr=0-8191) |
RA | 相对地址访问模式 | addr(addr=-128--127 |
IM | 立即数访问模式 | #data(data=0-255) |
条件转移代码
条件转移指令经常包含4 位条件转移操作判断。这些条件转移操作判断决定程序的调转方向。条件代码操作判断表如下。
C,Z,S,V 等标志位用作条件转移判断位。指令将会根据这些标志位决定调转方向。
二进制 | 符号 | 描述 | 符号位状态 |
0000 | F | 逻辑假 | - |
1000 | T | 逻辑真 | - |
0111(1) | C | 有进位或借位 | C=1 |
1111(1) | NC | 无进位或借位 | C=0 |
0110(1) | Z | 结果为0 | Z=1 |
1110(1) | NZ | 结果不为0 | Z=0 |
1101 | PL | 正数 | S=0 |
0101 | MI | 负数 | S=1 |
0100 | OV | 溢出 | V=1 |
1100 | NOV | 没有溢出 | V=0 |
0110(1) | EQ | 相等 | Z=1 |
1110(1) | NE | 不等 | Z=0 |
1001 | GE | 大于等于 | (S⊕V)=0 |
0001 | LT | 小于 | (S⊕V)=1 |
1010 | GT | 大于 | Z|(S⊕V)=0 |
0010 | LE | 小于等于 | Z|(S⊕V)=1 |
1111(1) | UGE | 无符号数大于等于 | C=0 |
0111(1) | ULT | 无符号数小于 | C=1 |
1011 | UGT | 无符号数大于 | (C=0&Z=0)=1 |
0011 | ULE | 无符号数小于等于 | (C|Z)=1 |
注释: | |
---|---|
1 | 条件代码虽然标志2 个不同的标号,但测试相同的位。例如,Z,EQ 都为真,如果 |
Z 符号位被置起,但是ADD 指令操作之后,Z 可能被用到;CP 指令操作之后,EQ | |
可能被用到。 | |
2 | 如果操作涉及到无符号数,则必须用UGE,UDT,ULT,ULE 等条件代码。 |
指令集介绍这一章详细地介绍了指令操作同时列出了具体的编程实例。在介绍指令时,我们用了统
一的形式,以便参阅、查找。在介绍每条指令时,我们采用了如下的描述方法:---指令名称(符号)---指令全称---源操作数/目的操作数的格式---具体指令的解释---具体描述了每条指令的操作---每条指令对标志寄存器的影响---详细的介绍了指令格式、执行周期和访问模式---给出了每条指令的编程实例
ADC Add With Carry
ADC dst,src
操作: dst←dst + src + C 目的操作数加上源操作数和C 位,所得结果放入目的操作数地址。源操作数不受影响。在多字节加法中,需要把进位加到下一次运算中,则多用带进位加法指令。
标志位: C:如果加法运算中,产生进位,则此位置1;反之,清0。
- Z: 如果运算结果为0,该位置1;反之,置0。
- S:如果运算结果为负,则此位置1;反之,清0。
- V:如果运算中产生溢出,则此位置1;反之,清0。
格 | 式: | 字节数 | 机器周期 | 指令代码 | 地址访问模式 | |||
---|---|---|---|---|---|---|---|---|
(16 进制) | dst | src | ||||||
opc | dst|src | 2 | 4 6 | 12 13 | r r | r Ir |
3 6 14 RR 6 15 RIR
3 6 16 RIM
编程实例: 假如R1=10H,R2=03H,C=1,寄存器01H=20H,02H=03H,03H=0AH 。ADC R1,R2 ;R1=14H,R2=03H ADC R1,@R2 ;R1=1BH,R2=03H ADC 01H,02H ;寄存器01H=24H ,寄存器02H=03H ADC 01H,@02H ;寄存器01H=2BH ,寄存器02H=03H ADC 01H,#11H ;寄存器01H=32H
在第一个例子中,目的寄存器R1 的值为10H,C=1 ,原操作数的值为03H 。带进位加法所进行的操作是,(R1)+C+(R2)=14H,加法操作之后,源操作数不变,即(R2)不变。(R1)=14H 。
ADD ADD
ADD dst,src
操作: dst←dst + src 源操作数加上目的操作数所得的总和放在目的操作数所在的存贮空间。源操作数不变。
标志位: C:如果加法运算中,产生进位,则此位置1;反之,清0。
- Z:如果运算结果为0,该位置1;反之,置0。
- S:如果运算结果为负,则此位置1;反之,清0。
- V:如果运算中产生溢出,则此位置1;反之,清0。
格 | 式: | 字节数 | 机器周期 | 指令代码 | 地址访问模式 | |||
---|---|---|---|---|---|---|---|---|
(16 进制) | dst | src | ||||||
opc | dst|src | 2 | 4 6 | 02 03 | r r | r Ir |
3 6 04 RR 6 05 RIR
3 6 06 RIM
编程实例: 假如R1=12H,R2=03H ,寄存器01H=21H,02H=03H,03H=0AH 。ADD R1,R2 ;R1=15H,R2=03H ADD R1,@R2 ;R1=1CH,R2=03H ADD 01H,02H ;寄存器01H=24H ,寄存器02H=03H ADD 01H,@02H ;寄存器01H=2BH ,寄存器02H=03H ADD 01H,#25H ;寄存器01H=46H
在第一个例子中,目的寄存器R1 的值为12H,原操作数的值为03H。不带进位加法所进行的操作是,(R1)+ (R2)=15H, 加法操作之后,源操作数不变,即(R2)不变。(R1)=15H。
AND 逻辑与(Logic AND)
AND dst←dst & src
操作: 目的操作数与源操作数进行”与”操作,结果放在目的操作数存贮空间。源操作数不受影响。在进行与操作时,源操作数和目的操作数相应位都为1 时,结果为1。反之,为0。
标志位: C:不受影响。
- Z:如果运算结果为0,该位置1;反之,置0。
- S:如果结果的第7 位为1,则该位为1;反之,为0。
- V:该操作之后,此位为0。
格 | 式: | 字节数 | 机器周期 | 指令代码 | 地址访问模式 | |||
---|---|---|---|---|---|---|---|---|
(16 进制) | dst | src | ||||||
opc | dst|src | 2 | 46 | 52 53 | r r | r Ir |
3 6 54 RR 6 55 RIR
3 6 56 RIM
编程实例: 假如R1=12H,R2=03H ,寄存器01H=21H,02H=03H,03H=0AH 。AND R1,R2 ;R1=02H,R2=03H AND R1,@R2 ;R1=02H,R2=03H AND 01H,02H ;寄存器01H=01H ,寄存器02H=03H AND 01H,@02H ;寄存器01H=00H ,寄存器02H=03H AND 01H,#25H ;寄存器01H=21H
在第一个例子中,目的寄存器R1 的值为12H,原操作数的值为03H。与操作所进行的操作是,(R1)&(R2)=02H, 加法操作之后,源操作数不变,即(R2)不变。(R1)=02H 。
CALL | 调子程序 | ||||||
---|---|---|---|---|---|---|---|
CALL | dst | ||||||
操 | 作: | SP←SP – 1 @SP←PCL SP ←SP – 1 @SP ←PCH PC←dst 当前PC 计数器的值被压入堆栈。PC 值是CALL 指令下的指令地址,即CALL 指令下面的指令地址被压入堆栈。之后,子程序第一条指令地址弹到PC 计数器中,CPU 开始执行子程序。RET 指令把堆栈中存放的值,弹出到PC 中。程序继续向下执行。 | |||||
标志位: | 标志寄存器不受影响。 | ||||||
格 | 式: | 字节数3 | 机器周期 14 | 指令代码(16 进制)F6 | 地址访问模式dst DA |
2 12 F4 IRR
编程实例: 假如R0=15H,R1=21H,PC=1A47H,SP=0B2H。
CALL 1521H ;SP=0B0H
CALL @RR0 ;SP=0B0H
在第一个例子中,PC 当前值为1A47H,SP 当前值为0B2H 。执行CALL 指令后,系统把1AH 压入0B0H,把4AH 压入0B1H,因为该指令为3 个字节,所以压入堆栈的是4AH, 而不是47H。SP=0B0H。CPU 执行子程序中的指令。
在第二个例子中,执行情况与第一个例子相同,只不过压入堆栈的是1AH 和49H,因为这条指令占用2 个字节,而不是3 个字节。
CCF C 取反
CCF
操作: C←C 取反对C 取反。如果C 为1,则此操作之后,C 为0;反之,为1。
标志位: C:C 取反其它标志位不受影响。
格式: 字节数机器周期指令代码(16 进制)
1 4EF
opc
编程实例: 假如C=0。
CCF
如果C=0,执行此指令后,C=1,即对C 取反。
CLR 清0
CLR dst
操作: dst ← 0 目的操作数存贮器被清0。
标志位: 该操作不影响标志位。
格式: 字节数机器周期指令代码地址访问模式(16 进制)dst
2 4 B0 R 4 B1 IR
编程实例: 假如寄存器00H=4FH,01H=02H,02H=5EH CLR 00H ;00H=0 CLR @01H ;01H=02H,02H=0
在寄存器访问模式下,把寄存器00H 清0;在寄存器间接访问模式下,则把目的操作数所在的存贮空间的值所对应的地址存贮空间清0。
COM 取反
COM dst
操作: dst ← ~dst
把目的操作数取反,存入目的操作数寄存器。即相应位为1,则操作后改位为0;反之,依然。
标志位: C:不受影响。
- Z:如果运算结果为0,该位置1;反之,置0。
- S:如果结果的第7 位为1,则该位为1;反之,为0。
- V:该操作之后,此位为0。
格式: 字节数机器周期指令代码地址访问模式(16 进制)dst
2 4 60 R 4 61 IR
编程实例: 假如R1=07H ,寄存器07H=0F1H 。COM R1 ;R1=0F8H COM @R1 ;R1=07H,07H=0EH
在第一个例子中,目的操作数寄存器中的值为07H。COM 操作之后,逻辑1 取反变为为逻辑0。结果为07H=0F8H 。在第二个例子中,间接寄存器访问模式下,是把07H 存贮单元的值取反。结果为0EH 。
CP 比较
CP dst,src
操作: dst ← src 源操作数与目的操作数进行比较,比较结果影响相应的标志位。源操作数和目的操作数都不变。
标志位: C:如果有借位时,该位置1;反之,清0。即(src>dst)
- Z:如果结果为0,则置1;反之,清0。
- S:如果结果为负,则置1;反之,清0。
- V:如果运算中产生溢出,则此位置1;反之,清0。
格 | 式: | 字节数 | 机器周期 | 指令代码 | 地址访问模式 | |||
---|---|---|---|---|---|---|---|---|
(16 进制) | dst | src | ||||||
opc | dst|src | 2 | 4 6 | A2A3 | r r | r Ir |
3 6 A4 R R 6 A5 R IR
3 6 A6 R IM
编程实例:1 假如R1=02H,R2=03H CP R1,R2 ;C,S 标志位将会被置1
该指令实际操作是R1 减去R2,由于R1 小于R2,C 被置1,S 也被置1。2 假如R1=05H,R2=0AH CP R1,R2 ;比较R1,R2 的值, JP UGE,SKIP ;R1 大于等于R2 时跳转 INC R1 ;R1 加1
SKIP:LD R3,R1
DEC 减1
DEC dst
操作: dst ← dst – 1 目的操作数减1,放入目的操作数寄存器。
标志位: C:不受影响
- Z:如果结果为0,则置1;反之,清0。
- S:如果结果为负,则置1;反之,清0。
- V:如果算术运算产生溢出,则此位置1。也即是说目的操作数的值为-128(80H), 结果为+127(7FH)。反之,清0。
格式: 字节数机器周期指令代码地址访问模式(16 进制)dst
2 4 00 R 6 01 IR
编程实例: 假如R1=03H ,寄存器03H=10H DEC R1 ;R1=02H DEC @R1 03H=0FH
在第一个例子中,R1 的值减1 之后,值为02H;在第二个例子中,则是把寄存器中的值作为地址,并把此地址单元中的值减1。
DI 禁止中断
DI
操作: SYM(2)← 0 把SYM.2 清0,禁止所有中断。但各相应中断仍置起中断标志位,只是CPU 并不响应中断。标志位:不受影响
格式: 字节数机器周期指令代码(16 进制)
1 4 8F
opc
编程实例: 假如SYM=04H DI 如果SYM 的值为04H,执行此条指令后,SYM 的值为00H,禁止所有中断。
EI 允许中断
EI
操作: SYM(2) ← 1 EI 指令置SYM.2 为1,打开中断。如果这时相应的中断位置1,则CPU 开始响应服务程序。
标志位: 不受影响
格式: 字节数机器周期指令代码(16 进制)
1 4 9F
opc
编程实例: 假如SYM=00H EI 如果SYM=00H ,即禁止所有中断。执行EI 指令,则打开所有中断。
IDLE 空闲模式
IDLE
操作:IDLE 指令将停止CPU 时钟,但允许系统时钟继续工作。当CPU 处于IDLE 模式下时,外部中断或内部中断都可以把CPU 从空闲模式唤醒。这时,要允许(IRQ)。
标志位: 不受影响
格式: 字节数机器周期指令代码(16 进制)
1 4 6F
opc
编程实例: IDLE NOP NOP NOP
执行该指令,将停止CPU 时钟,但系统时钟仍然工作。
INC 加1
INC dst
操作: dst ← dst + 1 目的操作数加1,存在目的操作数存贮器。
标志位: C:不受影响
- Z:如果结果为0,则置1;反之,清0。
- S:如果结果为负,则置1;反之,清0。
- V: 如果算术运算产生溢出,则此位置1。也即是说目的操作数的值为-128(80H), 结果为+127(7FH)。反之,清0。
格 | 式: | 字节数 | 机器周期 | 指令代码 | 地址访问模式 | ||
(16 进制) | dst | ||||||
opc | dst | 1 | 4 | rE r=0 到F | r | ||
opc | dst | 2 | 44 | 20 21 | R IR |
编程实例: 假如R0=1BH ,寄存器00H=0CH ,寄存器1BH=0FH: INC R0 ;R0=1CH INC 00H ;00H=0DH INC @R0 ;R0=1BH ,寄存器1BH=10H
在第一个例子中,采用的是寄存器访问方法,R0 中的值被加1。在第二个例子中,采用的是寄存器访问方法,00H 中的值被加1。在第三个例子中,采用的是寄存器间接访问方法,故1BH 中的值被加1。
IRET 中断返回
IRET IRET
操作: FLAGS← @SP SP ← SP + 1 PC ← @SP SP ← SP + 2 SYM.2 ← 1 该指令用于中断返回。当中断返回时,弹出FLAGS,PC 值,并再次允许中断。
标志位: 所有标志位的值变回没产生中断时的状态。格式: 字节数机器周期指令代码(16 进制)
1 10 BF opc 12
JP 跳转
JP cc,dst (条件代码) JP dst
操作: 如果cc(条件代码)为真,则PC ← dst 当条件转移代码为真时,则把要转移的地址压入PC;反之,则执行JP 后的指令。无条件转移指令则不需判断条件转移指令,直接跳转到目的地址。
标志位: 不受影响
格式: 字节数机器周期指令代码地址访问模式(16 进制)dst
3 8 ccD r cc=0 到F
2 8 30 IRR
注释:
13 字节格式用于有条件跳转,2 字节格式用于无条件跳转。
2 在条件跳转指令的第一字节中,条件代码和操作指令都占4 位。
编程实例: 假如C=1 ,寄存器00H=01H ,寄存器01H=20H JP C,LABLE_W ;LABLE_W=1000H,PC=1000H JP @00H ;PC=0120H
在第一个例子中,假设C=1,则条件满足,把LABLE_W 的地址压入PC;如果条件不满足,则执行条件转移指令下面的一条指令。在第二个例子中,没有条件转移代码,是不需要判断的,直接转移到目的地址。
JR 相对跳转指令JR cc,dst
操作: 如果cc 条件转移代码为真,PC ← PC + dst 如果具体的条件代码为真,执行该指令将会把偏移量加到当前PC 中,执行当前PC 计数器地址的指令。反之,则执行条件转移指令之后的指令代码。
标志位: 不受影响
格式: 字节数机器周期指令代码地址访问模式(16 进制)dst
2 6 ccB r cc=0 到F
注释:在2 字节指令格式的第一个字节中,条件代码和操作代码各占4 位。
编程实例: 假如C=1,LABLE_X=1FF7H JR C,LABLE_X ; PC=1FF7H
如果C=1,条件判断为真,则执行此指令后,程序跳转直LABLE_X 处。反之,则条件转移指令后面的指令代码将会被执行。
LD 数据传送
LD dst,src
操作: dst ← src 源操作数装入目的操作数所在的存贮空间。源操作数不变。
标志位: 不受影响
格式: 字节数机器周期指令代码地址访问模式(16 进制)dst src
2 4 rC r IM 4 r8 rR
2 4 r9 R r r=0 到F 2 4 C7 rIr 4 D7 Ir r
3 6 E4 RR 6 E5 RIR 3 6 E6 RIM 6 D6 IR IM
3 6 F5 IR R
3 6 87 rx[r]
3 6 97 x[r] r
编程实例:假如R0=01H,R1=0AH ,寄存器00H=01H ,寄存器01H=20H, 寄存器02H=02H,LOOP=30H ,寄存器3A=0FFH LD R0,#10H ; R0=10H LD R0,01H ; R0=20H, 寄存器01H=20H LD 01H,R0 ; 寄存器01H=01H,R0=01H LD R1,@R0 ; R1=20H,R0=01H LD @R0,R1 ; R0=01H,R1=0AH, 寄存器01H=0AH LD 00H,01H ; 寄存器00H=20H, 寄存器01H=20H LD 02H,@00H ; 寄存器02H=20H, 寄存器00H=01H LD 00H,#0AH ;寄存器00H=0AH LD @00H,#10H ; 寄存器00H=01H, 寄存器01H=02H, 寄存器02H=02H LD R0,#LOOP[R1] ;R0=0FFH,R1=0AH LD #LOOP[R0],R1 ;寄存器31H=0AH,R0=01H,R1=0AH
LDC/LDE 传送数据
LDC/LDE dst,src
操作: dst ← src
这条指令将从程序存贮空间或数据存贮空传输一个字节至目的存贮器。源操作数不受影响。LDC 用于程序存贮空间,LDE 用于数据存贮空间。编译器将会使Irr,rr 在程序存贮空间偶数,数据存贮空间为奇数。
标志位: 不受影响
格 | 式: | 字节数 | 机器周期 | 指令代码 | 地址访问模式 | |||
---|---|---|---|---|---|---|---|---|
(16 进制) | dst | src | ||||||
1 | opc | dst|src | 2 | 10 | C3 | r | Irr |
2
2 10 D3 Irr r
3
3 12 E7 r XS[rr]
4
3 12 F7 XS[rr] r
5
4 14 A7 r XL[rr]
6
4 14 B7 XL[rr] r
7
4 14 A7 r DA
8
4 14 B7 DA r
9
4 14 A7 rDA
4 14 B7 DA r
注释:1 对于格式5、6 的源操作数或者工作寄存器对不能用0-1 工作寄存器对
2 对于格式3、4 的目的地址XS[rr] 和源操作数地址XS[rr] 都是1 个字节
3 对于格式5、6 的目的地址XL[rr] 和源操作数地址XL[rr] 都是2 个字节
4 对于格式7、8 的DA 和r 的值是程序存贮器的,对于格式9、10 的DA 和r
则用到的是数据存贮器的。
编程实例:假如R0=11H,R1=34H,R2=01H,R3=04H,R4=00H,R5=60H, 程序存贮空间地址0061H=AAH,0103H=4FH,0104H=1AH,0105H=6DH,1104H=88H, 外部数据存贮器0061H=BBH,0103H=5FH,0104H=2AH,0105H=7DH,1104H=98H.
LDC R0,@RR2 LDE R0,@RR2 LDC @RR2,R0 LDE @RR2,R0 LDC R0,#01H[RR4]
LDE R0,#01H[RR4]
LDC #01H[RR4],R0
LDE #01H[RR4],R0 ; R0=1AH,R2=01H,R3=04H,R0=(0104H)=1AH ; R0=2AH,R2=01H,R3=04H ; 程序存贮空间0104H=11H,R0,R2,R3 值不变。 ; 数据存贮空间0104H=11H, R0,R2,R3 值不变。
;R0 的值为程序存贮空间0061H 的值。
;R0=AAH,R4=00H,R5=60H; R0 的值为程序存贮空间0061H 的值。; R0=BBH,R4=00H,R5=60H
; 11H 装入地址为0061H(01H+0060H )的
; 程序存贮空间
; 11H 装入地址为0061H(01H+0060H )的
; 数据存贮空间 LDC R0,#1000H[RR2] ; 程序存贮空间中,地址为1104H(1000H+0104H) ;的存贮单元中的值装入R0 寄存器。 LDE R0,#1000H[RR2] ; 数据存贮空间中,地址为1104H(1000H+0104H)
;的存贮单元的值装入R0 寄存器中。 | ||
LDC | R0,1104H | ;程序存贮空间1104H 中的值装入R0 寄存器。;源存贮空间的值不变。 |
LDE | R0,1104H | ;数据存贮空间1104H 中的值装入R0 寄存器。;源存贮空间的值不变。 |
LDC | 1105H,R0 | ;R0 寄存器中的值11H 装入地址为1105H 的程序;存贮空间,R0 寄存器中的值不变。 |
LDE | 1105H,R0 | ;R0 寄存器中的值11H 装入地址为1105H 的数据;存贮空间,R0 寄存器中的值不变。 |
注释:这些指令不支持掩模ROM。 LDC 指令可用于程序查表。
LDCD/LDED | 传送数据之后地址自动减1 | |||||||
---|---|---|---|---|---|---|---|---|
LDCD/LDED | dst,src | |||||||
操 | 作: | dst ← src rr ← rr – 1 这条指令多用于对程序存贮区或数据存贮区堆栈进行数据操作或数据块操作。操作地址有指定的工作寄存器对提供。源操作数转入目的操作数存贮空间。操作之后,地址自动减1。源操作数不受影响。 | ||||||
LDCD 寻址程序存贮空间,LDED 寻址数据存贮空间。汇编器在汇编时,把访问程序存贮空间的”Irr ”汇编为偶数,把访问数据存贮空间的“Irr ”汇编为奇数。 | ||||||||
标志位: | 不受影响 | |||||||
格 | 式: | 字节数 2 | 机器周期 10 | 指令代码(16 进制)E2 | 地址访问模式dst srcr Irr | |||
编程实例: | 假如 R6=10H,R7=33H,R8=12H; 程序存贮空间1033H=0CDH, 外部数据存贮空间1033H=0DDH | |||||||
LDCD | R8,@RR6 ; 程序存贮空间1033H 单元中的值0CDH 装入;寄存器R8。;R8=0CDH,R6=10H,R7=32H(RR6←RR6-1) | |||||||
LDED | R8,@RR6 ; 数据存贮空间1033H 单元中的值0DDH 装入;寄存器R8。; R8=0DDH,R6=10H,R7=32H(RR6←RR6-1) |
LDCI/LDEI 传送数据之后自动加1
LDCI/LDEI dst ← src rr ← rr + 1 这条指令多用于对程序存贮区或数据存贮区堆栈进行数据操作或数
据块操作。操作地址有指定的工作寄存器对提供。源操作数转入目的操作数存贮空间。操作之后,地址自动加1。源操作数不受影响。 LDCD 寻址程序存贮空间,LDED 寻址数据存贮空间。汇编器在汇编时,把访问程序存贮空间的”Irr ”汇编为偶数,把访问数据存贮空间的“Irr ”汇编为奇数。
标志位: 不受影响
格式: 字节数机器周期指令代码地址访问模式(16 进制)dst src
2 10 E3 r Irr
编程实例: 假如 R6=10H,R7=33H,R8=12H; 程序存贮空间1033H=0CDH, 外部数据存贮空间1033H=0DDH LDCI R8,@RR6 ; 程序存贮空间1033H 单元中的值0CDH 装入
;寄存器R8。;R8=0CDH,R6=10H,R7=34H(RR6←RR6+1)
LDEI R8,@RR6 ; 数据存贮空间1033H 单元中的值0DDH 装入;寄存器R8。; R8=0DDH,R6=10H,R7=34H(RR6←RR6+1)
NOP 空操作(No Operqtion)
NOP
操作: CPU 执行此指令时,不作任何操作。一个或多个NOP 可以起到延时作用。
标志位: 不受影响
格式: 字节数机器周期指令代码(16 进制)
14 FF
opc
编程实例: NOP 此指令不作任何操作,只是延时一个执行周期。
OR 逻辑或(Logical OR)
OR dst,src
操作: dst ← dst OR src 源操作数与目的操作数进行逻辑或运算,运算结果存放在目的操作数地址空间。源操作数不受影响。
标志位: C:不受影响
- Z:如果结果为0,则置1;反之,清0。
- S:如果结果第7 位为1,则置1;反之,清0。
- V:该操作之后,此位为0。
格 | 式: | 字节数 | 机器周期 | 指令代码 | 地址访问模式 | |||
---|---|---|---|---|---|---|---|---|
(16 进制) | dst | src | ||||||
opc | dst|src | 2 | 4 6 | 42 43 | r r | r Ir |
3 6 44 RR 6 45 RIR 3 6 46 RIM
编程实例: 假如 R0=15H,R1=2AH,R2=01H, 寄存器00H=08H, 寄存器01H=37H, 寄存器08H=8AH
OR R0,R1 ;R0=3FH,R1=2AH OR R0,@R2 ;R0=37H,R2=01H, 寄存器01H=37H OR 00H,01H ;寄存器00H=3FH, 寄存器01H=37H OR 01H,@00H ;寄存器00H=08H, 寄存器01H=0BFH OR 00H,#02H ;寄存器00H=0AH
在第一个例子中,R0=15H,R1=2AH ,则进行或操作的结果是3FH,结果装入R0。其余的例子,则是介绍了不同地址访问模式下的或操作。
POP 弹栈(Pop From Stack)
POP dst
操作: dst ← @sp sp ← sp + 1 堆栈指针所指的地址单元中的内容装入目的地址。堆栈指针加1。
标志位: 不受影响
格式: 字节数机器周期指令代码地址访问模式(16 进制) dst
28 50 R 8 51 IR
编程实例: 假如:寄存器00H=01H ,寄存器01H=1BH,SP(0D9H)=0BBH,堆栈区寄存器0BBH=55H POP 00H ;寄存器00H=55H,SP=0BCH POP @00H ;寄存器00H=01H ,寄存器01H=55H,SP=0BCH
在第一个例子中,寄存器00H=01H ,执行指令“POP 00H”之后,寄存器00H=55H, 同时,堆栈指针加1。SP=0BCH。
PUSH 压栈(Push To Stack)
PUSH src
操作: SP ← SP – 1 @SP ← src 进行压栈操作时,堆栈指针先减1,而后,把源操作数压入堆栈。该操作会改变堆栈指针的值。
标志位: 不受影响
格式: 字节数机器周期指令代码地址访问模式(16 进制) dst
2 8 70 R 8 71 IR
编程实例: 假如:寄存器40H=4FH ,寄存器4FH=0AAH,SP=0C0H PUSH 40H ;寄存器40H=4FH,0BFH=4FH PUSH @40H ;寄存器40H=4FH,4FH=0AAH,0BFH=0AAH,SP=0BFH
在第一个例子中,寄存器40H=4FH ,执行指令之后,堆栈指针减1,把40H 中的值压入堆栈,故0BFH=4FH,SP=0BFH 。
RCF C 清0(Reset Carry Flag)
RCF
操作: C ← 0 该指令将C 清0
标志位: C:清0 其余不受影响
格式: 字节数机器周期指令代码(16 进制)
14 CF
opc
编程实例: 假如:C=‘1’或‘0’ RCF 该指令把C 清为逻辑0。
RET 子程序返回(Return)
RET
操作: PC ← @SP SP ← SP + 2 RET 指令经常用于子程序返回。执行此指令,将把压入堆栈中的PC值弹到PC 中。CPU 执行新的指令。
标志位: 不受影响
格式: 字节数机器周期指令代码(16 进制)
1 8 AF
opc
10
编程实例: 假如:SP=0BCH,(SP)=101AH,PC=1234 RET ;PC=101AH,SP=0BEH RET 指令把0BCH 单元中的值弹到PC 高字节,把0BDH 单元中的值弹到PC 低字节。开始执行101AH 单元的指令。堆栈指针SP==0BEH 。C
RL | 左移(Rotate Left) | |
---|---|---|
RL | dst | |
操 | 作: | C ← dst(7) dst(0) ← dst(7) dst(n+1)← dst(n),n=0-6 目的操作数左移一个位置。原第7 位数移到最低位,同时,也移到C。 |
7 0
标志位: C:如果第7 位为1,在执行此指令之后,此位置1。
- Z:如果结果为0,则置1;反之,清0。
- S:如果操作结果的第7 位为1,则置1;反之,清0。
- V:如果有符号数在操作中改变,即产生算术溢出,则置1;反之,清0。
格式: 字节数机器周期指令代码地址访问模式(16 进制) dst
2 4 90 R 4 91 IR
编程实例: 假如:寄存器00H=0AAH ,寄存器01H=02H ,寄存器02H=17H RL 00H ;寄存器00H=55H,C=‘1’ RL @01H ;寄存器01H=02H ,寄存器02H=2EH,C=‘0’
在第一个例子中,寄存器00H=0AAH(10101010B),执行左移指令之后,00H 中的值为55H(01010101B)。同时,置C 和V。
RLC 带进位左移(Rotate Left Carry)
RLC dst
操作: dst(0) ← C C ← dst(c) dst(n+1) ← dst(n),n=0-6 目的操作数和C 一起左移一位。原操作数的第7 位,移入进(借)位。进(借)位移入第1 位
7 0
C
标志位: C:如果第7 位为1,在执行此指令之后,此位置1。
- Z:如果结果为0,则置1;反之,清0。
- S:如果操作结果的第7 位为1,则置1;反之,清0。
- V:如果有符号数在操作中改变,即产生算术溢出,则置1;反之,清0。
格 | 式: | 字节数 | 机器周期 | 指令代码 | 地址访问模式 | ||
(16 进制) | dst | ||||||
opc | dst | 2 | 4 4 | 10 11 | R IR |
编程实例: 假如:寄存器00H=0AAH ,寄存器01H=02H ,寄存器02H=17H,C=‘0’ RLC 00H ;寄存器00H=54H,C=‘1’ RLC @01H ;寄存器01H=02H ,寄存器02H=2EH,C=‘0’
在第一个例子中,寄存器00H=0AAH(10101010B),执行此指令,00H=55H(01010101B) 原操作数的第7 位把C 置1,同时,也置V 为1。
RR 右移(Rotate Right)
RR dst
操作: C ← dst(0) dst(7)← dst(0) dst(n) ← dst(n + 1),n=0-6 目的操作数向右移一位。操作数的最低位移到最高位(7),同时,也移到进(借)位。
7 0
C
标志位:C:如果第0 位为1,在执行此指令之后,此位置1。
- Z:如果结果为0,则置1;反之,清0。
- S:如果操作结果的第7 位为1,则置1;反之,清0。
- V:如果有符号数在操作中改变,即产生算术溢出,则置1;反之,清0。
格 | 式: | 字节数 | 机器周期 | 指令代码 | 地址访问模式 | ||
(16 进制) | dst | ||||||
opc | dst | 2 | 4 4 | E0 E1 | R IR |
编程实例: 假如:寄存器00H=31H ,寄存器01H=02H ,寄存器02H=17H RR 00H ;寄存器00H=98H,C=‘1’ RR @01H ;寄存器01H=02H ,寄存器02H=8BH,C=‘1’
在第一个例子中,寄存器00H=31H ,右移将00H 单元中各位右移一位。原操作数的第0 位移到第7 位。右移之后,寄存器00H=98H 。在右移的过程中,第0 位也移到了进(借)位中。溢出位(V)也置1。
RRC | 带进位右移(Rotate Right Through Carry) | |
---|---|---|
RRC | dst | |
操 | 作: | dst(7) ← C C ← dst(0) dst(n) ← dst(n + 1),n=0-6 目的操作数和进(借)位一起循环右移。原操作数的第0 位移入进(借)位,进(借)位则移到第7 位。 |
7 0
C
标志位:C:如果第0 位为1,在执行此指令之后,此位置1。
- Z:如果结果为0,则置1;反之,清0。
- S:如果操作结果的第7 位为1,则置1;反之,清0。
- V:如果有符号数在操作中改变,即产生算术溢出,则置1;反之,清0。
格 | 式: | 字节数 | 机器周期 | 指令代码 | 地址访问模式 | ||
(16 进制) | dst | ||||||
opc | dst | 2 | 4 4 | C0 C1 | R IR |
编程实例: 假如:寄存器00H=55H ,寄存器01H=02H ,寄存器02H=17H,C=‘0’
RRC 00H ;寄存器00H=2AH,C=’1’ RRC @00H ;寄存器01H=02H ,寄存器02H=0BH,C=’1’ 在第一个例子中,寄存器00H=55H ,带进位右移把00H 单元的值和C 一起循环右移。原操作数的第0 位移到C,C 移到第7 位。操作之后,寄存器00H=2AH 。标志位S=0,V=0 。
SBC 带进位减法(Subtract With Carry)
SBC dst,src
操作: dst ← dst –src – C 目的操作数减去原操作数再减去当前C,所得结果存放在目的操作数存贮器。源操作数不受影响。减法操作实际进行的是补码的加法。在多字节减法中,为了进行精确的减法操作,需用到带进位减法指令。
标志位: C:如果产生借位,此位置1;反之,清0。
- Z:如果结果为0,则置1;反之,清0。
- S:如果操作结果为负,则置1;反之,清0。
- V:如果两个操作数的符号相反,但操作结果的符号与源操作数的符号相同,则产生算术溢出,置此位为1;反之,清0。
格 | 式: | 字节数 | 机器周期 | 指令代码 | 地址访问模式 | |||
---|---|---|---|---|---|---|---|---|
(16 进制) | dst | src | ||||||
opc | dst|src | 2 | 4 6 | 32 33 | r r | rIr |
3 6 34 R R 6 35 RIR 3 6 36 RM
编程实例: 假如:R1=10H,R2=03H,C=‘1’,寄存器01H=20H, 寄存器02H=03H, 寄存器03H=0AH
SBC R1,R2 ;R1=0CH,R2=03H SBC R1,@R2 ;R1=05H,R2=03H, 寄存器03H=0AH SBC 01H,02H ;寄存器01H=1CH, 寄存器02H=03H SBC 01H,@02H ;寄存器01H=15H, 寄存器02H=03H, 寄存器03H=0AH SBC 01H,#8AH ;寄存器01H=95H,C,S,V=1
在第一个例子中,R1=10H,R2=03H,执行带进位减法,则(R1)-(R2)-C=0CH, R1=0CH ,原操作数不受影响。
SCF C 置1(Set Carry Flag)
SCF
操作: C ← 1 进(借)位被置为逻辑1。
标志位: C:置为逻辑1。其它标志位不受影响
格式: 字节数机器周期指令代码(16 进制)
1 4 DF opc
编程实例: SCF 置C 为1
STOP 冻结状态
STOP
操作: STOP 指令冻结CPU 时钟和系统时钟,使微控制器进入冻结模式。在冻结模式,片内寄存器,控制寄存器,I/O 口数据寄存器的值不会丢失。复位操作或外部中断可使CPU 退出冻结状态。对于外部复位操作,必须要有足够时间的低电平,以保证使晶振稳定。
标志位: 不受影响
格式: 字节数机器周期指令代码地址访问模式(16 进制)dst src
1 4 7F ---opc
编程实例: LD STOPCON,#0A5H STOP NOP NOP NOP
进入冻结状态,CPU 停止一切操作。当STOPCON 寄存器的值不是0A5H 时,STOP 指令将会使PC=0100H 。
SRA 算术右移(Shift Right Arithmetic)
SRA dst
操作: dst(7) ← dst(7) C ← dst(0) dst(n) ← dst(n + 1),n=0-6 算术右移指令中,操作数第0 位移到进(借)位,第7 位(符号位)不变,同时,第7 位的值再移到第6 位。
76 0
C
标志位: C:如果第0 位为1,在执行此指令之后,此位置1。
- Z:如果结果为0,则置1;反之,清0。
- S:如果结果为负,则置1;反之,清0。
V:清为0。 | |||||||
---|---|---|---|---|---|---|---|
格 | 式: | 字节数 | 机器周期 | 指令代码 | 地址访问模式 | ||
(16 进制) | dst | ||||||
opc | dst | 2 | 4 4 | D0 D1 | R IR |
编程实例: 假如:寄存器00H=9AH ,寄存器02H=03H ,寄存器03H=0BCH,C=‘1’ SRA 00H ;寄存器00H=0CDH,C=‘0’ SRA @02H ;寄存器02H=03H ,寄存器03H=0DEH,C=‘0’
在第一个例子中,寄存器00H=9AH ,算术右移指令把第0 位移到C,第7 位移到第6 位,第7 位保持不变。操作之后,寄存器的值00H=0CDH 。
SUB 减法(Subtract)
SUB dst,src
操作: dst ← dst – src 目的操作数减去源操作数,结果存放在目的操作数寄存器。源操作数不变。减法操作实际上进行的操作是,被减数加上减数的补码。
标志位: C:如果产生借位,则此位置1;反之,清0。
- Z:如果结果为0,则置1;反之,清0。
- S:如果结果为负,则置1;反之,清0。
- V:如果两个操作数的符号相反,但操作结果的符号与源操作数的符号相同,则产生算术溢出,置此位为1;反之,清0。
格式: 字节数机器周期指令代码地址访问模式(16 进制)dst src
2 4 22 r r 6 23 rIr 3 6 24 R R 6 25 RIR
3 6 26 RIM
编程实例: 假如:R1=12H,R2=03H,寄存器01H=21H,寄存器02H=03H,寄存器03H=0AH SUB R1,R2 ;R1=0FH,R2=03H SUB R1,@R2 ;R1=08H,R2=03H SUB 01H,02H ; 01H=1EH,02H=03H SUB 01H,@02H ; 寄存器01H=17H, 寄存器02H=03H SUB 01H,#90H ; 寄存器01H=91H,C,S,V=’1’ SUB 01H,#65H ; 寄存器01H=0BCH,C,S=’1’,V=’0’
在第一个例子中,R1=12H,R2=03H ,减法操作(R1)-(R2)=0FH 。操作之后,R1=0FH 。
TCM 取反测试(Test Complement Under Mask)
TCM dst,src
操作: (~dst) & src 这条指令测试目的操作数指定位是否为逻辑1。可以把源操作数的相应位设置为1,以便进行测试。TCM 指令先把目的操作数取反,而后再与源操作数进行与运算。可以通过标志位检测操作结果。目的操作数和源操作数都不受影响。
标志位: C:不受影响
- Z:如果结果为0,则置1;反之,清0。
- S:如果结果第7 位为1,则置1;反之,清0。
- V:清为0。
格式: 字节数机器周期指令代码地址访问模式(16 进制)dst src
2 4 72 rr 6 73 r Ir 3 6 74 RR 6 75 RIR
3 6 76 RIM
编程实例:假如:R0=0C7H,R1=02H,R2=12H, 寄存器00H=2BH ,寄存器01H=02H ,寄存器02H=23H TCM R0,R1 ;R0=0C7H,R1=02H,Z=’1’ TCM R0,@R1 ;R0=0C7H,R1=02H,02H=23H,Z=’0’ TCM 00H,01H ;寄存器00H=2BH, 寄存器01H=02H,Z=’1’ TCM 00H,@01H ;寄存器00H=2BH, 寄存器01H=02H TCM 00H,#34H ;寄存器00H=2BH,Z=’0’
在第一个例子中,R0=0C7H,R1=02H,”TCM R0,R1” 测试目的操作数的第1 位是否为1,该操作把目的操作数取反,而后与源操作数进行与运算。操作结果,Z=1。
TM 测试(Test Under Mask)
TM dst,src
操作: dst & src 该指令测试目的操作数指定位是否为0。可把原操作数的相应位置1,以便测试。TM 指令把源操作数和目的操作数进行与运算。可以通过检测标志位(Z) 检测操作结果。源操作数和目的操作数不受影响。
标志位: C:不受影响
- Z:如果结果为0,则置1;反之,清0。
- S:如果结果第7 位为1,则置1;反之,清0。
- V:清0。
格 | 式: | 字节数 | 机器周期 | 指令代码 | 地址访问模式 | |||
---|---|---|---|---|---|---|---|---|
(16 进制) | dst | src | ||||||
opc | dst|src | 2 | 4 6 | 72 73 | r r | r Ir |
3 6 74 RR 6 75 RIR 3 6 76 RIM
编程实例: 假如: R0=0C7H,R1=02H,R2=18H, 寄存器00H=2BH ,寄存器01H=02H ,寄存器02H=23H TM R0,R1 ;R0=0C7H,R1=02H,Z=”0” TM R0,@R1 ;R0=0C7H,R1=02H, 寄存器02H=23H,Z=”0” TM 00H,01H ;寄存器00H=2BH, 寄存器01H=02H,Z=”0” TM 00H,@01H ;寄存器02H=23H,Z=”0” TM 00H,#54H ;寄存器00H=2BH,Z=”1”
在第一个例子中,R0=0C7H,R1=02H。”TM R0,R1” 测试目的操作数的第1 位是否为0,该操作把目的操与源操作数进行与运算。操作结果,Z=0。
XOR 异或(Logical Exclusive OR)
操作: dst ← dst ⊕ src 源操作数与目的操作数进行异或操作,结果存在目的操作数存贮器。异或操作是,源操作数与目的操作数相应位相同,则为0,不同则为1。
标志位: C:不受影响
- Z:如果结果为0,则置1;反之,清0。
- S:如果结果第7 位为1,则置1;反之,清0。
- V:清0。
格 | 式: | 字节数 | 机器周期 | 指令代码 | 地址访问模式 | |||
---|---|---|---|---|---|---|---|---|
(16 进制) | dst | src | ||||||
opc | dst|src | 2 | 4 6 | B2B3 | r r | r Ir |
3 6 B4 RR 6 B5 RIR 3 6 B6 RIM
编程实例: 假如:R0=0C7H,R1=02H,R2=18H,寄存器00H=2BH ,寄存器01H=02H, 寄存器02H=23H XOR R0,R1 ;R0=0C5H,R1=02H XOR R0,@R1 ;R0=0E4H,R1=02H, 寄存器02H=23H XOR 00H,01H ;寄存器00H=29H, 寄存器01H=02H XOR 00H,@01H ;寄存器00H=08H, 寄存器01H=02H, 寄存器02H=23H XOR 00H,#54H ;寄存器00H=7FH 在第一个例子中,R0=0C7H,R1=02H. 异或操作的结果是R0=0C5H 。其余几个例子是不同的地址访问模式下的异或操作。