ORG 0000HMAIN:MOV TMOD,320HMOV TH1,#0F4HMOV TL1,#0F4HSETB TR1MOV R0,#50HMOV R7,#10HMOV SCON,#0D0HMOV PCON,#00HWAIT:JBC RI,PR1SJMP WAITPR1:MOV A,SBUFJNB P,PNPJNB RB8,PERSJMP REGHTPNP:JB RB8,PERRIGHT:MOV @R0,AINC R0DJNZ R7,WAITCLR PSW.5SJMP PER:SETB PSW.5SJMP ENDPOP PSWRETIEXIT: AJMP MAINEND习题与思考题33-1 什么是寻址方式[1]?MCS-51指令系统有哪些寻址方式?相应的寻址[2]空间在何处?答:在指令系统中,操作数[3]是一个重要的组成部分,它指定了参与运算的数据或数据所在的地址单元。如何找到参与运算的这个数据或数据所在的地址就称为寻址方式。MCS-51 指令系统的寻址方式主要有立即寻址、直接寻址、寄存器[4]寻址、寄存器间接寻址、基址加变址[5]寻址、相对寻址[6]和位寻址等七种。对程序存储器[7]只能采用立即寻址和基址加变址寻址方式;对特殊功能寄存器只能采用直接寻址方式,不能采用寄存器间接寻址[8],对 8032/8052 等单片机内部 RAM 的高 128 个字节(80H~FFH),只能采用寄存器间接寻址,不能使用直接寻址方式;对位操作指令只能对位寻址区操作;外部扩展的数据存储器只能用MOVX指令访问, 而内部RAM的低128个字节(00H~7FH)既能用直接寻址,也能用间接寻址。3-2 访问内部RAM单元可以采用哪些寻址方式?访问外部RAM单元可以采用哪些寻址方式?访问特殊功能寄存器(SFR)可以采用哪些寻址方式?答:对特殊功能寄存器只能采用直接寻址方式,单片机内部RAM的高128个字节 (80H~FFH) ,只能采用寄存器间接寻址,外部扩展的数据存储器只能用MOVX指令访问,而内部RAM的低128个字节(00H~7FH)既能用直接寻址,也能用间接寻址。3-3 访问外部数据存储器和程序存储器可以用哪些指令来实现?举例说明。答:访问外部数据存储器可以用以下指令实现:MOVX A, @Ri ;((Ri))→A,寄存器Ri指向的片外RAM地址中的内容送到累加器[9]A中MOVX @Ri, A ;A→((Ri)),累加器中内容送到寄存器Ri指向的片外RAM地址中MOVX A, @DPTR ; ((DPTR))→A, 数据指针指向的片外RAM地址中的内容送到累加器 A中MOVX @DPTR, A ; A→((DPTR)), 累加器中内容送到数据指针指向的片外RAM地址中访问程序存储器可以用以下指令实现:MOVC A, @A+DPTR ;((A+DPTR))→A,表格地址单元中的内容送到累加器A中MOVC A, @A+PC ;PC+1→PC,((A+PC))→A,表格地址单元中的内容送到累加器A中3-4 试用下列3种寻址方式编程,将立即数0FH送入内部RAM的30H单元中。(1) 立即寻址方式;(2) 寄存器寻址方式;(3) 寄存器间接寻址方式答: (1)立即寻址方式: MOV 30H, #0FH(2)寄存器寻址方式: MOV R5, #0FHMOV 30H, R5(3)寄存器间接寻址方式:MOV @R1, #0FHMOV 30H, @R13-5 SJMP 指令和 AJMP 指令都是字节转移指令,它们有什么区别?各自的转移范围是多 少?能否用AJMP指令代替程序中的所有SJMP指令?为什么?答:AJMP和SJMP的区别有:(1) 跳转范围不同。A. JMP addr1 ;短跳转范围:2KB B. SJMP rel ;相对跳转范围:-128~+127 C. (2) 指令长度不同。 D. JMP、LJMP后跟的是绝对地址[10],而SJMP后跟的是相对地址[11]。 E. JMP 指令代替程序中的 SJMP 指令,因为如果改变的话,程序跳转到的新 PC F. 值指向的地址会不同,导致程序出现错误。 G. 3-6 加法和减法指令影响哪些标志位?怎么影响的? y,最终要将A中的值和其后面的值以及进位 y中的值相加,最终结果存在A。 的内容与第二操作数及进位标志相减,结果送回到 中。在执行减法过程中,如果位7(D7)有借位,则进位标志Cy置“1”,否则 3)有借位,则辅助进位标志AC置“1”,否则清“0”;如位6有借位 OV 置“1”,否则清“0”。 y清“0”。 3-7 写出实现下列要求的指令或程序片段。 R0的内容传送到R1; RAM的20H单元内容传送到寄存器R1; RAM的20H单元的D7和D3位清零,其它位保持不变; RAM的1000H单元内容传送到内部RAM的60H单元中; RAM的1000H单元内容传送到寄存器R2; (6) 清除累加器高4位。 MOV A, R0 MOV R1, A MOV R1, 20H MOV A, 20H NL A, #77H MOV DPTR, #1000H MOVX A, @DPTR MOV 60H, A MOV DPTR, #1000H MOVX A, @DPTR MOV R2, A NL A, #0FH H、 3lH单元内容传送到外部数据存储器1000H、 H单元中。 MOV A, 30H MOV DPTR, #1000H MOV @DPTR, A MOV A, 31H
ORG 0000H
MAIN:MOV TMOD,320H
MOV TH1,#0F4H
MOV TL1,#0F4H
SETB TR1
MOV R0,#50H
MOV R7,#10H
MOV SCON,#0D0H
MOV PCON,#00H
WAIT:JBC RI,PR1
SJMP WAIT
PR1:MOV A,SBUF
JNB P,PNP
JNB RB8,PER
SJMP REGHT
PNP:JB RB8,PER
RIGHT:MOV @R0,A
INC R0
DJNZ R7,WAIT
CLR PSW.5
SJMP $
PER:SETB PSW.5
SJMP $
END
POP PSW
RETI
EXIT: AJMP MAIN
END
习题与思考题3
3-1 什么是寻址方式[1]?MCS-51指令系统有哪些寻址方式?相应的寻址[2]空间在何处?
答:在指令系统中,操作数[3]是一个重要的组成部分,它指定了参与运算的数据或数据所在的
地址单元。如何找到参与运算的这个数据或数据所在的地址就称为寻址方式。
MCS-51 指令系统的寻址方式主要有立即寻址、直接寻址、寄存器[4]寻址、寄存器间接寻
址、基址加变址[5]寻址、相对寻址[6]和位寻址等七种。
对程序存储器[7]只能采用立即寻址和基址加变址寻址方式;对特殊功能寄存器只能采用直
接寻址方式,不能采用寄存器间接寻址[8],对 8032/8052 等单片机内部 RAM 的高 128 个
字节(80H~FFH),只能采用寄存器间接寻址,不能使用直接寻址方式;对位操作指令
只能对位寻址区操作;外部扩展的数据存储器只能用MOVX指令访问, 而内部RAM的
低128个字节(00H~7FH)既能用直接寻址,也能用间接寻址。
3-2 访问内部RAM单元可以采用哪些寻址方式?访问外部RAM单元可以采用哪些寻址方
式?访问特殊功能寄存器(SFR)可以采用哪些寻址方式?
答:对特殊功能寄存器只能采用直接寻址方式,单片机内部RAM的高128个字节 (80H~FFH) ,只能采用寄存器间接寻址,外部扩展的数据存储器只能用MOVX指令访问,而内部RAM的低128个字节(00H~7FH)既能用直接寻址,也能用间接寻址。
3-3 访问外部数据存储器和程序存储器可以用哪些指令来实现?举例说明。
答:访问外部数据存储器可以用以下指令实现:
MOVX A, @Ri ;((Ri))→A,寄存器Ri指向的片外RAM地址中的内容送到累加器[9]A中
MOVX @Ri, A ;A→((Ri)),累加器中内容送到寄存器Ri指向的片外RAM地址中
MOVX A, @DPTR ; ((DPTR))→A, 数据指针指向的片外RAM地址中的内容送到累加器 A中
MOVX @DPTR, A ; A→((DPTR)), 累加器中内容送到数据指针指向的片外RAM地址中
访问程序存储器可以用以下指令实现:
MOVC A, @A+DPTR ;((A+DPTR))→A,表格地址单元中的内容送到累加器A中
MOVC A, @A+PC ;PC+1→PC,((A+PC))→A,表格地址单元中的内容送到累加器A中
3-4 试用下列3种寻址方式编程,将立即数0FH送入内部RAM的30H单元中。
(1) 立即寻址方式;(2) 寄存器寻址方式;(3) 寄存器间接寻址方式
答: (1)立即寻址方式: MOV 30H, #0FH
(2)寄存器寻址方式: MOV R5, #0FH
MOV 30H, R5
(3)寄存器间接寻址方式:MOV @R1, #0FH
MOV 30H, @R1
3-5 SJMP 指令和 AJMP 指令都是字节转移指令,它们有什么区别?各自的转移范围是多 少?能否用AJMP指令代替程序中的所有SJMP指令?为什么?
答:AJMP和SJMP的区别有:
(1) 跳转范围不同。
A. JMP addr1 ;短跳转范围:2KBB. SJMP rel ;相对跳转范围:-128~+127
C. (2) 指令长度不同。
D. JMP、LJMP后跟的是绝对地址[10],而SJMP后跟的是相对地址[11]。
E. JMP 指令代替程序中的 SJMP 指令,因为如果改变的话,程序跳转到的新 PC
F. 值指向的地址会不同,导致程序出现错误。
G. 3-6 加法和减法指令影响哪些标志位?怎么影响的?
y,最终要将A中的值和其后面的值以及进位
y中的值相加,最终结果存在A。
的内容与第二操作数及进位标志相减,结果送回到
中。在执行减法过程中,如果位7(D7)有借位,则进位标志Cy置“1”,否则
3)有借位,则辅助进位标志AC置“1”,否则清“0”;如位6有借位
OV 置“1”,否则清“0”。
y清“0”。
3-7 写出实现下列要求的指令或程序片段。
R0的内容传送到R1;
RAM的20H单元内容传送到寄存器R1;
RAM的20H单元的D7和D3位清零,其它位保持不变;
RAM的1000H单元内容传送到内部RAM的60H单元中;
RAM的1000H单元内容传送到寄存器R2;
(6) 清除累加器高4位。
MOV A, R0
MOV R1, A
MOV R1, 20H
MOV A, 20H
NL A, #77H
MOV DPTR, #1000H
MOVX A, @DPTR
MOV 60H, A
MOV DPTR, #1000H
MOVX A, @DPTR
MOV R2, A
NL A, #0FH
H、 3lH单元内容传送到外部数据存储器1000H、
H单元中。
MOV A, 30H
MOV DPTR, #1000H
MOV @DPTR, A
MOV A, 31H
题目解答
答案
) MOV A, 20H ANL A, #77H ( 4 ) MOV DPTR, #1000H MOVX A, @DPTR MOV 60H, A
解析
本次题目主要考察MCS-51单片机的指令系统、寻址方式、存储器访问及程序设计等知识,具体解析如下:
3-1 寻址方式的定义及MCS-51的寻址方式
寻址方式是指指令中如何找到操作数或操作数地址的方法。MCS-51指令系统有7种寻址方式,具体如下:
- 立即寻址:操作数直接在指令中(如
MOV A,#0FH),仅适用于程序存储器。 - 直接寻址:直接使用地址(如
MOV 30H,A),适用于内部RAM低128字节和SFR。 - 寄存器寻址:操作数在寄存器中(如
MOV A,R0),适用于通用寄存器R0~R7、A、B、CY等。 - 寄存器间接寻址:通过寄存器间接指向地址(如
MOV A,@R0),适用于内部RAM(R0/R1)和外部RAM(R0/R1/DPTR)。 - 基址加变址寻址:基址寄存器(PC/DPTR)+变址寄存器(A)(如
MOVC A,@A+DPTR),仅适用于程序存储器。 - 相对寻址:以PC当前值为基址,加上偏移量(如
SJMP rel),适用于转移指令。 - 位寻址:直接操作位地址(如
SETB P1.0),适用于内部RAM位寻址区(20H~2FH)和部分SFR。
3-2 不同存储器的寻址方式
- 内部RAM低128字节(00H~7FH):直接寻址、寄存器间接寻址(R0/R1)。
- 内部RAM高128字节(80H~FFH):仅寄存器间接寻址(R0/R1)。
- 特殊功能寄存器(SFR):仅直接寻址(如
MOV SCON,#0D0H)。 - 外部RAM:寄存器间接寻址(MOVX指令,R0/R1/DPTR)。
3-3 访问外部数据存储器和程序存储器的指令
- 外部数据存储器(MOVX指令):
MOVX A,@Ri:读取Ri指向的外部RAM到A。MOVX @Ri,A:写入A到Ri指向的外部RAM。:MOVX A,@DPTR`:读取DPTR指向的外部RAM到A(16位地址)。MOVMOVMOVX @DPTR,A:写入A到DPTR指向的外部RAM。
- 程序存储器(MOVC指令):
MOVC A,@A+DPTR:读取A+DPTR指向的程序存储器到A(全局查表)。MOVC A,@A+PC:读取A+PC+1指向的程序存储器到A(局部查表)。
3-4 立即数0FH送入内部RAM 30H的三种寻址方式
(1) 立即寻址:MOV 30H,#0FH(操作数直接为0FH)。
(2) 寄存器寻址:MOV R0,#0FH→MOV 30H,R0(通过寄存器R0中转)。
(3) 寄存器间接寻址:MOV R1,#30H→MOV @R1,#0FH(通过R1间接指向30H)。
3-5 SJMP与AJMP的区别
- 跳转范围:
SJMP rel:相对跳转,范围-128~+127B(256字节内)。AJMP addr11:绝对跳转,范围0~2KB(11位地址)。
- 指令长度:SJMP为2字节(1字节操作码+1字节偏移量),AJMP为2字节(1字节操作码+11位地址)。
- 能否替代:不能。SJMP的偏移量是相对当前PC的,AJMP是绝对地址跳转,若替换可能导致跳转地址错误。
3-6 加法和减法指令对标志位的影响
加法指令(ADD/ADDC)
- 进位标志Cy:D7位有进位时Cy=1,否则Cy=0。
- 辅助进位标志AC:D3位有进位时AC=1,否则AC=0。
- 溢出标志OV:D6位向D7位进位与D7位向Cy进位不同时,OV=1(溢出),否则OV=0。
- 奇偶标志P:累加器A中1的个数为奇数时P=1,否则P=0。
减法指令(SUBB)
- 进位标志Cy:D7位有借位时Cy=1(借位),否则Cy=0。
- 辅助进位标志AC:D3位有借位时AC=1,否则AC=0。
- 溢出标志OV:D6位向D7位借位与D7位向Cy借位不同时,OV=1(溢出),否则OV=0。
- 奇偶标志P:累加器A中1的个数为奇数时P=1,否则P=0。
3-7 程序片段设计
(1) R0内容传R1:MOV A,R0→MOV R1,A(或直接MOV R1,R0,MCS-51支持寄存器间直接传送)。
(2) 内部RAM 20H传R1:MOV R1,20H(直接寻址)。
(3) 20H单元D7和D3位清零:MOV A,20H→ANL A,#77H(77H=01110111B,屏蔽D7和D3)→MOV 20H,A。
(4) 外部RAM 1000H传内部RAM 60H:MOV DPTR,#1000H→MOVX A,@DPTR→MOV 60H,A。
(5) 外部RAM 1000H传R2:MOV DPTR,#1000H→MOVX A,@DPTR→MOV R2,A。
(6) 清除累加器高4位:ANL A,#0FH(0FH=00001111B,保留低4位,高4位清零)。
(7) 30H、31H传外部RAM 1000H、1001H:
MOV A,30H→MOV DPTR,#1000H→MOVX @DPTR,A;
MOV A,31H→INC DPTR→MOVX @DPTR,A。