论文部分内容阅读
一、引言
MCS—51汇编语言指令系统是在MCS—51系列单片机上使用的专用指令系统。该指令系统具有指令丰富,对操作数寻址方式灵活多样等特点,在一些指令中对操作数的寻址往往可以采用不同的寻址方式,而在另一些指令中则只允许使用某一种特定的寻址方式。纵观MCS—51汇编指令系统,在111条指令中有94条采用了直接寻址或寄存器寻址方式,因此,深入理解和正确区分这两种寻址方式对编程不无裨益。但是,一方面在一些指令中对某些存储单元,特别是对SFR中的部分存储单元寻址时,其直接寻址方式和寄存器寻址方式的汇编指令形式比较相似;另一方面多数参考资料上通常只是列表给出各寻址方式的寻址范围(不排除有错误),或只是对各种寻址方式进行单独分析,缺少必要的横向对比和关键说明,所以对初学者来说往往易知其然而难知其所以然,笔者结合实践,针对上述问题做了详细分析和讨论,集中阐明了MCS—51汇编语言指令系统中对部分SFR单元寻址时,采用直接寻址和寄存器寻址方式的区别,进而给出了正确使用这两种寻址方式对SFR有关单元进行寻址的原则。
二、采用直接寻址和寄存器寻址访问部分SFR单元时有相似的指令形式
直接寻址方式是在指令中给出操作数的直接地址的一种寻址方法。在MCS-51汇编语言中使用这种寻址方式时,从指令形式上看,除了可以使用单元地址码表示外,还可以用单元的代号形式表示(还有其它形式,这里不做计论)。例如:SFR中的累加器单元、B寄存器单元、数据指针高位、数据指针低位、程序状态字等,在采用直接寻址方式时可以写作E0H、F0H、83H、82H、D0H等地址码形式,也可以写作ACC、B、DPH、DPL、PSW等代码形式。又如:PSW寄存器中的进位标志位、PI口锁存器的位0、IE寄存器中CPU开中断控制位等,在采用直接寻址方式时可以写作D0H、90H、AFH等,也可写作CY、P1.0、FA等位代号形式。
寄存器寻址方式是在指令给出操作数所在的寄存器名称的一种寻址方式。例如,对SFR中的累加器寄存器、乘除法寄存器对、数据指针寄存器等,当采用进行寄存器寻址时,在指令中可表示为A、AB、DPTR等。对位累加器这一位单元进行寄存器寻址时,在指令中表示为C。
三、直接寻址方式与寄存器寻址方式的区别
1、在指令中表示形式不同 由2中所举的例子可以看出,ACC与A,A、B与AB对,DPH、DPL与DPTR,CY与C等,书写形式相似但不相同,各组所确定的都是相同的物理单元,但在指令中前一种表示方式属于直接寻址,后一种表示方式属于寄存器寻址。
2、汇编目标代码不同 采用直接寻址方式和寄存器寻址方式对同一SFR单元进行寻址时,其汇编目标代码不同,这也是这两种寻址方式的本质区别。
在指令中采用直接寻址方式寻址。SFR某字节单元或位单元时,汇编后操作数的直接地址占用目标代码的一个字节。例如:
指令MOVACC,30H的汇编目标代码为7530E0H;
指令MOVB,30H的汇编目标代码为7530F0H;
指令MOVDPH,30H的汇编目标代码为753083H;
指令MOVDPL,30H的汇编目标代码为753082H;
指令JB CY,30H的汇编目标代码为20D730H。
由于上述指令中对源操作数的目的操作数的寻址均采用了直接寻址方式,所以目标代码共三个字节,其中第二个字节为源操作数地址的目标代码第三个字节为目的操作数地址的目标代码。
在指令中采用寄存器寻址方式寻址SFR某字节单元或位单元时,汇编后寄存器操作数与指令助记符被汇编成一个字节的目标代码。例如:
指令MOVA,30H的汇编目标代码为E530H;
指令MOVDPTR,#4000H的汇编目标代码为904000H;
指令MOVC,30H的汇编目标代码为A230H。
由于上述指令中对目的操作数的寻址采用的均是寄存器寻址方式,所以目标代码的第一个字节包含了指令助记符功能和寻址目的操作数所用的寄存器两方面的信息。
又如,指令MRL AB的汇编目标代码为A4H。该指令中两个操作数表示成AB对的形式(只能是这种形式),属于寄存器寻址方式,所以汇编AB对寄存器信息与指令助记符的目标代码共占一个字节。
四、采用直接寻址和寄存器寻址访问部分SFR单元的原则
(1)在访问外部数据存储器或程序存储器时,即在MOV X或MOV C指令中,累加器单元只能采用寄存器寻址方式,表示成A,而不能采用直接寻址方式,表示成ACC。
(2)利用PSW中的位7做位累加器时,只能采用寄存器寻址方式,而不能采用直接寻址方式。例如:指令MOV C,BIT和MOVBTT,C,不能写作MOV CY,BTT和MOVBTT,CY。
(3)采用寄存器代号加位号的形式对SFR中可位寻址寄存器的某位寻址时,寄存器单元应采直接寻址方式。例如:寻址累加器单元的位X(X=0—7)时,只能写作ACC.x而不能写作A.x。
(4)在堆栈操作指令中只能采用直接寻址方式。例如:对累加器单元的内容进行堆栈操作时,只能采用PUSH ACC和POPACC这种寄存器寻址方式,而不能采用PUSH A和POPA这种寄存器寻址方式。
(5)十进制加法调整指令中的累加器操作数只能使用寄存器寻址方式。
(6)乘法指令MUL AB是寄存器寻址方式,不能错写成MULACCB或其它形式。
(7)在某些字节逻辑操作指令中,累加器单元只能采用寄存器寻址方式。例如:指令CLR A,指令CPL A,指令RR A,指令RRCG A,指令RL A,指令RLC A以及指令SWAP A等。
MCS—51汇编语言指令系统是在MCS—51系列单片机上使用的专用指令系统。该指令系统具有指令丰富,对操作数寻址方式灵活多样等特点,在一些指令中对操作数的寻址往往可以采用不同的寻址方式,而在另一些指令中则只允许使用某一种特定的寻址方式。纵观MCS—51汇编指令系统,在111条指令中有94条采用了直接寻址或寄存器寻址方式,因此,深入理解和正确区分这两种寻址方式对编程不无裨益。但是,一方面在一些指令中对某些存储单元,特别是对SFR中的部分存储单元寻址时,其直接寻址方式和寄存器寻址方式的汇编指令形式比较相似;另一方面多数参考资料上通常只是列表给出各寻址方式的寻址范围(不排除有错误),或只是对各种寻址方式进行单独分析,缺少必要的横向对比和关键说明,所以对初学者来说往往易知其然而难知其所以然,笔者结合实践,针对上述问题做了详细分析和讨论,集中阐明了MCS—51汇编语言指令系统中对部分SFR单元寻址时,采用直接寻址和寄存器寻址方式的区别,进而给出了正确使用这两种寻址方式对SFR有关单元进行寻址的原则。
二、采用直接寻址和寄存器寻址访问部分SFR单元时有相似的指令形式
直接寻址方式是在指令中给出操作数的直接地址的一种寻址方法。在MCS-51汇编语言中使用这种寻址方式时,从指令形式上看,除了可以使用单元地址码表示外,还可以用单元的代号形式表示(还有其它形式,这里不做计论)。例如:SFR中的累加器单元、B寄存器单元、数据指针高位、数据指针低位、程序状态字等,在采用直接寻址方式时可以写作E0H、F0H、83H、82H、D0H等地址码形式,也可以写作ACC、B、DPH、DPL、PSW等代码形式。又如:PSW寄存器中的进位标志位、PI口锁存器的位0、IE寄存器中CPU开中断控制位等,在采用直接寻址方式时可以写作D0H、90H、AFH等,也可写作CY、P1.0、FA等位代号形式。
寄存器寻址方式是在指令给出操作数所在的寄存器名称的一种寻址方式。例如,对SFR中的累加器寄存器、乘除法寄存器对、数据指针寄存器等,当采用进行寄存器寻址时,在指令中可表示为A、AB、DPTR等。对位累加器这一位单元进行寄存器寻址时,在指令中表示为C。
三、直接寻址方式与寄存器寻址方式的区别
1、在指令中表示形式不同 由2中所举的例子可以看出,ACC与A,A、B与AB对,DPH、DPL与DPTR,CY与C等,书写形式相似但不相同,各组所确定的都是相同的物理单元,但在指令中前一种表示方式属于直接寻址,后一种表示方式属于寄存器寻址。
2、汇编目标代码不同 采用直接寻址方式和寄存器寻址方式对同一SFR单元进行寻址时,其汇编目标代码不同,这也是这两种寻址方式的本质区别。
在指令中采用直接寻址方式寻址。SFR某字节单元或位单元时,汇编后操作数的直接地址占用目标代码的一个字节。例如:
指令MOVACC,30H的汇编目标代码为7530E0H;
指令MOVB,30H的汇编目标代码为7530F0H;
指令MOVDPH,30H的汇编目标代码为753083H;
指令MOVDPL,30H的汇编目标代码为753082H;
指令JB CY,30H的汇编目标代码为20D730H。
由于上述指令中对源操作数的目的操作数的寻址均采用了直接寻址方式,所以目标代码共三个字节,其中第二个字节为源操作数地址的目标代码第三个字节为目的操作数地址的目标代码。
在指令中采用寄存器寻址方式寻址SFR某字节单元或位单元时,汇编后寄存器操作数与指令助记符被汇编成一个字节的目标代码。例如:
指令MOVA,30H的汇编目标代码为E530H;
指令MOVDPTR,#4000H的汇编目标代码为904000H;
指令MOVC,30H的汇编目标代码为A230H。
由于上述指令中对目的操作数的寻址采用的均是寄存器寻址方式,所以目标代码的第一个字节包含了指令助记符功能和寻址目的操作数所用的寄存器两方面的信息。
又如,指令MRL AB的汇编目标代码为A4H。该指令中两个操作数表示成AB对的形式(只能是这种形式),属于寄存器寻址方式,所以汇编AB对寄存器信息与指令助记符的目标代码共占一个字节。
四、采用直接寻址和寄存器寻址访问部分SFR单元的原则
(1)在访问外部数据存储器或程序存储器时,即在MOV X或MOV C指令中,累加器单元只能采用寄存器寻址方式,表示成A,而不能采用直接寻址方式,表示成ACC。
(2)利用PSW中的位7做位累加器时,只能采用寄存器寻址方式,而不能采用直接寻址方式。例如:指令MOV C,BIT和MOVBTT,C,不能写作MOV CY,BTT和MOVBTT,CY。
(3)采用寄存器代号加位号的形式对SFR中可位寻址寄存器的某位寻址时,寄存器单元应采直接寻址方式。例如:寻址累加器单元的位X(X=0—7)时,只能写作ACC.x而不能写作A.x。
(4)在堆栈操作指令中只能采用直接寻址方式。例如:对累加器单元的内容进行堆栈操作时,只能采用PUSH ACC和POPACC这种寄存器寻址方式,而不能采用PUSH A和POPA这种寄存器寻址方式。
(5)十进制加法调整指令中的累加器操作数只能使用寄存器寻址方式。
(6)乘法指令MUL AB是寄存器寻址方式,不能错写成MULACCB或其它形式。
(7)在某些字节逻辑操作指令中,累加器单元只能采用寄存器寻址方式。例如:指令CLR A,指令CPL A,指令RR A,指令RRCG A,指令RL A,指令RLC A以及指令SWAP A等。