1、11 寻址方式和指令系统一、寄存器1.1 工作寄存器有 R0、R1、R2、R3、 R4、R5、R6、R7 共 8 个,都是 8 位的寄存器。其中 R0、R1 可以做数据指针,可以做间接地址空间的数据指针,也可以做外部数据区的指针,以间接寻址的方式对 RAM中的数据据进行读取。当然,R0、R1 也可以像R2、R3、R4、R5、R6 、R7 一样,做普通的寄存器来用。在物理上,工作寄存器共有四组,分别占用内部 RAM 的00H07H、08H0FH、10H17H、18H1FH 四组地址。当前使用的通用寄存器组,是由程序状态字 PSW 的第四位和第三位(RS1、RS0)来决定的。四组寄存器,在中断程序
2、中,可以通过切换寄存器的方式,来快速实现现场保护。在 C51 中,可以用 using 0、using 1、 using 2、 using 3 来指明某函数所用的寄存器组。如:Void int0pro(void) interrupt 0 using 2 /这个函数用第二组工. /作寄存器 对通用寄存器的访问,是最快速的访问。比下面的两条指令:MOV A,R7MOV A,07H都是将内部 RAM 空间的 07H 单元存储的数据,赋给寄存器A,但是前者是寄存器寻址,比后者直接寻址,更快一些。1.2 累加器 A寄存器 A 是一个特殊的寄存器,所有算术运算类指令中的一个操作数,必须在寄存器 A 中,其运
3、算结果,也一定存入该寄存器。由于加法是最基本的运算,所以称寄存器 A 为累加器,它是 8051家族单片机所有的寄存器中最重要的一个。如:ADD A,R1SUBB A,#23MUL ABDIV AB累加器 A 不占用存储单元,有一个专门的硬件电路。但是它可以映射到 SFR 空间,占用地址:0E0H,此时,写做 ACC,在栈操作可以使用。比较下面代码:MOV A,#0MOV ACC,#0虽然执行后的结果,没有区别,但是后者执行时间要长一倍。1.3 辅助寄存器 B寄存器 B,用于乘除法的第二个操作数,运算的部分结果,也存在该寄存器中。B 是一个 SFR,占用地址: 0F0H。1.4 程序状态字 PS
4、W程序状态字 PSW,是一个 SFR,来指明当前指令的执行情况、累加器 A 的数据状态、工作寄存器组的选择等。F0、F1 可做为普通的位变量来使用。这个寄存器在运算类操作、条件转移、中断时寄存器组切换时,是非常有用的。CY,也称 C,在位传送指令中使用,如:MOV C,P2.0MOV P1.0,C1.5 数据指针 DPTRDPTR 是一个 16 位寄存器,也可当成两个 8 位寄存器DPH、DPL。外部数据不能直接访问,必须通过数据指针 DPTR 或R0、R1 来间接访问。但是 R0、R1 的访问范围,只能限定在一页(256 字节)内,限定在哪一页,由页寄存器 EMI0CN 来确定。如:MOV
5、EMI0CN, #12h ; 将地址的高字节装入 EMI0CNMOV R0, #34h ; 将地址的低字节装入 R0MOVX A, R0 ; 将地址 0x1234 的内容装入累加器 以上三句,和下面两句是等价的:MOV DPTR,#1234MOVX A,DPTR上面三句,好像并没有下面的两句简洁,但是如果我们在一页内频繁操作的话,页寄存器,并不需要重新赋值,这样,通过R0(R1)来对外部 RAM 进行访问,在速度上,就占优势了。另一方面,我们也拥有三个指针指向外部数据区,在程序设计上,也会更加便利。1.6 堆栈指针 SPSP 总是指向当前栈顶。在每次执行 PUSH 操作前,堆栈指针加 1。执行
6、 POP 操作后,堆栈指针减 1,SP 寄存器复位后,其值是 07H,堆栈区占用第一组工作寄存器的位置,一般说来,这样是不能容忍的,须将 SP 重新赋给一个大于 30H 的值,使堆栈区不占用寄存器空间、也不占用位寻址空间。我们常将 SP 赋于一个大于一个 80H 的值,使堆栈区位于间接寻址区,以释放更多的可直接寻址的 RAM 空间。1.7 程序指针 PC程序当前的位置,PC 的值不能由软件赋值,它根据程序指令情况自动变化。我们可以用 PC 间址寻址,来读取存在程序空间的数据。二、寻址方式所谓寻址方式,就是把操作数取出来的方式。应该叫寻数方式。2.1 寄存器寻址操作数在寄存器中。如下列指令:IN
7、C R0INC DPTR2.2 立即寻址操作数,是一个常数,如下列指令:MOV R0,#23HADD A,#34H2.3 直接寻址操作数,在直接寻址空间,如下列指令:MOV A,30H;将直接寻址空间地址为 30H 的数据,传送到累加器 A。ADD A,38H;将直接寻址空间地址为 38H 的数据,和累加器 A 的数据相加,结果存入累加器 A。2.4 间接寻址操作数,是用 R0 或 R1 指向的地址单元的数据。如下列:MOV R0,#80HMOV A,R0 ; 将间接寻址空间地址为 80H 的数据,传送到累加器 A。MOV R1,#40HMOV A,R1 ; 将内部 RAM 空间地址为 40H
8、 的数据,;传送到累加器 A。这部分区间,即可以直接寻址,也可以间接寻址。ADD A,R1 ;内部 RAM 间接寻址的指针,只能是 R0 或R1。MOV DPTR,#0FFFHMOVX A, DPTR ;外部 RAM,地址为 0XFFF 的单元的数据,传给 A。MOV DPTR,#010000HMOVC A,DPTR; 程序空间地址为 0X1000 的单元的数据,传给 A。2.5 变址寻址这种寻址方式是以 16 位的程序计数器 PC 和数据指针 DPTR作为基址,以 8 位的累加器 A 做为变址,两个寄存器的值相加,形成一个 16 位的地址,做为操作数的地址。如:MOV A,#0MOVC A,
9、A+PCSJMP ADDR4TAB: 47H,48H,49H,4AHMOVC A,A+DPTR2.6 相对寻址SJMP LOOP ;相对转移指令2.7 位直接寻址对位空间进行寻址,该空间只能是直接寻址。三、指令系统8051 共有 111 条指令,也有人说有 57 条指令,统计口径不同。3.1、数据传送类指令格式: MOV ,3.1.1 内部 8 位数据传送指令操作码 目的 源 字节数 执行时间(周期)#data 2 1Data 2 1Ri 1 1ARn 1 1#data 2 1Data 2 2RnA 1 1MOVDirect #data 3 2Data 3 2A 2 1Ri 2 2Rn 2 1
10、#data 2 1Data 2 2RiA 1 1如:MOV A,30HMOV A,R1MOV A,R1MOV R0,AMOV 30H,40HMOV 40H,80HMOV R1,#80H MOV P2,R1问题:MOV SP,#30H,在哪呢?3.1.2 位变量传送指令MOV C,23HMOV BIT,00HMOV C,P1.03.1.3 16 位数据传送指令MOV DPTR,# data16;3.1.4 累加器与外部 RAM 的传送指令MOVX A,RiMOVX Ri,A MOVX DPTR,AMOVX A,DPTR3.1.5 查表指令MOVC A,A+PCMOVC A,A+DPTR3.2 数
11、据交换指令XCH A,RnXCH A,Ri /间接地址XCH A,direct /直接地址XCHD A,Ri /间接地址3.3 算术运算指令3.3.1 加法指令ADD A,RnADD A,directADD A,RiADD A,#data3.3.2 带进位加法指令ADDC A,RnADDC A,directADDC A,RiADDC A,#data3.3.3 带借位减法SUBB A,RnSUBB A,directSUBB A,RiSUBB A,#data3.3.4 十进制调整DA A3.3.5 加一指令INC AINC RnINC directINC RiINC DPTR3.3.6 减 1 指令DEC ADEC RnDEC directDEC Ri3.4 逻辑运算类指令3.4.1 CLR A ;累加器 A 清零 CPL A ;累加器 A 取反 RL A ;累加器 A 移位 RR A