3.14 已知M1和M2单元中存放有两个16位无符号数X1和X2(低8位在前,高8位在后)试写出X1+X2并把结果放在M1和M1+1单元(低8位在M1单元,高8位在M1+1单元)的程序。设两数之和不会超过16位。 程序如下:
ORG 0500H ;X1的起始地址送R0 MOV R0,#M1 ;X2的起始地址R1 MOV R1,#M2 ;A?X1的低8位
MOV A,@R0 ;A?X1低8位+X2低8位,形成Cy ADD A ,@R1 ;和的低8位存M1 MOV @R0,A ;修改地址指针R0 INC R0 ;修改地址指针R1 INC R1 ;A<--X1高8位
MOV A, @R0 ;A<--X1高8位+X2高8位+Cy ADDC A,@R1 ;和的高8位存M1+1 MOV @R0,A ;停机 SJMP $ END
3.19 已知两个8位无符号乘数分别放在30H和31H单元中,试编出令它们相乘并把积的低8位放入32H单元中、积的高8位放入33H单元的程序。 程序如下: ORG 0100H
MOV R0 ,#30H ;R0<--第一个乘数地址 MOV A ,@R0 ;A<--第一个乘数 INC R0 ;修改乘数地址 MOV B,@R0 ;B<--第二个乘数 MUL AB ;A X B =BA
INC R0 ;修改目标单元地址 MOV @R0,A ;积的低8位--.>32H INC R0 ;修改目标单元地址 MOV @R0,B ;积的高8位--.>33H SJMP $ ;停机 END
3.25 已知M1和M1+1单元中有一个16位的二进制数(M1中为低8位),请通过编程令其扩大二倍(设该数扩大后小于65536)。 程序如下: ORG 1000H
CLR C ;Cy<--0
MOV R1 ,#M1 ;操作数低8位地址送R1 MOV A,@R1 ;A<--操作数低8位
RLC A ;低8位操作数左移,低位补0 MOV @R1,A ;送回M1单元,Cy中为最高位
INC R1 ; R1指向M1+1单元 MOV A,@R1 ;A<--操作数高8位 RLC A ;高8位操作数左移
MOV @R1 , A ;送回M1+1单元 SJMP $ ;停机 END
3.26 在M1和M1+1单元中有两个BCD数,请通过编程将它们紧缩成一个字节并放入M1单元。 程序如下:
ORG 0001H MOV R1,#M1 ;地址M1送R1 MOV A,@R1 ;A<--M1中BCD数 SWAP A, ;BCD1移入高4位 INC R1 ;修改地址指针R1
ORL A,@R1 ;BCD1和BCD2合并后送A MOV M1,A ;送回M1单元 SJMP $ ;停机 END
3.31 已知:外部RAM中以DATA1(DATA1在0页内)为起始地址的数据块以零为结束标志。试通过编程将之传送到以DATA2为起始地址的内部RAM区。 程序如下:
ORG 0500H
MOV R0,#DATA1 ;外部RAM数据块起始地址送R0 MOV R1,#DATA2 ;内部RAM数据块起始地址送R1 LOOP: MOVX A,@R0 ;外部RAM取数送A JZ DONE ;若A=0,则转DONE
MOV @R1,A ;若A≠0,则给内部RAM送数 INC R0 ;修改外部RAM地址指针 INC R1 ;修改内部RAM地址指针 SJMP LOOP ;循环 DONE :SJMP $ ;结束 END
3.32 试编一程序令片内RAM中以DAT为起始地址的数据块中连续10个无符号数相加,并累加送到SUM单元。这里的累加和是不考虑进位的和,所以它们为二进制8位。 程序如下:
ORG 1000H
MOV R2,#0AH ;数据块长度送R2 MOV R0,#DAT ;数据块起始地址送R0 CLR A ;累加器清零 LOOP:ADD A ,@R0 ;加一个数
INC R0 ;修改加数地址指针 DJNZ R2,LOOP ;若R2-1≠0,则LOOP MOV SUM ,A ;存和 SJMP $ ;结束 END
3.35 试利用子程序技术编出令20H—2AH、30H—3EH和40H—4FH三个子域清零的程
序。
ORG 1000H
MOV SP,#70H ;令堆栈的栈底地址为70H MOV R0,#20H ;第一清零区起始地址送R0 MOV R2,#0BH ;第一清零区起始地址送R2 ACALL ZERO ;给20H-2AH区清零
MOV R0,#30H ;第二清零区起始地址送R0 MOV R2,#0FH ;第二清零区单元数送R2 ACALL ZERO ;给40H-4FH单元清零 SJMP $ ;结束 ORG 1050H
ZERO:MOV @R0,#00H ;清零
INC R0 ;修改清零区指针
DJNZ R2,ZERO ;若R2-1≠0,则ZERO RET ;返回 END
3.10 试编出把外部RAM的2050H单元中的内容相交换的程序。 程序如下:
ORG 0500H
MOV DPTR,#2050H
MOVX A,@DPTR ;A<--(2050H)=X MOV R0,A ;存入R0 MOV DPTR,#2060H
MOVX A,@DPTR ;A<--(2060H)=Y XCH A,R0 ;A?R0 MOVX @DPTR,A ;2060H<--X MOV A,R0 ;A<--Y MOV DPTR ,#2050H
MOVX @DPTR,A ;2050H<--Y SJMP $ END
4..2 请编写能把20H单元内两个BCD数变换成相应的ASCII码并放在21H(高位BCD数的ASCII码)和22H(低位BCD数的ASCII码)单元的程序。
程序如下: ORG 0500H
MOV R0,#22H ;R0<--22H
MOV @R0,#00H ;22H单元清零
MOV A,20H ;20H中BCD数送A XCHD A,@R0 ;低位BCD数至22H ORL 22H,#30H ;完成低位BCD数转换 SWAP A ;高位BCD数送抵4位 ORL A ,#30H ;完成高位BCD数转换 MOV 21H, A ;存入21H单元 SJMP $ ;结束
END
4.4 已知20H单元中有一个二进制数,请编程把它转换为3位BCD数,把百位BCD数送入FIRST单元的低4位,十位和个位BCD数放在SECOND单元,十位BCD数在SECOND单元中的高4位。 程序如下:
ORG 0200H FIRST DATA 30H SECOND DATA 31H
MOV A,20H ;被除数送A MOV B,#64H ;除数100送B DIV AB ;A%B=A----B
MOV FIRST ,A ;百位BCD送FIRST MOV A,B ;余数10送B MOV B,#0AH ;除数10送B DIV AB ;A%B=A---B SWAP A ;十位BCD送高4位
ORL A,B ;完成十位和个位BCD数装配 MOV SECOND,A ;存入SECOND单元 SJMP $ ;结束 END
4.5 已知VAR单元内有一自变量X,请按如下条件编出求函数值Y并将它存入FUNC单元的程序。
1 X>0 Y= 0 X=0 -1 X<0
先分支后赋值 先赋值后赋值 ORG 0100H ORG 0100H VAR DATA 30H VAR DATA 30H FUNC DATA 31H FUNC DATA 31H
MOV A,VAR ;A<--X MOV A,VAR ;A<--X JZ DONE ;若X=0,则转DONE JZ DONE ;若X=0,则转DONE JNB ACC.7,POSI ;若X>0,则转POSI MOV R0,#0FFH ;若X≠0,则R0<--1 MOV A, #0FFH ;若X<0.,则A<-- -1 JB ACC.7,NEG ;若X<0,则转NEG SJMP DONE ;转DONE MOV R0,#01H ;若X>0,R0<--1 POSI:MOV A,#01H ;A<--1 NEG :MOV A,R0 ;A<--R0 DONE:MOV FUNC ,A ;存Y值 DONE:MOV FUNC,A;存Y值 SJMP $ SJMP $ END END
4.7 已知两个带符号数分别存入ONE和TWO单元,试编程比较它们的大小,并把大数存入MAX单元。 程序如下:
ORG 0400H ONE DATA 30H