单片机基础学习知识原理与运用第三章规范标准答案.doc
,. 第三章 单片机的汇编语言与程序设计习题1. 设内部RAM中59H单元的内容为50H,写出当执行下列程序段后寄存器A,R0和内部RAM中50H,51H单元的内容为何值? MOV A,59H MOV R0,A MOV A,#00H MOV R0,A MOV A,#25H MOV 51H,A MOV 52H,#70H解: MOV A,59H ; A=50H MOV R0,A ; RO=50H MOV A,#00H ; A=00H MOV R0,A ; 50H=00H MOV A,#25H ; A=25H MOV 51H,A ; 51H=25H MOV 52H,#70H ; 52H=70H 所以:A=25H R0=50H ; 50H=00H 51H=25H2. 请选用合适的指令对P0口内容做修改(例如使P0.0P0.3不变,P0.4P0.7为0)。解: MOV A,P0 ANL A,0fh Mov P0,A3. 试问外部数据存储器和程序存储器可以用哪些指令来实现?举例说明。解:访问外部数据存储器指令有:MOVX DPTR,A MOVX DPTR,#0100H MOV DPTR,AMOVX A,DPTR MOVX DPTR,#0200H MOV A,DPTRMOVX A,Ri MOVX A,R0MOVX Ri,A MOVX RI,A访问程序存储器指令有:MOVX A,A+PCMOVX A,A+DPTR4. 设堆栈指针SP中的内容为60H,内部RAM中30H和31H单元的内容分别为24H和10H,执行下列程序段后,61H,62H,30H,31H,DPTR及SP中的内容将有何变化? PUSH 30H PUSH 31H POP DPL POP DPH MOV 30H,#00H MOV 31H,#0FFH解:PUSH 30H ;61H=24H PUSH 31H ;62=10H SP=62H POP DPL ;DPL=10H POP DPH ;DPH=24H SP=60H MOV 30H,#00H ;30H=00H MOV 31H,#0FFH ;31H=0FFH5. 设(A)=40H,(R1)=23H,(40H)=05H。执行下列两条指令后,累加器A和R1以及内部RAM中40H单元的内容各位何值? XCH A,R1 XCHD A,R1解: XCH A,R1 ;A=23H R1=40H XCHD A,R1 ;A=25H 40H=03H6. 两个四位BCD码数相加,被加数和加数分别存于50H,51H和52H,53H单元中(次序为千位、百位在低地址中),和数存在54H,55H和56H中(56H用来存放最高位的进位,试编写加法程序)解: ORG 0000H LJMP START ORG 0100HSTART: MOV A,53H ADD A,51H DA A MOV 55H,A MOV A,52H ADDC A,50H DA A MOV 56H,C SJMP $ END7.设(A)=01010101B,(R5)=10101010B,分别写出执行ANL A,R5;ORL A,R5:XRL A,R5指令后结果。解: ANL A,R5 ; 00000000B ORL A,R5 ; 11111111B XRL A,R5 ; 111111118.设指令SJMPrel=7EH,并假设该指令存放在2114H和2115H单元中。当该指令执行后,程序将跳转到何地址?解:2116H+60H=2176H9.简述转移指令AJMP addr11,SJMP rel,LJMP addr16及JMP A+DRTR的应用场合。解:AJMP addr11为2K字节范围内的无条件转跳指令,把程序的执行转移到指定的地址。SJMP rel是无条件转跳指令,执行时在PC加2后,把指令中补码形式的偏移量加到PC上,并计算出转向目标地址。转向的目标地址可以在这条指令前128字节到后127字节之间LJMP addr16执行这条指令时把指令的第二字节和第三字节分别装入PC的高位和地位字节中无条件地转向指定地址。转移目标地址可以在64K程序存储器地址空间的任何地方,不影响任何标志。JMP A+DRTR指令的功能是把累加器中8位无符号数与数据指针DRTR中的16位数相加,将结果作为下条指令地址送入PC,利用这条指令能实现程序的散转。10.试分析下列程序段,当程序执行后,位地址00H,01H中的内容将为何值?P1口的8条I/O线为何状态?CLR CMOV A,#66HJC LOOP1 CPL C SETB 01HLOOP: ORL C,ACC.0 JB ACC.2,LOOP2 CLR 00HLOOP2: MOV P1,A解: CLR C ;CY=0MOV A,#66H ;A=66HJC LOOP1 CPL C ;CY=1 SETB 01H ;20H.1=1LOOP: ORL C,ACC.0 ;CY=1 JB ACC.2,LOOP2 ; CLR 00HLOOP2: MOV P1,A ;P1=01100110BSJMP $20H.0=0 20H.1=1 P1=66H11.的特查指令表,写出下列两条指令的机器码,并比较一下机器码中操作数排列次序点。MOV 78H,80HMOV 78H,#80H解:直接寻址单元传送到直接寻址单元的机器码是第二个操作数在前,而立即数传送到直接地址单元是第一个操作数在前,次序正好相反。12.手工汇编下列程序段 ORG 873BHAAA EQU 851AHQQQ MOV A,35H CLR C SUBB A,#0AH JC QQ16 MOV A,36H SUBB A,#0AH JC QQ15 AJMP AAAQQ15: MOV 35H,#00HQQ16: JNB 02H,QQ17 MOV R6,39H DEC R6 SJMP QQ18QQ17: MOV R6,39H INC 39HQQ18: CLR 05H LJMP 8500H END13.若有两个无符号数x,y分别存放于内部存储器50H,51H单元中,试编写一个程序实现x*10+y,结果存入52H,53H两个单元中。解: ORG 0000HSJMP STARTORG 0030HSTART :MOV A,50HMOV B,#10MUL AB ;(50H)10积的高、低字节分别在B、A中ADD A,51HMOV 53H,A ;积的低字节加(51H)其和存放在53H中MOV A,#00HADDC A,BMOV 52H,A ;积的高字节加进位位存放在52H中。SJMP $END14从内部存储器20H单元开始,有30个数据。试编一个程序,把其中的正数,负数分别送51H和71H开始的存储单元,并分别记下正数负数的个数送50H和70H单元。解: ORG 0000HSJMP STARTORG 0030HSTART: MOV 1EH,#51H ;正数存放首地址51H存于1EH单元MOV 1FH,#71H ;负数存放首地址71H存于1EH单元MOV R0,#20H ;建立取数(源操作数)的地址指针MOV R2,#30 ;预置数据长度MOV 50H,#00H ;正数个数统计单元清零MOV 70H,#00H ;负数个数统计单元清零LOOP:MOV A,R0 ;取数JB ACC.7,NEG ;是负数转NEG处理POST:MOV R1,1EH ;是正数,将暂存的地址送R1(间址寄存器)MOV R1,A ;将正数入存INC 50H ;正数个数加1INC 1EH ;正数暂存地址加1修正LOOP1: INC R0 ;取数地址加1修正DJNZ R2,LOOP ;计数长度减1,不等于零,继续循环统计SJMP $ ;结束NEG: MOV R1,1FH ;是负数,将暂存的地址送R1(间址寄存器) MOV R1,A ;将正数入存INC 70H ;负数个数加1INC 1FH ;负数暂存地址加1修正SJMP LOOP1 ;转取数地址修正15内部存储单元40H中有一个ASCII码字符,试编一程序,给该数的最高位加上奇检验。解: ORG 0000H SJMP STARTORG 0030HSTART: MOV A,40H ;取数给ACLR ACC.7 ;A最高位(奇偶校验位)清零JB P, LOOP ;40H中的ASCII码原来就是奇数个1(最高位给零)SETB ACC.7 ;40H中的ACSII码原来是偶数个1,最高位置1 LOOP:MOV 40H,A ;入存 SJMP $ ;结束 END16.编写一段程序,将存放在自DATA单元开始的一个四字节数(高位在前)取补后送回原单元。解:若DATA在内部数据存储器中(假如存放在30H起始的4个单元中);采用求反加1的算法;ORG 000HSJMP STARTORG 0030HSTART: SETB C ;置进位位为1MOV R2,#04H ;预置计数长度MOV R0,#DATA1+3 ;取数指针指向低字节的地址LOOP: MOV A,R0 ;取数CPL A ;求反ADDC A,#00H ;加进位MOV R0,A ;入存DEC R0 ;地址指针修正DJNZ R2,LOOP ;4字节未处理完,继续循环处理SJMP $ ;结束DATA1 EQU 30H;END17.以BUF1为起始地址的外存储区中,存放有16个单字节无符号二进制数,是编一程序,求其平均值并送BUF2单元。解:设R2、R3存放和,将其除以16(R2、R3联合左移4位)即为平均置值(单字节存放)ORG 0000HSJMP STARTORG 0030HSTART: MOV R2,#00H ;和高字节清零MOV R3,#00H ;和低字节清零MOV DPTR,#DATA1 ;建立外部数据存储器的地址指针MOV R4,#10H ;预置计数长度LOOP: MOVX A,DPTR ;从外部数据存储器取数ADD A ,R3MOV R3,AMOV A,R2;ADDC A,#00H;MOV R2,A ;累加INC DPTR ;地址指针修正DJNZ R4,LOOP ;16字节未累加完,继续循环累加MOV R4,#04H ;R2、R3联合移位4次(除以16)LOOP1: CLR CMOV A,R2RRC AMOV R3,ADJNZ R4,LOOP1 ;平均值存放于R3中SJMP $ ;结束DATA1 EQU 1000H;END18.在DATA1单元中有一个带符号8位二位进制数x。编一程序,按以下关系计算y值,送DATA2单元。y =x+5,x0y=x,x=0y=x-5,x0解:设DATA1、DATA2为内部数据存储器的二个单元(假设为30H、31H)且y的值单字节不会产生溢除出ORG 000HSJMP STARTORG 0030HSTART: MOV A,30H ;取数X给AJZ ZERO ;若X=0,则Y=0,转入存JB ACC.7,NEG ;若X0,则X=5,入存SJMP ZERO;NEG: CLR C;SUBB A,#05H;ZERO: MOV 31H,A ;结果入存SJMP $END19.设内部RAM中30H和31H单元中有两个带符号数,求出其中的大数存放在32H单元中。解:若两数同号,则值大的数大;两数异号,正数值大ORG 000HSJMP STARTORG 0030HSTART: MOV A,30HXRL A,31H ;两数异或JB ACC.7,YIHAO ;两数异号TONGHAO: CLR C ;两数同号MOV A,30HSUBB A,31HJC LOOP1-2LOOP0: MOV A,30H ;同号被减数大,值大LOOED: MOV 32H, ASJMP $LOOP1: MOV A,31H ;异号被减数大,值小SJMP ED;YIHAO: MOV A,30H ;异号,哪个正,其值大JNB ACC.7,LOOP0SJMP LOOP1END20.利用逻辑控制的方法,设计一个主程序,在第1,3,5,6次调出SB1子程序,第2,4,7,8次调用SB2程序。解: ORG 000HSJMP TESTORG 0030HTEST: MOV R2,#08HMOV A,#10101100BLOOP: RLC AJC LOOP1 LCALL SB1SJMP RELTLOOP1: LCALL SB2RELT: DJNZ R2,LOOPSJMP $PRGO : RETPRG1: RETEND21.将DATA单元存放的以ASCII码表示的16进制数转换成十进制数存放于DATA+1单元。解:先将DATA的ASCII码转换成十六进制的数,再转换成十进制数。数字的ASCII码转成十六进制数(即为十进制数)采用减30H字母的ASCII码转成十六进制数采用减37H,十六进制再转十进制可采用先减0AH,再加10H;这样-37H-0AH+10H=-31H,可采用直接减31H。数字与字母的ASCII的区别,可采用对D6的检测D6=1为字母的ASCII码,反之为数字的ASCII码。ORG 000HSJMP TESTORG 0030HTEST: MOV R0,#DATA1MOV A,R0 ;将DATA1的数给ACLR C;LOOP: JB ACC.6,LOOP1 ;是字母,转LOOP1SUBB A,#30H ;是数字减30HED: MOV DATA+1,A ;入存SJMP $ ;结束LOOP1:SUBB A,#31H ;是字母减31HSJMP ED;DATA1 EQU 30HEND22.编一个将十六进制数转换成十进制数的子程序。解:一个单字节的十六进制数转成十进制数一般考虑用二字节BCD码来存放。设转换后的数存放在R3(高)、R4(低)中。ORG 000HSJMP TESTORG 0030HTEST: MOV DPTR,#TAB ;建立表头地址MOV A,30HANL A,#0F0HSWAP A ;高半字节分离ADD A,0E0H ;高半字节数乘2MOV B,A ;暂存MOVC A,A+DPTR;MOV R3,A ;取转换后的高半字节存R3INC DPTR;MOV A,B;MOVC A,A+DPTR;MOV R4,A ;取转换后的低半字节存R4MOV A,30H;ANL A,#0FH;ADD A,R4;DA A;MOV R4,A ;加原数的低半字节(DA A)MOV A,R3;ADDC A,#00H;DA A;MOV R3,A;RET;TAB:DB 00H,00H,00H,16H,00H,32H,00H,48H,00H,64HDB 00H,80H,00H,96H,01H,12H,01H,28H,01H,44HDB 01H,60H,01H,76H,01H,92H,02H,08H,02H,24HDB 02H,40H,02H,40H,02H,56HEND23.编一程序,将存储区DATA1单元开始的20个单字节数据依次与DATA2单元为起始地址的20个单字节数据进行交换。解:设DATA1、DATA2分别为内部RAM30H和50H单元。ORG 0000HSJMP STARTORG 0030HSTART: MOV R0,#30H ;建立源地址指针MOV R1,#50H ;建立目标地址指针MOV R6,#20 ;置计数长度LOOP: MOV A,R0 ;取源地址数据XCH A,R1 MOV R0,A ;源地址数据与目标地址数据交换INC R0 ;源地址指针修正INC R1 ;目标地址指针修正DJNZ R6,LOOP ;计数长度减1,不等于0继续循环RET END24试编写一程序,将存储区DATA1单元开始的50个单字节逐一移至DATA2单元开始的存储区中。解:START:MOV R0,#DATA1 ;建立源操作数地址指针 MOV R1,#DATA2 ;建立目标操作数地址指针MOV R6,#50 ;置计数长度LOOP: MOV A,R0 MOV R0,A INC R0 INC R1 DJNZ R6,LOOP RET END25试编写一采用查表法求120的平方数子程序(要求:x在累加器A中,1x20,平方数高位存放在R6,低位在R7)解:为了方便起见,每一数的平方在表中统一用双字节来存放,这样只要把数乘以2加表头地址,就可以找到平方数的高字节存放的地址,连续取两个字节即可 ORG 0000HSJMP STARTORG 0030HSTART: MOV DPTR,#TAB ;建立源地址指针DEC AMOV B,AADD A,BMOV B,ALOOP: MOVC A,A+DPTRMOV R5,AINC DPTRMOV A,BMOVC A,A+DPTRMOV R6,ARET TAB: DB00H,00H,00H,01H,00H,04H,00H,09H,00H,16H;平方数用BCD表示(也可用DB 00H,25H,00H,36H,00H,49H,00H,64H,00H,81H;十六进制表示)DB 01H,00H,01H,21H,01H,44H,01H,69H,01H,96HDB 02H,25H,02H,56H,02H,89H,03H,24H,03H,61H,04H,00HEND 若平方表从0的平方存放,把程序中红色的DEC A指令去掉,若表从1的平方存放,则将DEC A指令加上。26试编写一个三字节无符号数乘法程序。解: OGR 0000H MOV R0,#5CHMUL1: MOV A,5AH MOV B58H MUL ABMOV R0,A MOV R3,B MOV A,5BH MOV B,5BH MUL AB ADD A,R3 MOV R3,A MOV A,BADD A,R2MOV R2,AMOV R1,#AJNC LASTINC R1LAST: MOV A,5BH MOV B,29H MUL AB ADD A,R2 INC R0 MOV R0,A MOV A,B ADDC A,RI INC R0 MOV R0,A MOV R5,#04HMOV R1,#10HLOOP: MOV A,R0 MOV R1,A INC R0INC R1 BINBCD: MOV R1,#48H MOV R2,#04H INC R2 CLR A BB0: MOV R1,A INC R1 DJNZ R2,BB0 MOV A,#04H MOV B,#8 MUL AB MOV R3,ABB3: MOV R0,#10H MOV R2,#04H CLR CBB1: MOV A,R0 RLC A MOV R0,A INC R0 DJNZ R2,BB1 MOV R2,#04HINC R2MOV R1,#48HBB2: MOV A,R1 ADDC A,R1 DA A MOV R1,A INC R1 DJZN R2,BB2 DJZN R3,BB3 SJMP $
收藏
- 资源描述:
-
,.
第三章 单片机的汇编语言与程序设计习题
1. 设内部RAM中59H单元的内容为50H,写出当执行下列程序段后寄存器A,R0和内部RAM中50H,51H单元的内容为何值?
MOV A,59H
MOV R0,A
MOV A,#00H
MOV @R0,A
MOV A,#25H
MOV 51H,A
MOV 52H,#70H
解: MOV A,59H ; A=50H
MOV R0,A ; RO=50H
MOV A,#00H ; A=00H
MOV @R0,A ; 50H=00H
MOV A,#25H ; A=25H
MOV 51H,A ; 51H=25H
MOV 52H,#70H ; 52H=70H
所以:A=25H R0=50H ; 50H=00H 51H=25H
2. 请选用合适的指令对P0口内容做修改(例如使P0.0~P0.3不变,P0.4~P0.7为0)。
解: MOV A,P0
ANL A,0fh
Mov P0,A
3. 试问外部数据存储器和程序存储器可以用哪些指令来实现?举例说明。
解:访问外部数据存储器指令有:
MOVX @DPTR,A MOVX DPTR,#0100H MOV @DPTR,A
MOVX A,@DPTR MOVX DPTR,#0200H MOV A,@DPTR
MOVX A,@Ri MOVX A,@R0
MOVX @Ri,A MOVX @RI,A
访问程序存储器指令有:
MOVX A,@A+PC
MOVX A,@A+DPTR
4. 设堆栈指针SP中的内容为60H,内部RAM中30H和31H单元的内容分别为24H和10H,执行下列程序段后,61H,62H,30H,31H,DPTR及SP中的内容将有何变化?
PUSH 30H
PUSH 31H
POP DPL
POP DPH
MOV 30H,#00H
MOV 31H,#0FFH
解:PUSH 30H ;61H=24H
PUSH 31H ;62=10H SP=62H
POP DPL ;DPL=10H
POP DPH ;DPH=24H SP=60H
MOV 30H,#00H ;30H=00H
MOV 31H,#0FFH ;31H=0FFH
5. 设(A)=40H,(R1)=23H,(40H)=05H。执行下列两条指令后,累加器A和R1以及内部RAM中40H单元的内容各位何值?
XCH A,R1
XCHD A,@R1
解: XCH A,R1 ;A=23H R1=40H
XCHD A,@R1 ;A=25H 40H=03H
6. 两个四位BCD码数相加,被加数和加数分别存于50H,51H和52H,53H单元中(次序为千位、百位在低地址中),和数存在54H,55H和56H中(56H用来存放最高位的进位,试编写加法程序)
解: ORG 0000H
LJMP START
ORG 0100H
START: MOV A,53H
ADD A,51H
DA A
MOV 55H,A
MOV A,52H
ADDC A,50H
DA A
MOV 56H,C
SJMP $
END
7.设(A)=01010101B,(R5)=10101010B,分别写出执行ANL A,R5;ORL A,R5:XRL A,R5 指令后结果。
解: ANL A,R5 ; 00000000B
ORL A,R5 ; 11111111B
XRL A,R5 ; 11111111
8.设指令SJMPrel=7EH,并假设该指令存放在2114H和2115H单元中。当该指令执行后,程序将跳转到何地址?
解:2116H+60H=2176H
9.简述转移指令AJMP addr11,SJMP rel,LJMP addr16及JMP @A+DRTR的应用场合。
解:AJMP addr11为2K字节范围内的无条件转跳指令,把程序的执行转移到指定的地址。
SJMP rel是无条件转跳指令,执行时在PC加2后,把指令中补码形式的偏移量加到PC上,并计算出转向目标地址。转向的目标地址可以在这条指令前128字节到后127字节之间
LJMP addr16执行这条指令时把指令的第二字节和第三字节分别装入PC的高位和地位字节中无条件地转向指定地址。转移目标地址可以在64K程序存储器地址空间的任何地方,不影响任何标志。
JMP @A+DRTR指令的功能是把累加器中8位无符号数与数据指针DRTR中的16位数相加,将结果作为下条指令地址送入PC,利用这条指令能实现程序的散转。
10.试分析下列程序段,当程序执行后,位地址00H,01H中的内容将为何值?P1口的8条I/O线为何状态?
CLR C
MOV A,#66H
JC LOOP1
CPL C
SETB 01H
LOOP: ORL C,ACC.0
JB ACC.2,LOOP2
CLR 00H
LOOP2: MOV P1,A
解: CLR C ;CY=0
MOV A,#66H ;A=66H
JC LOOP1
CPL C ;CY=1
SETB 01H ;20H.1=1
LOOP: ORL C,ACC.0 ;CY=1
JB ACC.2,LOOP2 ;
CLR 00H
LOOP2: MOV P1,A ;P1=01100110B
SJMP $
20H.0=0 20H.1=1 P1=66H
11.的特查指令表,写出下列两条指令的机器码,并比较一下机器码中操作数排列次序点。
MOV 78H,80H
MOV 78H,#80H
解:直接寻址单元传送到直接寻址单元的机器码是第二个操作数在前,而立即数传送到直接地址单元是第一个操作数在前,次序正好相反。
12.手工汇编下列程序段
ORG 873BH
AAA EQU 851AH
QQQ MOV A,35H
CLR C
SUBB A,#0AH
JC QQ16
MOV A,36H
SUBB A,#0AH
JC QQ15
AJMP AAA
QQ15: MOV 35H,#00H
QQ16: JNB 02H,QQ17
MOV R6,39H
DEC R6
SJMP QQ18
QQ17: MOV R6,39H
INC 39H
QQ18: CLR 05H
LJMP 8500H
END
13.若有两个无符号数x,y分别存放于内部存储器50H,51H单元中,试编写一个程序实现x*10+y,结果存入52H,53H两个单元中。
解: ORG 0000H
SJMP START
ORG 0030H
START :MOV A,50H
MOV B,#10
MUL AB ;(50H)10积的高、低字节分别在B、A中ADD A,51H
MOV 53H,A ;积的低字节加(51H)其和存放在53H中MOV A,#00H
ADDC A,B
MOV 52H,A ;积的高字节加进位位存放在52H中。
SJMP $
END
14从内部存储器20H单元开始,有30个数据。试编一个程序,把其中的正数,负数分别送51H和71H开始的存储单元,并分别记下正数负数的个数送50H和70H单元。
解: ORG 0000H
SJMP START
ORG 0030H
START: MOV 1EH,#51H ;正数存放首地址51H存于1EH单元
MOV 1FH,#71H ;负数存放首地址71H存于1EH单元
MOV R0,#20H ;建立取数(源操作数)的地址指针
MOV R2,#30 ;预置数据长度
MOV 50H,#00H ;正数个数统计单元清零
MOV 70H,#00H ;负数个数统计单元清零
LOOP:MOV A,@R0 ;取数
JB ACC.7,NEG ;是负数转NEG处理
POST:MOV R1,1EH ;是正数,将暂存的地址送R1(间址寄存器)
MOV @R1,A ;将正数入存
INC 50H ;正数个数加1
INC 1EH ;正数暂存地址加1修正
LOOP1: INC R0 ;取数地址加1修正
DJNZ R2,LOOP ;计数长度减1,不等于零,继续循环统计
SJMP $ ;结束
NEG: MOV R1,1FH ;是负数,将暂存的地址送R1(间址寄存器)
MOV @R1,A ;将正数入存
INC 70H ;负数个数加1
INC 1FH ;负数暂存地址加1修正
SJMP LOOP1 ;转取数地址修正
15内部存储单元40H中有一个ASCII码字符,试编一程序,给该数的最高位加上奇检验。
解: ORG 0000H
SJMP START
ORG 0030H
START: MOV A,40H ;取数给A
CLR ACC.7 ;A最高位(奇偶校验位)清零
JB P, LOOP ;40H中的ASCII码原来就是奇数个1(最高位给零)
SETB ACC.7 ;40H中的ACSII码原来是偶数个1,最高位置1
LOOP:MOV 40H,A ;入存
SJMP $ ;结束
END
16.编写一段程序,将存放在自DATA单元开始的一个四字节数(高位在前)取补后送回原单元。
解:若DATA在内部数据存储器中(假如存放在30H起始的4个单元中);采用求反加1的算法;
ORG 000H
SJMP START
ORG 0030H
START: SETB C ;置进位位为1
MOV R2,#04H ;预置计数长度
MOV R0,#DATA1+3 ;取数指针指向低字节的地址
LOOP: MOV A,@R0 ;取数
CPL A ;求反
ADDC A,#00H ;加进位
MOV @R0,A ;入存
DEC R0 ;地址指针修正
DJNZ R2,LOOP ;4字节未处理完,继续循环处理
SJMP $ ;结束
DATA1 EQU 30H;
END
17.以BUF1为起始地址的外存储区中,存放有16个单字节无符号二进制数,是编一程序,求其平均值并送BUF2单元。
解:设R2、R3存放和,将其除以16(R2、R3联合左移4位)即为平均置值(单字节存放)
ORG 0000H
SJMP START
ORG 0030H
START: MOV R2,#00H ;和高字节清零
MOV R3,#00H ;和低字节清零
MOV DPTR,#DATA1 ;建立外部数据存储器的地址指针
MOV R4,#10H ;预置计数长度
LOOP: MOVX A,@DPTR ;从外部数据存储器取数
ADD A ,R3
MOV R3,A
MOV A,R2;
ADDC A,#00H;
MOV R2,A ;累加
INC DPTR ;地址指针修正
DJNZ R4,LOOP ;16字节未累加完,继续循环累加
MOV R4,#04H ;R2、R3联合移位4次(除以16)
LOOP1: CLR C
MOV A,R2
RRC A
MOV R3,A
DJNZ R4,LOOP1 ;平均值存放于R3中
SJMP $ ;结束
DATA1 EQU 1000H;
END
18.在DATA1单元中有一个带符号8位二位进制数x。编一程序,按以下关系计算y值,送DATA2单元。
y =x+5,x>0
y=x,x=0
y=x-5,x<0
解:设DATA1、DATA2为内部数据存储器的二个单元(假设为30H、31H)且y的值单字节不会产生溢除出
ORG 000H
SJMP START
ORG 0030H
START: MOV A,30H ;取数X给A
JZ ZERO ;若X=0,则Y=0,转入存
JB ACC.7,NEG ;若X<0,则转X-5
POZI : ADD A,#05H ;若X>0,则X=5,入存
SJMP ZERO;
NEG: CLR C;
SUBB A,#05H;
ZERO: MOV 31H,A ;结果入存
SJMP $
END
19.设内部RAM中30H和31H单元中有两个带符号数,求出其中的大数存放在32H单元中。
解:若两数同号,则值大的数大;两数异号,正数值大
ORG 000H
SJMP START
ORG 0030H
START: MOV A,30H
XRL A,31H ;两数异或
JB ACC.7,YIHAO ;两数异号
TONGHAO: CLR C ;两数同号
MOV A,30H
SUBB A,31H
JC LOOP1-2
LOOP0: MOV A,30H ;同号被减数大,值大
LOOED: MOV 32H, A
SJMP $
LOOP1: MOV A,31H ;异号被减数大,值小
SJMP ED;
YIHAO: MOV A,30H ;异号,哪个正,其值大
JNB ACC.7,LOOP0
SJMP LOOP1
END
20.利用逻辑控制的方法,设计一个主程序,在第1,3,5,6次调出SB1子程序,第2,4,7,8次调用SB2程序。
解: ORG 000H
SJMP TEST
ORG 0030H
TEST: MOV R2,#08H
MOV A,#10101100B
LOOP: RLC A
JC LOOP1
LCALL SB1
SJMP RELT
LOOP1: LCALL SB2
RELT: DJNZ R2,LOOP
SJMP $
PRGO : RET
PRG1: RET
END
21.将DATA单元存放的以ASCII码表示的16进制数转换成十进制数存放于DATA+1单元。
解:先将DATA的ASCII码转换成十六进制的数,再转换成十进制数。数字的ASCII码转成十六进制数(即为十进制数)采用减30H
字母的ASCII码转成十六进制数采用减37H,十六进制再转十进制可采用先减0AH,再加10H;这样-37H-0AH+10H=-31H,可采用直接减31H。
数字与字母的ASCII的区别,可采用对D6的检测D6=1为字母的ASCII码,反之为数字的ASCII码。
ORG 000H
SJMP TEST
ORG 0030H
TEST: MOV R0,#DATA1
MOV A,@R0 ;将DATA1的数给A
CLR C;
LOOP: JB ACC.6,LOOP1 ;是字母,转LOOP1
SUBB A,#30H ;是数字减30H
ED: MOV DATA+1,A ;入存
SJMP $ ;结束
LOOP1:SUBB A,#31H ;是字母减31H
SJMP ED;
DATA1 EQU 30H
END
22.编一个将十六进制数转换成十进制数的子程序。
解:一个单字节的十六进制数转成十进制数一般考虑用二字节BCD码来存放。设转换后的数存放在R3(高)、R4(低)中。
ORG 000H
SJMP TEST
ORG 0030H
TEST: MOV DPTR,#TAB ;建立表头地址
MOV A,30H
ANL A,#0F0H
SWAP A ;高半字节分离
ADD A,0E0H ;高半字节数乘2
MOV B,A ;暂存
MOVC A,@A+DPTR;
MOV R3,A ;取转换后的高半字节存R3
INC DPTR;
MOV A,B;
MOVC A,@A+DPTR;
MOV R4,A ;取转换后的低半字节存R4
MOV A,30H;
ANL A,#0FH;
ADD A,R4;
DA A;
MOV R4,A ;加原数的低半字节(DA A)
MOV A,R3;
ADDC A,#00H;
DA A;
MOV R3,A;
RET;
TAB:DB 00H,00H,00H,16H,00H,32H,00H,48H,00H,64H
DB 00H,80H,00H,96H,01H,12H,01H,28H,01H,44H
DB 01H,60H,01H,76H,01H,92H,02H,08H,02H,24H
DB 02H,40H,02H,40H,02H,56H
END
23.编一程序,将存储区DATA1单元开始的20个单字节数据依次与DATA2单元为起始地址的20个单字节数据进行交换。
解:设DATA1、DATA2分别为内部RAM30H和50H单元。
ORG 0000H
SJMP START
ORG 0030H
START: MOV R0,#30H ;建立源地址指针
MOV R1,#50H ;建立目标地址指针
MOV R6,#20 ;置计数长度
LOOP: MOV A,@R0 ;取源地址数据
XCH A,@R1
MOV @R0,A ;源地址数据与目标地址数据交换
INC R0 ;源地址指针修正
INC R1 ;目标地址指针修正
DJNZ R6,LOOP ;计数长度减1,不等于0继续循环
RET
END
24试编写一程序,将存储区DATA1单元开始的50个单字节逐一移至DATA2单元开始的存储区中。
解:START:MOV R0,#DATA1 ;建立源操作数地址指针
MOV R1,#DATA2 ;建立目标操作数地址指针
MOV R6,#50 ;置计数长度
LOOP: MOV A,@R0
MOV @R0,A
INC R0
INC R1
DJNZ R6,LOOP
RET
END
25试编写一采用查表法求1~20的平方数子程序(要求:x在累加器A中,1≤x≤20,平方数高位存放在R6,低位在R7)
解:为了方便起见,每一数的平方在表中统一用双字节来存放,这样只要把数乘以2加表头地址,就可以找到平方数的高字节存放的地址,连续取两个字节即可
ORG 0000H
SJMP START
ORG 0030H
START: MOV DPTR,#TAB ;建立源地址指针
DEC A
MOV B,A
ADD A,B
MOV B,A
LOOP: MOVC A,@A+DPTR
MOV R5,A
INC DPTR
MOV A,B
MOVC A,@A+DPTR
MOV R6,A
RET
TAB: DB00H,00H,00H,01H,00H,04H,00H,09H,00H,16H;平方数用BCD表示(也可用DB 00H,25H,00H,36H,00H,49H,00H,64H,00H,81H;十六进制表示)
DB 01H,00H,01H,21H,01H,44H,01H,69H,01H,96H
DB 02H,25H,02H,56H,02H,89H,03H,24H,03H,61H,04H,00H
END
若平方表从0的平方存放,把程序中红色的DEC A指令去掉,若表从1的平方存放,则将DEC A指令加上。
26试编写一个三字节无符号数乘法程序。
解: OGR 0000H
MOV R0,#5CH
MUL1: MOV A,5AH
MOV B58H
MUL AB
MOV @R0,A
MOV R3,B
MOV A,5BH
MOV B,5BH
MUL AB
ADD A,R3
MOV R3,A
MOV A,B
ADD A,R2
MOV R2,A
MOV R1,#A
JNC LAST
INC R1
LAST: MOV A,5BH
MOV B,29H
MUL AB
ADD A,R2
INC R0
MOV @R0,A
MOV A,B
ADDC A,RI
INC R0
MOV @R0,A
MOV R5,#04H
MOV R1,#10H
LOOP: MOV A,@R0
MOV @R1,A
INC R0
INC R1
BINBCD: MOV R1,#48H
MOV R2,#04H
INC R2
CLR A
BB0: MOV @R1,A
INC R1
DJNZ R2,BB0
MOV A,#04H
MOV B,#8
MUL AB
MOV R3,A
BB3: MOV R0,#10H
MOV R2,#04H
CLR C
BB1: MOV A,@R0
RLC A
MOV @R0,A
INC R0
DJNZ R2,BB1
MOV R2,#04H
INC R2
MOV R1,#48H
BB2: MOV A,@R1
ADDC A,@R1
DA A
MOV @R1,A
INC R1
DJZN R2,BB2
DJZN R3,BB3
SJMP $
展开阅读全文