关于计算机指令系统的深度剖析Word格式文档下载.docx
《关于计算机指令系统的深度剖析Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《关于计算机指令系统的深度剖析Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。
逻辑运算类指令(24条)
控制转移类指令(17条)
位操作类指令(17条)
汇编语言指令格式
操作码助记符[目的操作数,源操作数]
例如MOVA,R0就表示把工作寄存器R0中的数据送入A累加器。
汇编语言指令和机器码书写格式
地址机器码[标号]汇编语言指令[注解]
2000H748ASTART:
MOVA,#8AH;
送被乘数
指令中的常用符号
·
Rn:
表示当前工作寄存器R0~R7中的一个。
@Ri:
表示寄存器间接寻址,常常作间接寻址的地址指针。
其中Ri代表R0和R1寄存器中的一个。
Direct:
表示内部数据存贮器单元的地址及特殊功能寄存器SFR的地址,对SFR而言,既可使用它的物理地址,也可直接使用它的名字。
#data:
表示8位立即数,即8位常数,取值范围为#00H~#0FFH
#data16:
表示16位立即数,即16位常数,取值范围为#0000H~#0FFFFH
addr16:
表示16位地址
addr11:
表示11位地址
rel:
用补码形式表示的地址偏移量,取值范围为-128~+127。
Bit:
表示内部RAM和SFR中的具有位寻址功能的位地址。
SFR中的位地址可以直接出现在指令中,为了阅读方便,往往也可用SFR的名字和所在的数位表示。
如:
表示PSW中奇偶校验位,可写成D0H,也可写成PSW.0的形式出现在指令中。
@:
表示间接寻址寄存器或基址寄存器的前缀符号。
$:
表示当前指令的地址。
寻址方式
每条指令存数或取数都需要知道如何获得该数据,如何产生操作数或其地址就称作寻址。
指令的寻址方式是指如何获得操作数的方法,一个指令系统的寻址方式越多,计算机的功能越强,灵活性越大。
所以寻址方式的多样性和灵活性是衡量计算机性能的一项重要指标。
MCS-51单片机有七种寻址方式。
1.寄存器寻址(RegisterAddressing)
在指令中指出存放操作数的寄存器,因为寄存器在片内RAM中,所以其特点是速度快。
如MOVA,R0,INCDPTR,MULAB,DECR7等。
寄存器包括32个工作寄存器(分4组)以及部分专用寄存器。
指令只能使用当前寄存器组的8个通用寄存器R0~R7,对不同寄存器组可以通过PSW中的RS0,RS1来选择。
2.直接寻址(DirectAddressing)
指令中给出操作数的8位直接地址,可用这种寻址方式的存储空间只限于内部RAM。
在一般指令中用Direct表示直接地址。
有以下三种情况:
片内RAM的低128个字节(00H~7FH)。
MOVA,78H
ORLA,5EH
专用寄存器SFR:
这是访问SFR的唯一方法。
在指令中可以给出直接地址,也可以给出寄存器符号。
MOVTCON,A或MOV88H,A
MOVA,SBUF或MOVA,99H
片内RAM(包括SFR)的中的可位寻址空间,即位操作指令中的位地址。
也可把其单独列为位寻址(见7.位寻址)。
MOVC,7EH
SETB20H
SETBEA/IE.7/AFH
CLREX0/IE.0/A8H
3.寄存器间接寻址(RegisterIndirectAddressing)
用寄存器存放操作数的地址,即用寄存器作为地址指针,但要在寄存器前面加上@以示区别。
可以用作地址指针的间接寄存器只能是R0、R1和DPTR,在一般指令中分别用@Ri和@DPTR来表示。
这种寻址方式可用于访问片内和片外RAM,不能用于访问SFR。
片内RAM(8X51的低128个字节地址00H~7FH,8X52的低256个字节地址00H~FFH),用R0或R1作间接寄存器。
MOVA,@Ri(i=0或1)
ANLA,@Ri
MOV@R0,A;
若R0=30H,A=34H
片外RAM:
访问片外RAM的唯一方法就是寄存器间接寻址。
注意指令操作码要改为MOVX。
访问第一页256个单元RAM时,可用8位的R0或R1寄存器作间接寄存器。
实际上是默认高8位地址为00H。
MOVXA,@Ri(i=0或1)
MOVX@Ri,A(i=0或1)
若需要访问其他页面,可以先把高8位送P2口,再用R0或R1寄存器作低8位地址指针也可访问整个64k片外RAM。
访问整个64k片外RAM,可用16位的DPTR寄存器作间接寄存器。
MOVXA,@DPTR
MOVX@DPTR,A
另外,堆栈操作中的栈指针(SP)也可以认为是一种寄存器间接寻址方式。
4.立即寻址(ImmediateAddressing)
一般把在指令中直接给出的操作数称为立即数。
在指令操作码的后面紧跟一个和或二个字节的操作数。
但要在立即数的前面加一个#以与直接地址区别。
在一般指令格式中,立即数用#DATA或#DATA16表示。
MOVA,#3AH;
3AH→A
MOVA,#2476H;
2476H→DPTR
而MOVA,3AH;
(3AH)→A
5.变址寻址(IndexAddressing)
以DPTR或PC寄存器作基址寄存器,用累加器A作变址寄存器,以其内容相加形成要访问字节数据的有效地址。
这种寻址方式用于查表指令。
MOVCA,@A+DPTR
若(A)=05H,(DPTR)=0300H则A←(0305H)
①只能对程序存储器寻址;
②只有两条;
MOVCA,@A+DPTR,MOVCA,@A+PC
③全部是一字节指令
6.相对寻址(RelativeAddressing)
相对寻址是将程序计数器PC的当前值与指令中给出的偏移量相加,就形成转移的目标地址。
用于程序的相对转移指令,指令中给出了转移目标地址相对于程序计数器PC的位(偏)移量。
位移量用一字节补码表示。
最大转移地址为-128~+127,考虑到转移指令长度为2~3字节。
所以目标地址距离转移指令地址的差为–126~+129(两字节)或-125~+130(三字节)。
这里PC的当前值是指执行完该转移指令后的PC中的地址值,即转移指令操作码的PC值加上该转移指令的字节数(可以是2或3)。
2000HSJMP08H;
PC←PC+2+08H
程序转移有效地址=(PC+2/3)+偏移量
在实际应用中,往往是已知转移指令操作码的地址(源地址)和需要转移的目标地址,求偏移量。
故
偏移量=目标地址-(源地址+2/3)
偏移量为正,向下转移;
偏移量为负,向上转移。
计算偏移量只要用地址的低8位运算,因为仅表示相对转移。
7.位寻址(BitAddressing)
直接对数据位的操作称为位寻址。
位寻址只能对有位地址的单元作位寻址操作。
这种寻址方式实际上是一种直接寻址方式,不过其地址是位地址。
ANLC,30H,表示用进位位Cy与位地址为30H的逻辑位进行“与”操作。
SETB10H,表示将10H位置1
位寻址的寻址范围:
①内部RAM中的可位寻址区:
字节单元地址20H~2FH16个单元的128位,位地址为00H~7FH
②可位寻址的专用寄存器中的可寻址位:
可位寻址的寄存器有B,ACC,PSW,IP,P3,IE,P2,SCON,P1,TCON,P0等11个,有可寻址位83位。
专用寄存器中寻址位在指令中有四种表示方法。
●直接使用地址。
80H,88H,90H,98H,0A0H,0A8H,0B0H,0B8H,0D0H,0E0H,0F0H,开始的8个连续位地址,除去0BDH,0BEH,0BFH,0ADH,0AEH5个位地址。
●位名称。
如SM0,PT1,F0等
●字节地址加位如0D0H.5
●专用寄存器符号加位如PSW.5
注意:
一条指令可能有两个操作数,可分别用两种不同寻址方式。
单片机执行指令的过程
执行程序的过程就是执行指令的过程。
执行指令的过程大致如下:
地址线出现指令操作码所在单元的地址;
自动修改PC(加一);
读(取)指令操作码,送指令寄存器IR;
经指令译码器进行指令译码;
发出操作信号;
给出操作数地址(由寻址方式决定),取出操作数;
执行操作。
发出下一条指令地址;
…。
数据传送指令
片内RAM低128字节(包含工作寄存器区,位地址空间等)
1.寄存器寻址:
只用于片内工作寄存器R0~R7的存取
MOVRn,A
MOVA,Rn
注意工作寄存器有4个区,上电复位后自动选0区(00H~07H),其他区可通过设置PSW中的RS1、RS0来选择,例如
MOVR2,A;
上电时选中0区,送入0区R2(02H)
MOVPSW,#08H;
选择1区寄存器
送入1区R2(0AH)
2.直接寻址
MOVA,direct
MOVdirect,A
MOV@Ri,direct
MOVdirect,@Ri
MOVRn,direct
MOVdirect,Rn
MOVdirect,direct
MOVdirect,#data
如MOV40H,A
MOVR0,A
MOV50H,40H
3.寄存器间接寻址
MOVA,@Ri
MOV@Ri,A
MOV@Ri,#data
如MOVR0,#40H
MOVR1,#41H
MOVA,@R0
MOV@R1,A;
MOV41H,40H
MOV@R0,#55H
专用寄存器(SFR)(80H~FFH中只占用21个字节,其他无用)
其中除ACC、B、DPTR可用寄存器寻址以外,其他只能用直接寻址。
MOVA,SFR
MOVSFR,A
MOVRn,SFR
MOVSFR,Rn
MOVdirect,SFR
MOVSFR,direct
MOVSFR,SFR
MOVSFR,#data→MOVDPTR,#data16
;
MOVDPH,#dataH
MOVDPL,#dataL
如MOV@R1,P1→MOV@R1,90H
MOVP1,P2→MOV90H,0A0H
片内RAM
只能用寄存器间接寻址,一共只有6条指令,无其他指令可用。
MOVXA,@R0MOVX@R0,A
MOVXA,@R1MOVX@R1,A
MOVXA,@DPTRMOVX@DPTR,A
程序存储器
在ROM/EPROM中要把数据输送到寄存器、片内RAM或SFR去,只能用立即寻址方式送数。
MOVA,#data
MOVRn,#data
MOV@Ri,#data
MOVdirect,#data
MOVSFR,#data
要获得EPROM中常数表格中的常数,只能用查表指令。
MOVCA,A+DPTR
MOVCA,A+PC
如要把0F转换成七段显示代码
DISP:
……
MOVDPTR,#SEGTBL
MOVCA,@A+DPTR
……
SEGTBL:
DB3FH;
0的七段代码
DB02H;
1的七段代码
又如
01007402MOVA,#02H
010283MOVCA,@A+PC
0103805BSJMPNEXT
010532DB32H
执行MOVCA,@A+PC指令后,因为这时PC=0103H,A=02H
所以该指令是把0105H单元中的数据32H送入A累加器。
注意:
片外RAM不能与片内RAM直接传送数据!
并只能通过A累加器作为中转。
另外工作寄存器之间不能直接打交道,也要通过A累加器作为中转。
但可以用直接寻址方式传送。
所以还有三组专门与ACC打交道的数据交换指令。
数据交换指令
1.字节交换指令
XCHA,Rn;
工作寄存器内容与ACC内容交换
XCHA,direct/SFR;
片内RAM/SFR内容与ACC内容交换
XCHA,@Ri;
地址在Ri中的片内RAM内容与ACC内容交换
2.低半字节交换指令
XCHDA,@Ri;
片内RAM的低4位与ACC的低4位数据交换
3.累加器ACC低4位与高4位交换
SWAPA;
ACC的低4位与高4位数据交换
栈操作指令
源地址是直接地址,目的地址是隐含间接地址寄存器(@SP)
或目的地址是直接地址,源地址是隐含间接地址寄存器(@SP)
PUSHdirect
POPdirect
例如,进入中断服务程序时,通常需要保护现场,把ACC、PSW、DPTR等寄存器内容压栈保护,若SP=38H
PUSHACC
PUSHPSW
PUSHDPH
PUSHDPL
执行这4条指令后,SP=3CH
在出中断服务程序返回主程序之前,还要恢复现场,要注意堆栈先进后出的特点,出栈次序要相反。
POPDPL
POPDPH
POPPSW
POPACC
控制转移指令
无条件转移指令
1.长跳转指令LJMPaddr16
(LongJump)
2.短跳转指令SJMPrel;
相对转移指令
(ShortJump)
3.绝对跳转指令AJMPaddr11
(AbsoluteJump)
该指令机器码构成如下:
addr11=a10a9a8a7a6a5a4a3a2a1a0
这11位地址在机器码中作如下安排:
机器码为a10a9a800001a7a6a5a4a3a2a1a0
操作码01H000
21H001
41H010
61H011
81H100
A1H101
C1H110
E1H111
实际转移地址是原PC中的地址的最高五位保持不变,低11位换上addr11。
关键是如何得到操作码?
例如
1938H1100KEYBD:
ACALLDISUP
……
1B0AH2138AJMPKEYBD
1B0CH
1B97H2138AJMPKEYBD
其地址高8位19H和1BH中的高5位相同。
如何形成操作码?
转移目的地址的高8位的最低3位+00001形成操作码,这里转移地址的高8位是19H,即00011001,其后三位为00100001,为21H,其第二字节即转移地址的低8位。
4.散转指令JMP@A+DPTR
DPTR中的基地址加上ACC中的无符号数形成有效转移地址。
通过改变ACC中的内容便可转移到不同的分支,故称散转指令。
如根据ACC中的数值转移到不同分支去。
(ACC中必须是偶数)
MOVDPTR,#TABLE
JMP@A+DPTR
TABLE:
AJMPROUT0;
A=0
AJMPROUT1;
A=2
AJMPROUT2;
A=4
……
条件转移指令
1.进位/无进位转移指令(2字节相对转移指令)
JCrel;
Cy=1,则转移
JNCrel;
Cy=0,则转移
2.累加器内容全零/非零转移指令(2字节相对转移指令)
JZrel;
(A)=0,则转移
JNZrel;
(A)≠0,则转移
3.比较不相等转移指令(3字节3操作数相对转移指令)
CJNEA,#data,rel
CJNEA,direct,rel
CJNE@R0,#data,rel
CJNE@R1,#data,rel
CJNERn,#data,rel
第一操作数与第二操作数相比较(比较即相减后不回送结果),若不相等,则转移,同时会影响Cy标志。
当第一操作数小于第二操作数时,Cy=1;
反之,Cy=0。
利用此指令可实现程序三分支。
4.减1不为零转移指令(相对转移)
DJNZRn,rel;
2字节指令
DJNZdirect,rel;
3字节指令,direct可以是片内RAM任意字节地址。
5.位测试指令
JBbit,rel;
(bit)=1,则转移
JNBbit,rel;
(bit)=0,则转移
JBCbit,rel;
(bit)=1,则转移,同时该位清零
子程序调用与返回指令
1.绝对调用指令
ACALLaddr11
其转移范围与AJMP相同。
操作码形成把AJMP中的00001换成10001。
AJMP操作码01,21,41,61,81,A1,C1,E1
ACALL操作码11,31,51,71,91,B1,D1,F1
2.长调用指令
LCALLaddr16
3.返回指令
RET
算术逻辑运算指令
1.加法指令:
有带进位和不带进位两种加法指令
ADDA,RnADDCA,Rn
ADDA,@RiADDCA,@Ri
ADDA,directADDCA,direct
ADDA,#dataADDCA,#data
INCA
INCRn
INCdirect
INC@Ri
INCDPTR
DAA;
十进制调整指令
带进位加法指令主要用于多字节数的加法。
例如两个3字节无符号数相加
被加数放在片内RAM的20H~22H(低位在前)
加数放在片内RAM的2AH~2CH
MOVR0,#20H;
被加数首址
MOVR1,#2AH;
加数首址
MOVR7,#03H;
字节数
CLRC;
清进位标志
LOOP:
MOVA,@R0;
取被加数一个字节
ADDCA,@R1;
与加数一个字节相加
MOV@R0,A;
暂存中间结果
INCR0;
调整地址指针
INCR1
DJNZR7,LOOP;
字节数-1,不为零转移
CLRA
ADDCA,#00H;
处理进位
MOV@R0,A;
存放进位于23H单元
SJMP$
2.带借位减法指令
(SubtractBorrow)
SUBBA,Rn
SUBBA,@Ri
SUBBA,direct
SUBBA,#data
DECA
DECRn
DECdirect
DEC@Ri
3.乘法指令(单字节4机器周期指令)8位无符号数乘法
(Multiply)
MULAB;
BA←A×
B,Cy=0,
A和B中各放8位无符号数,指令执行后16位乘积的高8位在B中,低8位在A中。
例如,A=50H,B=A0H,执行MULAB后,A×
B=3200H,B=32H,A=00H。
(80)(160)(12800)
若乘积>
255时,OV=1
4.除法指令(单字节4机器周期指令)8位无符号数除法
DIVAB;
A÷
B→商在A中,余数在B中,Cy=0,OV=0
例如,A=FBH,B=12H,执行DIVAB后,A=0DH,B=11H。
(251)