第4章部分习题答案- 7 -作业:7、8、9、10、11、15、17、19、204.7 设内部RAM 20H单元有两个非零的BCD数,编写求两个BCD数的积并把积送入21H单元的程序ORG 1000HMOV A, 20HMOV B, A ; 保存SWAP AANL A, #0FH ; 取高4位ANL B, #0FH ; 取低4位MUL ABMOV B, #0AHDIV AB ; 转换成BCD码的形式SWAP AORL A, BMOV 21H, ASJMP $END4.8 已知从内部RAM BLOCK单元开始存放有一组带符号数,数的个数存放在LEN单元编写可以统计正数和负数个数并分别存入NUM和NUM+1单元的程序org 1000hnum data 30hlen data 20hblock data 40hmov r0, #blockmov num, #00h ; 保存正数个数mov b, #00h ; 保存负数个数loop: mov a, @r0inc r0jb acc.7, neginc numsjmp nextneg: inc bnext: djnz len, loopmov num+1, bsjmp $end4.9 设X为一无符号数,存放在内部RAM的VAX单元, Y存放在FUNC单元。
编写满足如下关系的程序:org 2000hvax data 20hfunc data 30hmov a, vaxcjne a, #32h, comp1comp1: jc next1mov func, asjmp donenext1: cjne a, #14h, comp2comp2: jc next2mov b, #05hmul abmov func, asjmp donenext2: clr crlc amov func, adone: sjmp $end4.10 在例4.6的128分支程序中,若用LJMP指令代替AJMP指令,以便分支程序可以放在64KB地址范围的任何位置修改原程序,修改后的程序最多可以实现多少分支LJMP是三字节指令,最大分支数N应满足条件:N×3 < 256(即不超过A的存储范围),所以N = 85 修改后的程序:ORG 2100HMOV A, R3RL AADD A, R3MOV DPTR, #BRTABJMP @A + DPTR┆BRTAB: LJMP ROUT00 LJMP ROUT01 LJMP ROUT02 ┆ LJMP ROUT85ROUT00: ┆┆ROUT85: ┆ END4.11 从外部RAM的SOURCE(二进制8位)开始有一数据块,该数据块以 $ 字符结尾,编写程序,把它们传送到以内部RAM的DIST为起始地址的区域($ 字符也要传送) org 2000hsource data 10hdist data 20h mov p2, #00h mov r0, #source mov r1, #distnext: movx a, @r0 inc r0 mov @r1, a inc r1 cjne a, #24h, nextdone: sjmp $ end4.12 将习题4.11中的Source改为16位的,则将程序中的 r0 改成 dptr 即可。
4.13 在外部RAM的低256地址单元区,有起始地址为SOUCE且长度在LEN单元的数据块编写能对它们进行奇偶校验的程序凡满足奇校验(奇数个1)的数据均送到内部RAM起始地址为DIST的存储区 org 2000hlen data 10hsource data 20hdist data 50h mov r0, #source mov r1, #dist mov r2, #len mov p2, #00hloop: movx a, @r0 inc r0 jnb psw.0, next mov @r1, a inc r1next: djnz r2, loop sjmp $ end4.14 将习题4.13中的Source改为16位的,则将原来程序中的 r0 改成 dptr 即可4.15 外部RAM从2000H到2100H有一数据块,编写程序将它们传送到从3000H到3100H区域。
ORG 0HMOV DPTR, #2000HNEXT: MOVX A, @DPTR ORL DPH, #10H ; 将DPH从20H变成30H MOVX @DPTR, A ANL DPH, #0EFH ; 将DPH从30H变成20H INC DPTR MOV A, DPH CJNE A, #21H, NEXT MOVX A, @DPTR MOV DPH, #31H MOVX @DPTR, A ;传送2100H单元中的内容到3100H SJMP $ END4.16 片内RAM中有一数据块起始地址为FIRST+1,长度存放在FIRST中且不为0,统计数据块中正偶数和负奇数的个数,分别存放在PAPE单元和NAOE单元 ORG 0HPAPE DATA 20HNAOE DATA 21HFIRST DATA 30H MOV PAPE, #00H MOV NAOE, #00H MOV R0, #FIRST INC R0 ; 数据块的起始地址LOOP: MOV A, @R0 INC R0 JB ACC.7, NEXT ; 负数 JB ACC.0, PP ; 如果是正奇数,则取下一个数 INC PAPE SJMP PPNEXT: JNB ACC.0, PP ; 如果是负偶数,则取下一个数 INC NAOEPP: DJNZ FIRST, LOOP SJMP $ END 4.17 从内部RAM的BLOCK为起始地址的100个无符号数中找出最小值并把它送入MIN单元。
ORG 0HBLOCK DATA 20HMIN DATA 10H MOV R0, #BLOCK MOV R2, #64H MOV MIN, #0FFHLOOP: MOV A, @R0 CJNE A, MIN, NEXTNEXT: JNC NEXT1 MOV MIN, ANEXT1: INC R0 DJNZ R2, LOOP SJMP $ END4.18 内部RAM区,6组无符号4字节被加数和加数分别存放在以FIRST和SECOND为起始地址的区域(低字节在前,高字节在后), 编程求和(设和也为4字节)并把和存于以SUM开始的区域 ORG 0HFIRST DATA 20HSECOND DATA 40HSUM DATA 60H MOV R0, #FIRST MOV R1, #SECOND MOV R2, #06HLOOP: MOV R3, #04H CLR CLOOP1: MOV A, @R0 ADDC A, @R1 MOV @R0, A ; 将和存放在以FIRST开始的区域 INC R0 INC R1 DJNZ R3, LOOP1 DJNZ R2, LOOP MOV R0, #FIRST MOV R1, #SUM MOV R2, #24LOOP2: MOV A, @R0 MOV @R1, A INC R0 INC R1 DJNZ R2, LOOP2 SJMP $ END4.19 内部RAM中,数据块以BLOCK为起始地址,块长放在LEN单元。
用查表指令编写程序,先检查它们是否是十六进制中的A-F,若是,则把它们变成ASCII码,若不是,则把它们变为00H ORG 0HLEN DATA 10HBLOCK DATA 20H MOV R0, # BLOCK MOV DPTR, # ASCTABLOOP: MOV A, @R0 CJNE A, #0AH, NE1NE1: JNC NE2 ; 若大于等于A,则去与F比较 SJMP CHZERO ; 若小于A,则变成0NE2: CJNE A, #0FH, NE3 ;与F比较 SJMP CHASC ; 若等于F,则转成 ASCII 码NE3: JC CHASC ; 若小于F,则转成 ASCII 码CHZERO: CLR A ; 若大于F,则变成0 SJMP NEXTCHASC: ADD A, #07H ; 查表求ASCII码 CLR C SUBB A, # 0AH MOVC A, @A+PCNEXT: MOV @R0, A INC R0 DJNZ LEN, LOOP SJMP $ASCTAB: DB 'A', 'B', 'C', 'D', 'E', 'F' END4.20 在片内RAM的20H单元中有一个数,其值范围为0-100,要求利用查表法求此值的平方值并把结果存入片外RAM的20H(低字节)和21H。
ORG 00H MOV P2, #00H MOV R0, #21H MOV A, 20H CLR C RLC A MOV B, A MOV DPTR, #DTATAB MOVC A, @A+DPTR MOVX @R0, A DEC R0 MOV A, B INC A MOVC A, @A+DPTR MOVX @R0, A SJMP $DTATAB: DW 0, 1, 4, 9, 16, 25, 36, 49 DW 64, 81, 100, 11*11, 12*12 DW 13*13, 14*14, 15*15, 16*16 ..... DW 100*100 END 4.21 内部RAM中,从BLOCK开始的存储区有10个单字节十进制数(每字节有两个BCD数),编程求BCD数之和(和为3位BCD数),并把它们存于SUM和SUM+1单元(低字节在SUM单元)。
ORG 00HBLOCK DATA 20HSUM DATA 10H MOV R0, #BLOCK MOV R2, #0AH MOV A, #00H MOV R1, #SUM INC R1 ; SUM+1单元中存放累加和的高位 MOV @R1, #00HLOOP: ADD A, @R0 DA A INC R0 JNC NEXT INC @R1 ; 将进位送到累加和的高位NEXT: DJNZ R2, LOOP MOV SUM, A SJMP $ END 4.22 将例4.21中,改为10个双字节十进制求和(和为4位BCD数),结果仍送到SUM开始的连续单元(低字节先存) ORG 00HBLOCK DATA 20HSUM DATA 10H MOV R0, #BLOCK MOV R2, #0AH MOV SUM, #00H MOV SUM+1, #00H MOV B, #00H ; 存放累加和的最高位 LOOP: MOV A, SUM ADD A, @R0 DA A MOV SUM, A INC R0 MOV A, SUM+1 ADDC A, @R0 DA A MOV SUM+1, A INC R0 JNC NEXT INC B ;将进位送到累加和的高位NEXT: DJNZ R2, LOOP MOV SUM+2, B SJMP $ END 4.23 已知MDA 和 MDB 内分别存有两个小于10的整数,用查表子程序实现c = a*a +2ab + b*b,并把和存于MDC和MDC+1单元(MDC中放低字节) ORG 00HMDA DATA 10HMDB DATA 20HMDC DATA 30H MOV MDC+1, #00H MOV A, MDA ACALL SQR MOV MDC, A MOV A, MDA MOV B, MDB MUL AB RL A ; 因为2ab < 255,送到A ADD A, MDC MOV MDC, A JNC NEXT INC MDC+1 NEXT: MOV A, MDB ACALL SQR ADD A, MDC MOV MDC, A JNC NEXT1 INC MDC+1 NEXT1: SJMP $SQR: ADD A, #01H MOVC A, @A+PC RETSQRTAB: DB 0, 1, 4, 9, 16 DB 25, 36, 49, 64, 81 END 4.24 已知外部RAM起始地址为STR的数据块中有一以回车符CR断尾的十六进制ASCII。
编写程序将它们变为二进制代码,放在起始地址为BDATA的内部RAM存储区中 ORG 0HSTR DATA 10HBDATA DATA 50H MOV P2, #00H MOV R0, #STR MOV R1, #BDATALOOP: MOVX A, @R0 INC R0 CJNE A, #0DH, NEXT SJMP DONENEXT: CJNE A, #40H, NEXT1NEXT1: JNC NEXT2 ; A - F ANL A, #0FH SJMP DONENEXT2: CLR C SUBB A, #37HDONE: MOV @R1, A INC R1 SJMP LOOP SJMP $ END程序流程图如下:R0 ß STRR1 ß BDADA开 始A ß(R0)R0 ß R0+1A à(R1)A < 40 ?A是0~9的值A ßA0FHA是A~F的值A ß A-37H结 束A = CR ?YNYR1 ß R1+1N4.25 设晶振频率为6MHz,试编写能延时20ms的子程序。
因为晶振频率为6MHz,则一个机器周期为:s延时20ms,则需要10000个机器周期即:按下面的程序有如下的关系式:1 + R2 * ( 1+R3*(1+2)+2 ) = 10000通过计算,设R2 =101, R3 = 32 ORG 0H MOV R2, #101 ; 1LOOP: MOV R3, #32 ; 1LOOP1: NOP ; 1 DJNZ R3, LOOP1 ; 2 DJNZ R2, LOOP ; 2 SJMP $ END 4.26 已知内部RAM的MA(被减数)和MB(减数)中分别有两个带符号数编写减法子程序,并把差存入RESULT和RESULT+1单元中 ORG 0HMA DATA 20HMB DATA 30HRESULT DATA 40H CLR C MOV R0, #MA MOV R1, #MB ACALL SUB MOV RESULT, A INC R0 INC R1 ACALL SUB MOV RESULT+1, A SJMP $ SUB: MOV A, @R0 SUBB A, @R1 RET END4.27 设R0内有一个补码形式的带符号被除数,R1内部补码形式的带符号除数,编程实现除法,并把商置于R2内且余数置于R3内。
ORG 0HSBIT BIT 20H.0SBIT1 BIT 20H.1SBIT2 BIT 20H.2 MOV A, R0 RLC A MOV SBIT1, C MOV A, R1 RLC A MOV SBIT2, C ANL C, /SBIT1 MOV SBIT, C MOV C, SBIT1 ANL C, /SBIT2 ORL C, SBIT MOV SBIT, C MOV A, R1 ; 处理除数 JNB SBIT2, NCH1 CPL A INC ANCH1: MOV B, A MOV A, R0 ; 处理被除数 JNB SBIT1, NCH2 CPL A INC ANCH2: DIV AB ; 求出商和余数的绝对值 JNB SBIT, NCH3 CPL A ; 如果商为负,则求出补码 INC ANCH3: MOV R2, A ; 商放到R2中 JNB SBIT, NCH4 ; 如果余数为负,则求出补码 MOV A, B CPL A INC A NCH4: MOV R3, A SJMP $ END。