《【ch03】单片机的指令系统.docx》由会员分享,可在线阅读,更多相关《【ch03】单片机的指令系统.docx(4页珍藏版)》请在第一文库网上搜索。
1、第3章单片机的指令系统1 .在程序状态字PSW中,有哪几个状态位?有哪几个控制位?程序状态字PSw是8位寄存器,用于存放程序运行的状态信息,PS.中各位状态通常是在指令执行的过程中自动形成的,但也可以由用户根据需要采用传送指令加以改变。各个标志位的意义如下:PSW.7(Cy):进位标志位。PSW.6(AC):辅助进位标志位,又称为半进位标志位。PSW.5(F0):用户标志位。PSW.4、PSW.3(RS1和RSO):寄存器组选择位。PSW.2(0V):溢出标志位。PSK1(空缺位):此位未定义。PSW.0(P):奇偶校验位应该都是状态位p3和p4可以控制寄存器选择2 .分别指出下列指令中的目的
2、操作数的寻址方式。MOVA,#64HMOVA,R3MOVA,60HMOVA.而R1MOVXA,DPTRMOVCA,A+PC(1)寄存器寻址(2)立即数寻址(3)直接寻址(4)寄存器间接寻址(5)寄存器间接寻址(6)基址加变址寄存器间接寻址(7)相对寻址(8)位寻址3 .试述指令“MOVA,#50H”与ttMOVA,50H”的区别。区别有三条:(1)MOVAX,2000H对源操作数是立即寻址,而MOVAX.2000H对源操作数是直接寻址;(2)前者功能是把立即数2000H送入AX中,而后者是把内存2000H单元与2001H单元的内容取出送入AX中;(3)两者的机器代码不同,执行速度也不同,前者执
3、行时间快,后者执行时间慢。4 .若堆栈指针的初始值为60H,DPTR=2000H.试问:(1)在“PUSHDPH”和“PUSHDP1”后的SP值是什么?(2)在uPOPACCn又uPOPACCn后的ACC值是什么?1 .在执行USHDPH和USHDP1指令后,SP(堆栈指针)的值会减2。因此,如果初始SP的值为60H,那么执行这两条指令后,SP的值将(1)在执行PUSHDPH和PUSHDP1后,栈指针SP的值将减2,因为每个PUSH操作会将两个字节的数据(DPH和DP1)压栈。因此,SP的值将变为5EH0(2)在执行POP变为5EH。2 .在执行POPACC和POPACC指令后,ACC(累加器
4、)的值将从堆栈中被弹出。根据提供的信息,这两条指令会从堆栈中弹出两个字节,分别存储在DPTR和ACC中。由于DP(I)在执行PUSHDPH后,SP值会减小1,而DPH的值为高字节部分,即20H,因此SP值为5FH。在执行PUSHDP1后,SP值再次减小1并将DP1的值压入堆ACC和POPACC之后,ACC寄存器的值将依次恢更为弹出的两个字节数据。具体的值取决于栈中存储的数据,无法得知具体的数值。TR的初始值为2000H,两个字节的数据将从这个地址开始被弹出,并存储在ACC中。因此,如果DPTR的初始值为2000H,并且堆栈中存有两个字节的数据,那么执行这两条指令后,ACC的值将被更新为堆栈中存
5、储的两字节数据的值。栈,即将低字节部分的值OOH压入堆栈。因此,最终的SP值为5EH。(2)在执行P0PACC后,SP值会增加1,将堆栈中的值弹出给ACC寄存器。由于之前将DP1的值压入堆栈,所以ACC的值将变为OOHo然后执行POPACC再次弹出堆栈中的值给ACC寄存器。由于之前将DPH的值压入堆栈,所以ACC的值将变为20Ho5 .已知:(20H)=25H,(25H)=10H,(PI)=OFOHf在执行下列指令后,(A),(30H),(R1),(RO),(B),(P3)的内容是什么?MOVR1,#20HMOV30H,R1MOVRO,30HMOVB,ROMOVA,P1MOVP3,A略。6 .
6、写出完成下列要求的指令。将地址为400OH的片外数据存储单元内容送入地址为30H的片内数据存储单元中O将地址为400OH的片外数据存储单元内容送入地址为300OH的片外数据存储单元中。将地址为080OH的程序存储单元内容送入地址为30H的片内数据存储单元中O将片内数据存储器中地址为30H与40H的单元内容交换。将片内数据存储器中地址为30H单元的低4位与高4位交换。(1) ORG0000HMOVDPTR,#400OHMOVXAMPTRMOV30H,AEND(2) ORG0000HMOVDPTR,#4000HMOVXA,DPTRMOVDPTR,#3000HMOVXDPTR,AEND(3) ORG
7、0000HMOVDPTR,tt0800HMOVA,#00HMOVCA,A+DPTRMOV30H,AEND(4) ORG0000HMOVA,30HXCHA,40HMOV30H,AEND(5) ORG0000HMOVA,30HSWAPAMOV30H,AEND7 .将30H,31H存储单元中的十进制数与38H,39H存储单元中的十进制数进行十进制加法运算,其和送入40H,41H存储单元中。ttinc1ude片内寄存器定义#inc1ude/*mainC*/voidmain(void)unsignedintsum;sum=DBYTE0x30+DBYTE0x38;if(sumxf)fegt;0x9)sum
8、+=0x06;个位十进制调整if(sum>:0x99)sum+=0x60;/十位十进制调整DBYTE0x40=SUm;/和低位字节DBYTE0x41=(sum>>8)+DBYTE0x31+DBYTE0x39;和高位字节if(DBYTE0x410x09)DBYTE0x41+=0x06;百位十进制调整WhiIe(1);/*程序在此死循环*/)8 .将片外数据存储器的260OH存储单元与261OH存储单元中的数据分别进行十六进制加法、十进制加法运算,其和送入262OH单元中,请写出完成上述要求的指令。伪指令:1. 1DA2600H将260OH存储单元的数据加载到累加器2. ADDA2
9、6IOH;将261OH存储单元的数据加到累加器上3. STA2620H;将累加器中的结果存储到262OH存储单元中指令示例:1. 1DAA2600H;将260OH存储单元的数据加载到累加器2. ADCA26IOH;将261OH存储单元的数据加到累加器上3. STAA2620H;将累加器中的结果存储到262OH存储单元中9.已知:(30H)=55H,(3IH)=OAAH,分别写出完成下列要求的指令,并写出32H存储单元的内容。(1) (30H)(31H)(32H)o(2) (30H)V(31H)(32H)o(3) (30H)+(31H)(32H)o(1) (3OH)&(31H)f(32H);DB
10、YTE0x32=DBYTE0x30&DBYTE0x31;0x00(2) (30H)I(31H)f(32H);DBYTE0x32=DBYTE0x30DBYTE0x31;0xff(3)(30H)C(31H)f(32H);DBYTE0x32=DBYTE0x30DBYTE0x31;0xff10 .什么指令可以改变程序计数器PC的值?1 .分支指令:分支指令可以根据条件改变PC的值,使程序跳转到不同的代码块。常见的分支指令有条件跳转指令(如if语句)和无条件跳转指令(如goto语句)。2 .跳转指令:跳转指令可以直接修改PC的值,使程序无条件地跳转到指定的地址。3 .子程序调用指令:子程序调用指令将当前
11、PC的值保存在栈中,然后将PC设置为子程序的起始地址。当子程序执行完毕后,PC会被还原为之前保存的值,使程序继续执行。4 .中断指令:中断指令可以改变PC的值,使程序跳转到断处理程序。中断指令通常由外部事件触发,例如硬件设备的状态改变或者系统调用。11 .当8051单片机没有外扩RAM时,将永远不会用到什么指令?为什么?当8051单片机没有外扩RAM时,将永远不会用到访问外部数据存储器(DSEG)的指令。这是因为8051单片机的内部RAM被划分为两个部分:数据存储器(DSEG)和片内数据存储器(ISEG)。数据存储器(DSEG)用于存储外设的数据和程序中的可变数据,而片内数据存储器(ISEG)
12、用于存储程序的指令和只读数据。外扩RAM是用于扩展数据存储器(DSEG)的一种方式。当8051单片机没有外扩RAM时,没有可用的外部数据存储器(DSEG),因此无法访问外部数据存储器。因此,涉及外部数据存储器(DSEG)的指令将永远不会被使用。这些指令包括MOVX指令用于读写外扩RAM中的数据和相关的地址寻址指令。12 .在MCS-51单片机指令系统中,没有不带借位标志的减法指令,那么如何实现不带借位的减法指令呢?在MCS-51单片机指令系统中,确实没有专门的不带借位标志的减法指令。但是,你仍然可以通过其他方式实现不带借位的减法操作。一种常见的做法是使用补码来实现减法。下面是一个基本的步骤:1 .将被减数和减数转换为补码形式。-被减数的补码表示可以通过直接将其二进制表示取反,然后加1来得到。-减数的补码表示是它的负数的二进制表示。2 .将两补码相加(使用加法指令)。3 .忽略最高位的进位。如果最高位的进位为1,表示结果为负数;否则为正数。4 .将得到的和的补码形式转换为原码,即得到减法的结果。需要注意的是,虽然这种方法可以实现不带借位的减法操作,但在实际的程序设计中,我们通常会使用其他更高级的编程语言和算法来处理减法运算,以提高效率和代码可读性。