2010-6-272010-6-2711§3.1概述概述概述概述7777种寻址方式,种寻址方式,种寻址方式,种寻址方式,111111111111条指令条指令条指令条指令字节数字节数字节数字节数运算速度运算速度运算速度运算速度单字节指令:单字节指令:单字节指令:单字节指令:49494949条条条条双字节指令:双字节指令:双字节指令:双字节指令:45454545条条条条三字节指令:三字节指令:三字节指令:三字节指令:17171717条条条条单周期指令:单周期指令:单周期指令:单周期指令:64646464条条条条双周期指令:双周期指令:双周期指令:双周期指令:45454545条条条条四周期指令:四周期指令:四周期指令:四周期指令:2222条条条条第三章MCS-51指令系统InstructionSet2010-6-272010-6-2722功能功能功能功能数据传送类:数据传送类:数据传送类:数据传送类:29292929条条条条算术运算类:算术运算类:算术运算类:算术运算类:24242424条条条条逻辑运算类:逻辑运算类:逻辑运算类:逻辑运算类:24242424条条条条控制转移类:控制转移类:控制转移类:控制转移类:17171717条条条条位操作类:位操作类:位操作类:位操作类:17171717条条条条2010-6-272010-6-2733常用符号Rn:工作寄存器中的寄存器Rn、R1…R7之一,Ri:工作寄存器中的寄存器R0或R1#data:8位立即数#data16:16位立即数direct:片内RAM或SFR的地址(8位)@间接寻址寄存器Bit:片内RAM或SFR的位地址addr11:11位目的地址addr16:16位目的地址2010-6-272010-6-2744rel:补码形式的8位地址偏移量。偏移范围为-128~127/:位操作指令中,该位求反后参与操作,不影响该位X:片内RAM的直接地址或寄存器(X):相应地址单元中的内容→:箭头左边的内容送入箭头右边的单元内2010-6-272010-6-2755§§§§3.23.23.23.2寻址方式寻址方式寻址方式寻址方式3.2.13.2.13.2.13.2.1立即寻址立即寻址立即寻址立即寻址ImmediateAddressingImmediateAddressingImmediateAddressingImmediateAddressing操作数就包含在指令代码中,在操作码之后,称为操作数就包含在指令代码中,在操作码之后,称为操作数就包含在指令代码中,在操作码之后,称为操作数就包含在指令代码中,在操作码之后,称为立即数,用立即数,用立即数,用立即数,用““““####””””表示。表示。表示。表示。MCS-51MCS-51MCS-51MCS-51如:如:如:如:MOVP1,MOVP1,MOVP1,MOVP1,#80H#80H#80H#80HMOVR7,MOVR7,MOVR7,MOVR7,#0F5H#0F5H#0F5H#0F5HMOVDPTRMOVDPTRMOVDPTRMOVDPTR,,,,#1245H#1245H#1245H#1245H8086/80888086/80888086/80888086/8088MOVALMOVALMOVALMOVAL,,,,80H80H80H80HMOVALMOVALMOVALMOVAL,,,,0F5H0F5H0F5H0F5HMOVBXMOVBXMOVBXMOVBX,,,,1245H1245H1245H1245H操作数存在程序存储器中2010-6-272010-6-27663.2.33.2.33.2.33.2.3寄存器寻址寄存器寻址寄存器寻址寄存器寻址RegisterAddressingRegisterAddressingRegisterAddressingRegisterAddressing对选定的工作寄存器对选定的工作寄存器对选定的工作寄存器对选定的工作寄存器R0R0R0R0~~~~R7R7R7R7、、、、累加器累加器累加器累加器AAAA、、、、通用寄存器通用寄存器通用寄存器通用寄存器BBBB、、、、地址寄存器地址寄存器地址寄存器地址寄存器DPTRDPTRDPTRDPTR中的数进行操作。中的数进行操作。中的数进行操作。中的数进行操作。例:例:例:例:MOVAMOVAMOVAMOVA,,,,R0R0R0R0;;;;将将将将R0R0R0R0工作寄存器中的数据送到累加器工作寄存器中的数据送到累加器工作寄存器中的数据送到累加器工作寄存器中的数据送到累加器AAAA中去。中去。中去。中去。提一个问题:提一个问题:提一个问题:提一个问题:我们知道,工作寄存器就是内存单元我们知道,工作寄存器就是内存单元我们知道,工作寄存器就是内存单元我们知道,工作寄存器就是内存单元的一部分的一部分的一部分的一部分,,,,如果我们选择工作寄存器组如果我们选择工作寄存器组如果我们选择工作寄存器组如果我们选择工作寄存器组0000,则,则,则,则R0R0R0R0就就就就是是是是RAMRAMRAMRAM的的的的00H00H00H00H单元,那么这样一来,单元,那么这样一来,单元,那么这样一来,单元,那么这样一来,MOVAMOVAMOVAMOVA,,,,00H00H00H00H和和和和MOVAMOVAMOVAMOVA,,,,R0R0R0R0不就没什么区别了吗?不就没什么区别了吗?不就没什么区别了吗?不就没什么区别了吗?MOVALMOVALMOVALMOVAL,BLBLBLBL(8086CPU的寄存器寻址方式)2010-6-272010-6-2777的确,这两条指令执行的结果是完全相同的,的确,这两条指令执行的结果是完全相同的,的确,这两条指令执行的结果是完全相同的,的确,这两条指令执行的结果是完全相同的,都是将都是将都是将都是将00H00H00H00H单元中的内容送到单元中的内容送到单元中的内容送到单元中的内容送到AAAA中去,但是执行的过中去,但是执行的过中去,但是执行的过中去,但是执行的过程不同,执行第一条指令需要程不同,执行第一条指令需要程不同,执行第一条指令需要程不同,执行第一条指令需要2222个机器周期,而第二个机器周期,而第二个机器周期,而第二个机器周期,而第二条则只需要条则只需要条则只需要条则只需要1111个机器周期,第一条指令变成最终的目个机器周期,第一条指令变成最终的目个机器周期,第一条指令变成最终的目个机器周期,第一条指令变成最终的目标码要两个字节(标码要两个字节(标码要两个字节(标码要两个字节(E5H00HE5H00HE5H00HE5H00H),),),),而第二条则只要一个而第二条则只要一个而第二条则只要一个而第二条则只要一个字节(字节(字节(字节(E8E8E8E8HHHH))))就可以了。就可以了。就可以了。就可以了。2010-6-272010-6-27883.2.43.2.43.2.43.2.4寄存器间接寻址寄存器间接寻址寄存器间接寻址寄存器间接寻址RegisterRegisterRegisterRegisterIndIndIndIndirectirectirectirectAddressingAddressingAddressingAddressing把地址放在另外一个寄存器中,根据这个寄存器中的数值把地址放在另外一个寄存器中,根据这个寄存器中的数值把地址放在另外一个寄存器中,根据这个寄存器中的数值把地址放在另外一个寄存器中,根据这个寄存器中的数值决定该到哪个单元中取数据。决定该到哪个单元中取数据。决定该到哪个单元中取数据。决定该到哪个单元中取数据。�R0R0R0R0,,,,R1-R1-R1-R1----8---8---8---8位地址,位地址,位地址,位地址,片内片内片内片内低低低低128128128128字节或字节或字节或字节或片外片外片外片外�DPTRDPTRDPTRDPTR----16----16----16----16位,片外位,片外位,片外位,片外64KB64KB64KB64KB�MCS-51MCS-51MCS-51MCS-51如:如:如:如:MOVAMOVAMOVAMOVA,,,,@@@@R0R0R0R0MOVXAMOVXAMOVXAMOVXA,,,,@@@@R0R0R0R0MOVXAMOVXAMOVXAMOVXA,,,,@@@@DPTRDPTRDPTRDPTR�8086/8088CPU8086/8088CPU8086/8088CPU8086/8088CPUMOVALMOVALMOVALMOVAL,[[[[BXBXBXBX]]]]MOVAXMOVAXMOVAXMOVAX,[[[[SISISISI]]]]操作数在片内RAM中操作数在片外RAM中操作数在片外RAM中2010-6-272010-6-2799以以以以DPTRDPTRDPTRDPTR或或或或PCPCPCPC为基址寄存器,累加器为基址寄存器,累加器为基址寄存器,累加器为基址寄存器,累加器AAAA为变址寄存器。把两为变址寄存器。把两为变址寄存器。把两为变址寄存器。把两者内容相加,结果作为操作数的地址。者内容相加,结果作为操作数的地址。者内容相加,结果作为操作数的地址。者内容相加,结果作为操作数的地址。常用于查表操作。常用于查表操作。常用于查表操作。常用于查表操作。�MCS-51MCS-51MCS-51MCS-51MOVCMOVCMOVCMOVCAAAA,,,,@@@@A+DPTRA+DPTRA+DPTRA+DPTR;;;;(A+DPTR)(A+DPTR)(A+DPTR)(A+DPTR)→→→→AAAAMOVCMOVCMOVCMOVCAAAA,,,,@@@@A+PCA+PCA+PCA+PC;;;;PC+1PC+1PC+1PC+1→→→→PCPCPCPC,,,,(A+PC)(A+PC)(A+PC)(A+PC)→→→→AAAA3.2.53.2.53.2.53.2.5变址寻址变址寻址变址寻址变址寻址((((基址基址基址基址++++变址变址变址变址))))Base-Register-plus-Index-Register-IndirectAddressingBase-Register-plus-Index-Register-IndirectAddressingBase-Register-plus-Index-Register-IndirectAddressingBase-Register-plus-Index-Register-IndirectAddressing�8086/8088CPU8086/8088CPU8086/8088CPU8086/8088CPUMOVALMOVALMOVALMOVAL,[[[[BX+SIBX+SIBX+SIBX+SI]]]]MOVAXMOVAXMOVAXMOVAX,[[[[BP+DIBP+DIBP+DIBP+DI]]]]操作数在程序存储器中2010-6-272010-6-271010E0A程序存储区2040H9320E0H472041H………DPH20DPL00ALU如:MOVCA,@A+DPTR设DPTR=2000H,A=E0H20E0H47指令代码2010-6-272010-6-271111E0A程序存储区ALU如:MOVCA,@A+PC设A=E0H2121H452040H832121H452041H………2120H47当前PC指令代码2010-6-272010-6-2712123.2.63.2.63.2.63.2.6相对寻址相对寻址相对寻址相对寻址将将将将PCPCPCPC中的当前内容与指令中的当前内容与指令中的当前内容与指令中的当前内容与指令第二字节给出的数第二字节给出的数第二字节给出的数第二字节给出的数相加,结相加,结相加,结相加,结果作为跳转指令的转移地址(转移目的地址)。果作为跳转指令的转移地址(转移目的地址)。果作为跳转指令的转移地址(转移目的地址)。果作为跳转指令的转移地址(转移目的地址)。PCPCPCPC中的中的中的中的当前当前当前当前内容