1、单片微型计算机第四章习题答案 华中科技大学第四章习题答案4.4 ORG 0000H LJMP MAINORG 0040HMAIN: MOV DPTR,#2000H ; 置地址指针初值 MOV R2,#100 ; 数据单元长度 CLR ALOOP: MOVX DPTR,A INC DPTR; DJNZ R2,LOOP ; 修改地址指针 END 4.5 ORG 0000H LJMP MAINORG 0040HMAIN: MOV R0,#40H ;置片内地址指针初值 MOV DPTR,#2100H ;置片外地址指针初值 MOV R2,#21H ;置数据长度LOOP: MOV A,R0 MOVX DP
2、TR,A INC R0 ;修改地址指针 INC DPTR DJNZ R2,LOOP END4.8 完成(a+b)2的计算 ORG 0000H LJMP MAIN ORG 0040HMAIN: MOV DPTR,#3000H MOVX A,DPTR ;取数a MOV R2,A ;暂存a INC DPTR MOVX A,DPTR ;取数b ADD A,R2 ;a+b MOV B,A MUL AB ;(a+b)2-A ;分支,方法一: CJNE A,#0AH,L1 SJMP L3L1: JC L2 SUBB A,#0AH SJMP L3L2: ADD A,#0AHL3: MOV DPTR,#3002
3、H MOVX DPTR,A SJMP $ ;分支,方法二:MOV R7,ACLR CSUBB A,#10JNZ L1MOV A,R7 ;A=10,恢复A中的值SJMP DONEL1: JNC DONE ADD A,#20 ;A10MOVX DPTR,ASJMP $4.9 方法一:;说明:每一轮循环的大数存入累加器A中 ORG 0000H LJMP MAINORG 0030HMAIN: MOV DPTR,#1000H ;置地址指针初值 MOV R2,#100 ;数据长度初值 MOV R4,#0 ;暂存结果单元清零LOOP: MOVX A,DPTR ;取数 MOV R3,A ;暂存 MOV A,R
4、4 ; CLR C ;比较 SUBB A,R3 JNC NEXT MOV A,R3 ;大数存入累加器A SJMP NEXT1NEXT: ADD A,R3 ;恢复累加器A中的值NEXT1: INC DPTR ;修改地址指针 MOV R4,A DJNZ R2,LOOP MOV DPTR,#1100H MOVX DPTR,A ;存结果 SJMP $方法二: ORG 0000H LJMP MAINORG 0030HMAIN: MOV DPTR,#1000H ;置地址指针初值 MOV R2,#99 ;数据长度初值 MOVX A,DPTR ;取数 MOV R3,A ;暂存LOOP: INC DPTRMOV
5、X A, DPTR CLR C ;比较 SUBB A,R3 JNC NEXT MOV A,R3 ;大数存入累加器A SJMP NEXT1NEXT: ADD A,R3 ;恢复累加器A中的值NEXT1: DJNZ R2,LOOP MOV DPTR,#1100H MOVX DPTR,A ;存结果 SJMP $方法三:大数存入R3ORG 0000H LJMP MAINORG 0030HMAIN: MOV DPTR,#1000H ;置地址指针初值 MOV R2,#100 ;数据长度初值 MOV R3,#0 ;暂存结果单元清零LOOP: MOVX A,DPTR ;取数 CLR C ;比较 SUBB A,R
6、3 JC NEXT MOV R3, A ;大数存入累加器ANEXT: INC DPTR ;修改地址指针 DJNZ R2, LOOP MOV A, R3MOV DPTR,#1100H MOVX DPTR,A ;存结果 SJMP $4.10 判断带符号数为正数或负数的指令组合有:(1)JNZ+JB ACC.7 (2) CJNE A, #7FH, L1 + JC(JNC) (3) CJNE A, #0, L1 + JB ACC.7错误的指令组合有:(1) CJNE A, #0, L1 + JC(JNC) (2) SUBB A, #0 + JC(JNC) 方法一:;说明:one存放大于零的数的个数;t
7、wo存放等于零的;数的个数;three存放小于零的数的个数 ONE EQU 30H TWO EQU 31H THREE EQU 32H ORG 0000H LJMP START ORG 0040HSTART: MOV ONE,#0 MOV TWO,#0 MOV THREE,#0 MOV DPTR,#2100H MOV R5,#100LOOP: MOVX A,DPTR JNZ L1 INC TWO ;零的个数加1 SJMP DONEL1: JB Acc.7,L2 ;若用JC指令,则错误 INC ONE ;正数的个数加1 SJMP DONEL2: INC THREE ;负数的个数加1DONE: I
8、NC DPTR ;修改地址指针 DJNZ R5,LOOP SJMP$ END方法二:;说明:one存放大于零的数的个数;two存放等于零的;数的个数;three存放小于零的数的个数 ONE EQU 30H TWO EQU 31H THREE EQU 32H ORG 0000H LJMP STARTSTART: MOV ONE,#0 MOV TWO,#0 MOV THREE,#0 MOV DPTR,#2100H MOV R5,#100LOOP: MOVX A,DPTR CJNE A, #80H, L1L2: INC THREE ;负数的个数加1 SJMP DONEL1: JNC L2 JZ L3
9、INC ONE ;正数的个数加1 SJMP DONEL3: INC TWO ;零的个数加1DONE: INC DPTR ;修改地址指针 DJNZ R5,LOOP SJMP$方法三: ;说明:one存放大于零的数的个数;two存放等于零的;数的个数;three存放小于零的数的个数 ONE EQU 30H TWO EQU 31H THREE EQU 32H ORG 0000H LJMP STARTSTART: MOV ONE,#0 MOV TWO,#0 MOV THREE,#0 MOV DPTR,#2100H MOV R5,#100LOOP: MOVX A,DPTR JZ L1 ANL A, #8
10、0H JZ L2 INC THREE ;负数的个数加1SJMP DONEL1: INC TWO ;零的个数加1 SJMP DONEL2: INC ONE ;正数的个数加1DONE: INC DPTR ;修改地址指针 DJNZ R5,LOOP SJMP $ END4.12 ;负数求补,需保持符号位不变,方法有:XRL A,#7FH INC ACPL AADD A,#81HCPL AADD A,#1SETB ACC.7 ORG 0000H LJMP MAINORG 0040HMAIN: MOV R1,#30H ;首地址 MOV R7,#100 ;数据长度LP1: MOV A,R1 JNB ACC.
11、7,LP2 XRL A,#7FH ;负数求补 INC ALP2: MOV R1,A INC R1 ;修改地址指针 DJNZ R7,LP1 END4-15 方法一:;说明:压缩BCD码转换为ASCII码;入口参数压缩BCD码在A中,出口参数高4为BCD码转化后的ASCII码在R6中,低4位BCD码转换后的ASCII码在R5中;数据逆序存放,即低字节存入低地址,高字节存入高地址 ORG 0000H LJMP MAIN ORG 0040HBCDASC:PUSH R7 MOV R7,A ANL A,#0FH ;低4位转换 ADD A,#30H MOV R5,A MOV A,R7 ANL A,#0F0H
12、 ;高4位转换 SWAP A ADD A,#30H MOV R6,A POP R7 RET MAIN: MOV R4,#5 MOV DPTR,#2000H ;源地址 MOV R3,#05H ;目的首地址低8位LOOP: MOVX A,DPTR PUSH DPL ;源地址保护 LCALL BCDASC MOV DPL,R3 MOV A,R5 MOVX DPTR,A INC DPL MOV A,R6 MOVX DPTR,A MOV R3,DPL POP DPL INC DPTR INC R3 DJNZ R4,LOOP SJMP $ END方法二: ORG 0000H LJMP MAIN ORG 0
13、040HMAIN: MOV DPTR,#2000H MOV R7,#5 ;数据长度 MOV R6,#05H ;目标地址低8位 MOV R5,#00H ;源地址低8位LOOP: MOV DPL,R5 INC R5 MOVX A,DPTR ;取数 MOV R4,A ;数据送入R4保护 MOV DPL,R6 INC R6 LCALL BCDASC ;低4位转换成ASCII码 MOV A,R4 SWAP A MOV DPL, R6 INC R6 LCALL BCDASC ;高4位转换成ASCII码 DJNZ R7,LOOP SJMP $ BCDASC:ANL A,#0FH ;屏蔽高4位,保留低4位 A
14、DD A,#30H MOVX DPTR, A ;存数据 RET END4.17 参照教材P103例4.2.23 ORG 1000HSUBMB: CLR CLOOP: MOV A,R0 ;取被减数 SUBB A,R1 ;相减 MOV R0,A ;存结果 INC R0 ;修改地址指针 INC R1 DJNZ R2,LOOP JNC DONE SETB F0 ;若有借位,置位标志位DONE: RET4.26 两个两位BCD码 ORG 1000HBCDBIN: MOV R0,#20H ;BCD码首地址 MOV R1,#30H ;二进制数首地址 MOV R3,#02H ;数据长度LOOP: MOV A,R0 ;取BCD码 ANL A,#0F0H ;取高4位,屏蔽低4位 SWAP A MOV B,#10 MUL AB ;高4位10 MOV R2,A MOV A,R0 ANL A,#0FH ;取低4位,屏蔽高4位 ADD A,R2 ;高4位10低4位 MOV R1,A INC R1 ;修改地址指针 INC R0 DJNZ R3,LOOP RET ;两位BCD码转换为二进制数子程序,R1为二进制数地址指针,R0为BCD码地址指针BCDBIN:MOV R1,#0 MOV A,R0 XCHD A,R1 SWAP A MOV B,#10 MUL AB ADD A,R1 MOV R1,A RET