第三章汇编语言程序设计例题习题
第三章 汇编语言程序设计习题
1.“SJMP 08H”的寻址方式是【  】。
A。变址寻址  B。相对寻址  C。寄存器间接寻址  D。
2.判断下列指令的正误:5、6、8、9错
MOV 29H,R7              MOV  25H,P1      MOV 56H,#70H          MOV  34H,28H      MOV  R3,R7            MOV  @R3,R7      MOV  R3,#D2H            MOV  #34H,28H      MOV  A,#280H            MOV  P3,P1
位寻址
2、MCS-51的转移指令LJMP、AJMP和SJMP有何区别?如何选用? 
①转移范围不同:LJMP、AJMP和SJMP转移范围分别为:64K、2K、-128--+127
②SJMP转移指令后为相对的偏移量,更灵活
4.MCS-51单片机的时钟周期与振荡周期之间有什么关系 一个机器周期的时序如何划分  答:时钟周期是单片机最基本的时间单位.机器周期则是完成某一个规定操作所需的时间.一个机器周期为6个时钟周期,共12个振荡周期性,依次表示为S1P1,S1P2,……S6P1,S6P2. 
5.8051单片机指令系统中有长跳转LJMP,长调用LCALL指令,为何还没有设置了绝对跳转AJMP,绝对调用ACALL指令?在实际使用是应怎样考虑?
解: 在实际应用中,可从寻址范围和指令长度两个方面来选择长跳转指令LJMP和短跳转指令AJMP、长调用指令LCALL和短调用指令ACALL。
长跳转LJMP在64KB范围内转移,而短跳转AJMP只能在2KB空间转移。长调用LCALL调用位于64KB程序空间的子程序,而短调用ACALL调用位于2KB程序空间范围的子程序。AJMP、ACALL指令代码长度为2个字节;LJMP、LCALL指令代码长度为3个字节。 
6.MCS-51单片机指令系统中,没有停机指令,通常用短转移指令SJMP $ ($为本条指令的首地址)来实现动态停机的操作,试分析这条停机指令的原理。已知SJMP  rel 的指令码为80r
el ? 解:rel=(源地址与目的地址差的绝对值)-2 ?
本条指令的首地址 As=$,转移的目的地址是本条指令地址,即Ad=$ 该指令为两字节,即Bn=2, ? rel= (Ad-As-Bn)补= ($-$-2)补=(-2)补=FEH ?      所以SJMP $指令的机器码是80FEH。
7.编写一程序将片外数据存储器中7000H~70FFH单元全部清零. ORG 1000H
MOV DPTR,#7000H CLR A MOV R0,A
LOOP:MOVX @DPTR,A
DJNZ R0,LOOP SJMP $
8.设内部数据存储器的60H、61H中连续存放着四个BCD数A0、A1、A2、A3,编程将其倒序排列
60H      61H                  60H      61H  A0A1  A2A3                    A3A2  A1A0  解:  MOV R0,#60H        MOV R1,#61H        MOV A,@R0        SWAP A        XCH A,@R1        SWAP A
MOV @R0,A
9. 设单片机的晶振频率fosc=6MHZ,延时程序如下:
机器周期数
DELAY: MOV  R1,#100    1  LOOP:  MOV  R3,#200      1          DJNZ  R3,$        2          DJNZ  R1,LOOP    2          RET                2
计算该段延时程序的延时时间(要有计算过程) 答:(1+(1+2*200+2)*100+2)*12/6MHz = (1+(1+2*200+2)*100+2)*2us = 8.0606ms
9. 已知fosc=6MHZ,求下面延时子程序的延时时间。
(5分)
DELAY: MOV R6,#10  ;  D1:  MOV R7,#250H ;  D2:  DJNZ R7,D2 ;  DJNZ R6,D1 ;    RET    ; 解:
((2*592+2+1)*10+2+1)*1 = 11873uS=11.873MS 9.设8031使用12MHz晶振,试设计延迟100ms的延时程序。
解:延时程序的延迟时间就是该程序的执行时间,通常采用MOV 和DJNZ二指令。
T = 12/fosc = 12 /(12×106)= 1us              ORG      1000H
DELAY: MOV      R2,#CTS        ;T = 1us    LOOPS: MOV      B,#CTR        ;T = 1us      LOOPR: DJNZ      B,LOOPR      ;2T = 2us              DJNZ      R2,LOOPS      ;2T = 2us                END 
内循环延时: (1+2×CTR)T = 500us(假设)
则CTR = 250      实际延时:[1+2×250]×1us = 501us  外循环延时:T+(501+2T)× CTS = 100ms = 100 000us    所以 , CTS = 198.8  取 199      实际延时:[1+(501+2)×199] = 1000.98ms
9.设单片机的晶振频率fosc=12MHZ,编写延时50ms程序  DEL:  MOV  R7,  #200    DEL1: MOV  R6,  #125
单片机编程100例详解
DEL2: DJNZ  R6,  DEL2  ;125*2=250us
DJNZ  R7,  DEL1 ; 0.25ms*200=50ms                RET
使用12MHz晶振时,一个机器周期为1us, 执行DJNZ指令为2us,加其他指令的时间(250+1+2)*200+1=50.301ms
10. 用查表法编一子程序,将R3中的BCD码转换成ASCII码.
解  MAIN:  MOV      A,R3          ;待转换的数送A                    MOV      DPTR,#TAR    ;表首地址送DPTR                    MOVC    A,@A+DPTR  ;查ASCII码表                    MOV      R3,A          ;查表结果送R3                    RET
TAR    DB        30H,31H,32H,33H,34H                    DB        35H,36H,37H,38H,39H 
11.片内RAM40H开始的单元内有10B二进制数,编程出其中最大值并存于50H单元中.
解  START: MOV    R0,#40H      ;数据块首地址送R0                MOV    R7,#09H      ;比较次数送R7        MOV    A,@R0        ;取数送A    LOOP:  INC      R0 
MOV    30H,@R0      ;取数送30H              CJNE    A,30H,NEHT  ;(A)与(30H)相比      NEXT:  JNC      BIE1          (A)≥(30H)转BIR1                MOV    A,30H        ;(A)<(30H),大数送A