mcs51单片机第四章习题解答
更新时间:2023-11-01 08:16:01 阅读量: 综合文库 文档下载
第四章习题解答(仅供参考)
4—1 若有两个无符号数。x、y分别存放在内部存储器50H、51H单元中,试编写一个程序实现x?10?y,结果存人52H、53H两个单元中。 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 习题4-1 参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H SJMP START ORG 0030H START: MOV A,50H
MOV B,#10
MUL AB ;(50H)x10积的高、低字节分别在B、A中 ADD A,51H
MOV 53H,A ;积的低字节加(51H)其和存放在53H中 MOV A,#00H
ADDC A,B
MOV 52H,A ;积的高字节加进位位存放在52H中。
SJMP $
4—2 从内部存储器20H单元开始,有30个数据。试编一个程序,把其中的正数、负数分别送51H和71H开始的存储单元,并分别记下正数、负数的个数送50H和70H单元。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 习题4-2 参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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处理
POSI: MOV R1,1EH ;是正数,将暂存的地址送R1(间址寄存器) MOV @R1,A ;将正数入存 INC 50H ;正数个数加1
INC 1EH ;正数暂存地址加1修正 LOOP1: INC R0 ;取数地址加1修正
DJNZ R2,LOOP ;计数长度减1,不等于零,继续循环统计
1
SJMP $ ; 结束
NEG: MOV R1,1FH ;是负数,将暂存的地址送R1(间址寄存器) MOV @R1,A ;将负数入存 INC 70H ;负数个数加1
INC 1FH ;负数暂存地址加1修正 SJMP LOOP1 ;转取数地址修正
4—3 内部存储单元40H中有一个ASCII码字符,试编一程序,给该数的最高位加上奇校验。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 习题4-2 参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG 0000H
SJMP START ORG 0030H
START: MOV A,40H ;取数给A
CLR ACC.7 ;A最高位(奇偶校验位)清零
JB P,LOOP ;40H中的ACSII码原来就是奇数个1(最高位给零) SETB ACC.7 ;40H中的ACSII码原来是偶数个1,最高位置1 LOOP: MOV 40H,A ;入存 SJMP $ ; 结束
END
4—4 编写一段程序,将存放在自DATA单元开始的一个四字节数(高位在前),取补后送回原单元。
一:若DATA在内部数据存储器中(假如存放在30H起始的4个单元中); 解1、采用求反加1的算法 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 习题4-4a 参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H
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 $ ; 结束
2
DATA1 EQU 30H ; END 解2、采用0减原数的算法 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 习题4-4b 参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H SJMP START
ORG 0030H
START: MOV R2,#04H ; 预置计数长度
MOV R0,#DATA1+3 ; 取数指针指向低字节的地址 CLR C ; 进位位清零 LOOP: MOV A,#00H ;
SUBB A,@R0 ; 用零减原数 MOV @R0,A ; 入存
DEC R0 ; 地址指针修正
DJNZ R2,LOOP ; 4字节未处理完,继续循环处理 SJMP $ ; 结束 DATA1 EQU 30H ;
END 二:若DATA在外部数据存储器中(假如存放在1000H起始的4个单元中); 解1、
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 习题4-4c 参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H SJMP START ORG 0030H
START: MOV R2,#04H ; 预置计数长度
MOV P2,#10H ; 取数指针指向数据低字节的高8位地址 MOV R0,#03H ; 取数指针指向数据低字节的低8位地址 SETB C ; 进位位置1
LOOP: MOVX A,@R0 ; 从外部数据存储器取数 CPL A ; 求反 ADDC A,#00H ; 加进位位 MOVX @R0,A ; 入存
DEC R0 ; 地址指针修正
DJNZ R2,LOOP ; 4字节未处理完,继续循环处理 SJMP $ ; 结束 DATA1 EQU 30H ;
3
解2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 习题4-4d 参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H SJMP START
ORG 0030H
START: MOV R2, #04H ; 预置计数长度
MOV P2, #10H ; 取数指针指向低字节数据的高8位地址 MOV R0, #03H ; 取数指针指向低字节数据的低8位地址 CLR C ; 进位位清零
LOOP: MOVX A,@R0 ; 从外部数据存储器取数 MOV B,A ; 暂存 MOV A,#00H
SUBB A,B ; 用零减原数
MOVX @R0,A ; 入存
DEC R0 ; 低8位地址地址指针修正
DJNZ R2,LOOP ; 4字节未处理完,继续循环处理 SJMP $ ; 结束 DATA1 EQU 30H ;
END
4—5 以BUFl为起始地址的外存储区中,存放有16个单字节无符号二进制数,试编一程序,求其平均值并送BUF2单元。
解:设R2、R3存放和,将其除以16(R2、R3联合左移4位)即为平均置值(单字节存放)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 习题4-5参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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 ; 累加
4
INC DPTR ; 地址指针修正
DJNZ R4,LOOP ; 16字节未累加完,继续循环累加 MOV R4,#04H ; R2、R3联合移位4次(除以16) LOOP1: CLR C MOV A,R2 RRC A MOV R2,A MOV A,R3 RRC A
MOV R3,A
DJNZ R4,LOOP1 ; 平均值存放于R3中 SJMP $ ; 结束 DATA1 EQU 1000H ; END
4—6 在DATAl单元中有一个带符号8位二进制数。编一程序,按以下关系计算y值,送DATA2
?x?5 x>0?y??x x=0
?x?5 x<0?解1:设DATA1、DATA2为内部数据存储器的二个单元(假设为30H、31H) 且y的值单字节不会产生溢除出 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 习题4-6 a参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H
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
解2: 考虑Y有可能产生溢出的更为一般的情况,DATA2用双字节存放(31H、32H) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 习题4-6 b参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5
ORG 0000H
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, MOV 31H,A MOV A,#00H
ADDC A,#00H
MOV 32H,A ; x+5的和入存31H(低字节)、32H(高字节)中 ED: SJMP $ ;
NEG: CLR C ; X<0,用FF、X-5 SUBB A,#05H ; MOV 31H,A
MOV A,#0FFH SUBB A,#00H
MOV 32H,A ;x-5的差入存31H(低字节)、32H(高字节)中 SJMP ED
ZERO: MOV 31H,A ; x=0结果入存
MOV 32H,#00H SJMP ED ; END
4—7 设内部RAM中30H和31H单元中有两个带符号数,求出其中的大数存放在32H单元中。
解一:思路:若两数同号,则值大的数大;两数异号,正数值大
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 习题4-6 a 参考答案 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG 0000H
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
,LOOP0: MOV A,30H ;同号被减数大,值大 LOOED: MOV 32H ,A
SJMP $
LOOP1: MOV A,31H ;异号被减数大,值小
6
SJMP ED ;
YIHAO: MOV A,30H ;异号,哪个正,其值大
JNB ACC.7,LOOP0 SJMP LOOP1 END
解二:把两个数分别扩展成双字节的带符号数,再将两个双字节的带符号数相减,符号位为正,表示被减数大,反之则小。(若正数,扩展的高字节为00H,若负数,扩展的高字节为FFH)
;;;;;;;;;;;;;;;;;;;;;;;;
;; 习题4-6b 参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H
SJMP START
ORG 0030H
START: MOV 21H,30H ; 将30H的带符号数扩展成双字节存放在20H
MOV 20H,#00H ;(高)、21H(低)中
JNB 0FH,LOOP1 ; bitOFH=21H.7
MOV 20H,#0FFH ;
LOOP1: MOV 23H,31H ; 将31H的带符号数扩展成双字节存放在20H;;
MOV 22H,#00H ;(高)、21H(低)中 JNB 1FH,LOOP2 ; bit1FH=23H.7
MOV 22H,#0FFH ;
LOOP2: CLR C ;将20H、21H内容减22H、23H MOV A, 21H ; SUBB A, 23H ; MOV A, 20H ;
SUBB A, 22H ;
JNB ACC.7,LOOP0 ;差为正,20H、21H数大,即30H数大
MOV A,31H ;差为负,22H、23H数大,即31H数大 ED: MOV 32H ,A SJMP $ ; LOOP0: MOV A,30H ; SJMP ED
END
4—8 利用逻辑尺控制的方法,设计一个主程序,在第1、3、5、6次调用SBI子程序,第2、4、7、8次调用SB2子程序。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 习题4-8 参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG 0000H SJMP TEST ORG 0030H
7
TEST: MOV R2,#08H MOV A, #10101100B LOOP: RLC A JC LOOP1 LCALL SBI SJMP RELT LOOP1: LCALL SB2 RELT: DJNZ R2,LOOP SJMP $ PRGO: RET
PRG1: RET END 4—9 将DATA单元存放的以ASCII码表示的16进制数转换成十进制数存放于DATA+1单元。
解:先将DATA单元的ASCII码转换成十六进制的数,再转转成十进制的数。
数字的ASCII码转成十六进制数(即为十进制数)采用减30H
字母的ASCII码转成十六进制数采用减37H,十六进制再转十进制可采用先减0AH,再加10H;这样-37H-0AH+10H=-31H,可采用直接减31H。
1、数字与字母的ASCII的区别,可采用对D6的检测D6=1为字母的ASCII码,反之为数字的ASCII码。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 习题4-9 a 参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG 0000H 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 DATA1+1,A ;入存 SJMP $ ;结束
LOOP1: SUBB A,#31H ;是字母,减31H SJMP ED ; DATA1 EQU 30H
END
2、数字与字母的ASCII的区别,也可采用与3AH相比较,若大于它则为字母的ASCII码,反之为数字的ASCII码。也可先减30H,再对D4位进行检测,若为1则为字母的ASCII码,可再减1,即为它所对应的十进制数。反之为数字的ASCII码的十进制数。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 习题4-9b 参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8
ORG 0000H
SJMP TEST ORG 0030H TEST: MOV R0, #DATA1
MOV A,@R0 ; 将DATA1的数给A CLR C ; 进位位清零 LOOP: SUBB A,#30H ; 先减30H JB ACC.4,LOOP1 ; 是字母,转LOOP1 ED: MOV DATA1+1,A ; 入存 SJMP $ ; 结束
LOOP1: SUBB A,#01H ; 是字母,减31H SJMP ED ; DATA1 EQU 30H
END
4—10 编一个将十六进制数转换成十进制数的子程序。
1、编一个单字节(内部数据存储器30H)的十六进制数转换成十进制数的子程序 2、编一个将内部数据存储器30H起始的10个字节的十六进制数转换成十进制数,从40H起始存放的子程序
1解、一个单字节的十六进制的数转成十进制数一般考虑用二个字节BCD码来 存放。 设转换后的数存放在R3(高)、R4(低)中。 思路;a、一种可将其分离成高、低半字节,高半字节的数可通过查表转成BCD码,而后与低半字节相加(DA A)调整;
b、也可将高半字节的数作为计数器,以16(BCD)连续累加计数器的次数,
而后与低半字节相加(DA A)调整;
c、将单字节的十六进制(即为二进制数),反复用乘2(用自己加自己再进
行DA A调整)加低位的算法,进行编程。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 习题4-10a 参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG 0000H
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 ;
9
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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 习题4-10b 参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG 0000H SJMP TEST ORG 0030H
TEST: MOV R3,#00H ; MOV R4,#00H ; MOV A,30H
ANL A,#0F0H
SWAP A ;
MOV R2,A ; 高半字节分离作为R2的计数长度N LOOP: MOV A,R4 ; ADD A,#16H DA A
MOV R4,A MOV A,R3 ADDC A,#00H
DA A
MOV R3,A ; R3、R4+16
DJNZ R2,LOOP ; R3、R4 +16 X N MOV A,30H ANL A,#0FH ; ADD A,R4 ; DA A ; MOV R4,A ;
10
MOV A,R3 ;
ADDC A,#00H ; DA A ;
MOV R3,A ;R3、R4加原数的低半字节(DA A) RET ; END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 习题4-10c 参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG 0000H
SJMP CONVONE ORG 0030H CONVONE: MOV A,30H
CONVONE1: MOV R3,#00H ;
MOV R4,#00H ; R3、R4清零 MOV R2,#08H ; 设移位计数长度 MOV R5,A ; 取数暂存R1 LOOP: MOV A,R5 RLC A
MOV R5,A ; 原数左移一位 MOV A,R4
ADDC A,R4 DA A
MOV R4,A MOV A,R3
ADDC A,R3 DA A
MOV R3,A ; R3、R4乘2加低位
DJNZ R2,LOOP ; 8次移位未结束继续循环
RET ;
END
2解、以上题C的求解作为单字节转换的子程序CONVONE1,其人口条件为:转换的数放在A中;出口条件;转换后的数在R3、R4中。
;;;;;;;;;;;;;;;;;;;;;;;;
;; 习题4-10c 参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H SJMP START ORG 0030H START: MOV R0,#30H MOV R1,#40H MOV R6,#10
ST1: MOV A,@R0
11
ACALL CONVONE1
MOV @R1,03H INC R1
MOV @R1,04H INC R1
INC R0 DJNZ R6,ST1 SJMP $
CONVONE: MOV A,30H
CONVONE1: MOV R3,#00H ;
MOV R4,#00H ; R3、R4清零 MOV R2,#08H ; 设移位计数长度 MOV R5,A ; 取数暂存R5 LOOP: MOV A,R5 RLC A
MOV R5,A ; 原数左移一位 MOV A,R4 ADDC A,R4 DA A MOV R4,A
MOV A,R3 ADDC A,R3 DA A
MOV R3,A ; R3、R4乘2加低位
DJNZ R2,LOOP ; 8次移位未结束继续循环 RET ;
END 4—11 编一程序,将存储区DATAl单元开始的20个单字节数据依次与DATA2单元为起始地址的20个单字节数据进行交换。 1、设DATA1、DATA2分别为内部RAM 30H和50H单元。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 习题4-11a 参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 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 ; 源地址数据与目标地址数据交换
12
INC R0 ; 源地址指针修正
INC R1 ; 目标地址指针修正
DJNZ R6,LOOP ; 计数长度减1,不等于0继续循环 RET ; END 2、设DATA1、DATA2分别为内部RAM 30H和外部RAM 1000H单元。 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 习题4-11b 参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG 0000H
SJMP START ORG 0030H
START: MOV R0,#30H ; 建立源地址指针 MOV DPTR,#1000H ; 建立目标地址指针 MOV R6,#20 ; 置计数长度
LOOP: MOVX A,@DPTR ; 取源地址数据
XCH A,@R0 ;
MOVX @DPTR,A ; 源地址数据与目标地址数据交换 INC R0 ; 源地址指针修正
INC DPTR ; 目标地址指针修正
DJNZ R6,LOOP ; 计数长度减1,不等于0继续循环 RET ; END 3、设DATA1、DATA2分别为外部RAM 1040H单元和外部RAM 2030H单元 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 习题4-11c 参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG 0000H SJMP START ORG 0030H
START: MOV R0,#30H ; 建立源地址指针 MOV R1,#40H ; 建立目标地址指针 MOV R6,#20 ; 置计数长度 LOOP: MOV P2,#10H
MOVX A,@R0 ; 取源地址数据 MOV B,A ; 暂存
MOV P2,#20H
MOVX A,@R1 ; 取目标地址数据 MOV P2,#10H
MOVX @R0,A ; 将目标地址数据传送到源地址 MOV A,B
MOV P2,#20H ; 源地址数据与目标地址数据交换 MOVX @R1,A ; 将源数据传送到目标地址 INC R0 ; 源地址指针修正
13
INC R1 ; 目标地址指针修正
DJNZ R6,LOOP ; 计数长度减1,不等于0继续循环
RET ; END
4—12 试编写一程序,将存储区DATAl单元开始的50个单字节数逐一移至DATA2单元开始的存储区中。
解:本题只是数据单向传送,比上题交换更简单。将上题各解中的红色部分指令去掉即可。
4—13 试编一采用查表法求1—20的平方数子程序(要求:x在累加器A中,1≤x≤20,平方数高位存在R6,低位在R7 )。
解1:为编程方便起见,每一数的平方在表中统一用双字节来存放,这样只要把数乘2加表头地址,就可以找到对应的平方数的高字节存放的地址,连续取两个字节即可。 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 习题4-13a 参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 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: DB 00H,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指令加上。
解2:若平方数用十六进制表示,为节约平方表的存储空间,平方表按不等字节存放。 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 习题4-13b 参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H
14
SJMP START
ORG 0030H
START: MOV DPTR,#TAB ; 建立源地址指针 DEC A
MOV B,A ; 数X-1暂存(作变址用) CJNE A,#0FH,LOOP1
LOOP1: JNC LOOP ; 平方是双单字节,转LOOP MOVC A,@A+DPTR ; 平方是单字节,取数存R5 MOV R5,A ; 地址;基址TAB+变址(X-1) MOV R6,#00H ; (R6)=0; SJMP ED
LOOP: ADD A,B ;平方是双单字节
CLR C ;平方数的高字节地址:基址+变址 SUBB A,#0FH
MOV B,A ;变址;15+(X-16)*2=2X-15 LOOP2: MOVC A,@A+DPTR
MOV R5,A ;取平方数的高字节存R5 INC DPTR MOV A,B
MOVC A,@A+DPTR
MOV R6,A ;取平方数的低字节存R6
ED: RET
TAB: DB 01H,04H,09H,10H,19H,24H,31H,40H,51H,64H ;平方数用BCD表示(也可用十六进制表示)
DB 79H,90H,0A9H,0C4H,0E1H,01H,00H,01H,21H
DB 01H,44H,01H,69H,01H,90H END
解3:当然求一个单字节数的平方,也可单字节用自乘(用MUL 指令) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 习题4-13c 参考答案 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H SJMP START ORG 0030H START: MOV B,A MUL AB MOV R5,B MOV R6,A RET
END
4—14 试编写一个三字节无符号数乘法程序。 4—15 试编写一个三字节无符号数除法程序。
15
正在阅读:
mcs51单片机第四章习题解答11-01
潍坊一中学案双曲线的标准方程及拓展案06-15
重庆理工大学机械原理试卷201-20
龙湖 - 颐和原著 - 别册文案 -01-24
丰富多彩的暑假生活作文500字07-10
丰富多彩的课余生活作文400字07-03
分享葛兰素史克电话面试经历01-18
我的受教育经历12-13
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 第四章
- 单片机
- 习题
- 解答
- mcs51
- 脑筋急转弯1
- 基于链接分析的我国省级政府门户网站灰色关联度测评
- 北京四中2008—2009学年度第二学期期中测试初二年级数学
- JAVA语言程序设计模拟题
- 民用核安全设备设计制造安装无损检验许可证扩证申请审批程序
- 未成年人保护法学习笔记
- 矿井通风管理 - 图文
- 1049号四川省发展和改革委员会
- 提单发票箱单练习2
- 开关柜触头测温装置
- 无仓储危化品经营单位应急预案 - 图文
- 民用核安全设备设计制造安装无损检验许可证扩证申请审批程序
- 最新机关事业单位工人汽车驾驶员高级、技师国家题库练习题精选455题(附答案)
- 医学统计学总结
- 液化石油气试题14.8
- 生产者和消费者问题
- 中国盐汽水行业市场前景分析预测年度报告(目录) - 图文
- 2016-5-8课堂笔记之生成树基础
- 辽源市卫生学校实训基地建设项目
- 单像空间后方交会和双像解析空间后方-前方交会的算法程序实现