双字节无符号数加法.docx
- 文档编号:27650398
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:16
- 大小:138.48KB
双字节无符号数加法.docx
《双字节无符号数加法.docx》由会员分享,可在线阅读,更多相关《双字节无符号数加法.docx(16页珍藏版)》请在冰豆网上搜索。
双字节无符号数加法
双字节无符号数加法
————————————————————————————————作者:
————————————————————————————————日期:
1双字节无符号数加法
例1:
双字节无符号数加法(R0R1)+(R2R3)→(R4R5),
R0、R2、R4存放16位数的高字节,R1、R3、R5存放低字节。
已知(R0R1)=(93h,79h);(R2R3)=(25h,a4h)
假设其和不超过16位。
请编程。
提示:
由于不存在16位数加法指令,所以只能先加低8位,后加高8位,而在加高8位时要连低8位相加时产生的进位一起相加。
查看psw中的标志CY=?
OV=?
AC=?
P=?
。
熟悉软件环境,要求能知道在哪里看数据的值,在哪里能看一些寄存器的内容,在哪里看程序代码。
如何在伟福软件环境下建立项目,运行文件。
要求按照标准模式来写程序,
ORG0000H
LJMPSTART
ORG0050H
START:
MOVR1,#79H
MOVR3,#0A4H
MOVA,R1
ADDA,R3
MOVR5,A
CLRA
MOVR0,#93H
MOVR2,#25H
MOVA,R0
ADDCA,R2
MOVR4,A
SS:
JMPSS
END
2双字节无符号数减法
例2:
双字节无符号数相减(R0R1)-(R2R3)→(R4R5)。
R0、R2、R4存放16位数的高字节,R1、R3、R5存放低字节,已知(R0R1)=(93h,79h);(R2R3)=(25h,a4h);请编程。
同学自己可以设置被减数与减数数值
提示:
先减低8位,后减高8位和低位减借位。
由于低位开始减时没有借位,所以要先清零。
ORG0000H
LJMPSTART
ORG0050H
START:
MOVR0,#93H
MOVR1,#79H
MOVR2,#25H
MOVR3,#0A4H
MOVA,R1
SUBBA,R3
MOVR5,A
CLRA
MOVA,R0
SUBBA,R2
MOVR4,A
SS:
JMPSS
END
3双字节数乘以单字节数
例3:
利用单字节乘法指令,进行双字节数乘以单字节数运算。
若被乘数为16位无符号数,地址为M1(30H)和M1+1(31H)(低位先、高位后),乘数为8位无符号数,地址为M2(32H),积由高位到低位存入R2、R3和R4三个寄存器中。
30H,31H,32H内容12H,34H,56H;
提示:
(M1+1)(M1)
×(M2)
R3R4;是M2乘M1的高8位,低8位
+BA;是M2乘M1+1的高8位,低8位
R2R3R4
org0000h
ljmpstart
org0050h
start:
Mov30h,#12h
mov31h,#34h
mov32h,#56h
mova,30h
movb,32h
mulab;低八位存A,高八位存B
movr4,a
movr3,b
clra
clrb
mova,32h
movb,31h
mulab
adda,r3
movr2,b
ss:
jmpss
end
4.把8位二进制数转换为3位BCD
例4:
利用除法指令把累加器A中的8位二进制数转换为3位BCD数,并以压缩形式存放在地址M1、M2单元中。
设A中放A8H,M1、M2单元地址是30H,31H
提示:
累加器A中的8位二进制数,先对其除以100(64H),商数即为十进制的百位数;余数部分再除以10(0AH),所得商数和余数分别为十进制十位数和个位数,即得到3位BCD数。
百位数放在M1中,十位、个位数压缩BCD数放在M2中,十位与个位数的压缩BCD数的存放是通过SWAP和ADD指令实现的。
org0000h
ljmpstart
org0050h
start:
mova,#0a8h
movb,#64h
divab
mov30h,a
clra
mova,b
clrb
movb,#0ah
divab
swapa
adda,b
mov31h,a
ss:
jmpss
end
5双字节压缩BCD码加法
例6:
双字节压缩BCD码加法。
设R5(高)、R4(低)为被加数;R3(高)、R2(低)为加数,相加和的结果存入:
R6(万)、R5(千、百)、R4(十、个)。
被加数98H,76H;加数54H,32H
org0000h
ljmpstart
org0050h
start:
movr5,#98h
movr4,#76h
movr3,#54h
movr2,#32h
mova,r2
adda,r4
daa
movr4,a
clra
mova,r5
addca,r3
daa
movr5,a
clra
addca,#00h
movr6,a
ss:
jmpss
end
6利用DPTR取数据,并保持DPTR原数不变
例6:
若在外部ROM/EPROM中2000H单元开始依次存放0~9的平方值,原来数据指针(DPTR)=3A00H,请用查表指令取出2003H单元的数据后,要求保持DPTR中的内容不变。
org0000h
LJMPmain
org2000h
tab1:
db0,1,4,9,16,25,36,49,64,81
main:
mova,#03h
movdptr,#3a00h
pushdpl
pushdph
movdptr,#tab1
movca,@a+dptr
popdpl
popdph
ss:
jmpss
end
716位数的算术左移
16位数的算术左移。
16位数在内存中低8位存放在M1单元,高8位存放在M1+1单元。
16位数是1234H,M1为30H,M2为31H
提示:
所谓算术左移就是将操作数左移一位,并使最低位补充0,相当于完成16位数的乘2操作,故称算术左移。
org0000h
Ljmpstart
org0050h
start:
mov30h,#34h
mov31h,#12h
mova,30h
RLCa
mov30h,a
mova,31h
RLCa
mov31h,a
ss:
jmpss
End
8比较内部RAMI、J单元中A、B两数的大小
例3:
比较内部RAMI、J单元中A、B两数的大小,设A、B数均为带符号数,以补码数存入I、J中,若A=B,则使内部RAM的位K置1;若A≠B,则大数存M单元,小数存N单元。
设内部RAMI、J是30H,40H;(A)=58H,(B)=97H
M单元=50H,N单元=60H,位K=00H
该带符号数比较子程序的比较过程示意图如图3―9所示。
org0000h
Ljmpstart
org0050h
start:
Iequ30h
Jequ40h
Mequ50h
Nequ60h
mov30h,#58h
mov40h,#97h
MOVA,I
ANLA,#80H;判A数的正负
JNZNEG;A<0则转至NEG
MOVA,J
ANLA,#80H;判B数的正负
JNZBIG1;A≥0,B<0,转BIG1
SJMPCOMP;A≥0,B≥0,转COMP
NEG:
MOVA,J
ANLA,#80H;判B数的正负
JZSMALL;A<0,B≥0,转SMALL
COMP:
MOVA,I
CJNEA,J,BIG;A≠B则转BIG
SETB00h;A=B,位K置1
JMPWAIT
BIG:
JCSMALL;A
BIG1:
MOVM,I
MOVN,J
JMPWAIT
SMALL:
MOVM,J
MOVN,I
WAIT:
JMPWAIT
here:
sjmphere
ss:
jmpss
end
9双字节压缩BCD码转换成二进制码
例2:
双字节压缩BCD码转换成二进制码子程序。
提示:
该转换的算法为:
(d3d2d1d0)BCD=(d3×10+d2)×100+(d1×10+d0)
实现该算法的参考子程序如下:
入口:
R5(千位、百位)、R4(十位、个位)为BCD码。
出口:
R5R4(16位无符号二进制整数)。
ORG0000H
LJMPMAIN
ORG0030H
MAIN:
MOVA,R5;(A)←d3d2(千位、百位)
MOVR2,A;(R2)←d3d2
ACALLCHANGE;调子程序实现d3×10+d2→A
MOVB,#64H;(B)←100
MULAB;(d3×10+d2)×100
MOVR6,A;R6暂存乘积低8位
XCHA,B;乘积高8位送A
MOVR5,A;R5暂存乘积高8位
MOVA,R4;(A)←d1d0(十位、个位)
MOVR2,A;(R2)←d1d0
ACALLCHANGE;调子程序实现d1×10+d0→A
ADDA,R6;(A)←(R6)+(A)
MOVR4,A;R4存转换后16位数低8位
MOVA,R5;(A)←(R5)
ADDCA,#00H;(A)←(R5)+低8位和的进位C
MOVR5,A;R5存转换后16位数高8位
SS:
JMPSS
ORG200H
BCD2B:
MOVA,R2;(A)←(d1d0)BCD
ANLA,#0F0H;取高位BCD码d1
SWAPA;(A)=0d1H
MOVB,#0AH;(B)←10
MULAB;d1×10
MOVR3,A;R3暂存乘积结果
MOVA,R2;(A)←(d1d0)BCD
ANLA,#0FH;取低位BCD码d0
ADDA,R3;d1×10+d0
MOVR2,A;保存转换结果
RET;子程序返回
END
CHANGE:
MOVR2,A
ANLA,#0F0H
SWAPA
MOVB,#0AH
MULAB
MOVR3,A
MOVA,R2
ANLA,#0FH
ADDA,R3
RET
END
10冒泡排序
有8个数据存放在20H为首地址的内部RAM,进行升序排列编程,原始数据:
39,27,13,44,78,22,6,51;设R7为比较次数计数器,初始值为07H,F0为标志位,F0=0表明无互换发生,F0=1表明有互换发生
提示:
程序流程图如下
ORG0000H
LJMPSTART
ORG0050H
START:
MOVR3,#0AH
MOVR0,#20H
MOVDPTR,#TABLE
LOOP1:
MOVA,#00H
MOVCA,@A+DPTR
MOV@R0,A
INCR0
INCDPTR
DJNZR3,LOOP1
LOOP3:
MOVR3,#0AH
MOVR4,#0AH
MOVR0,#20H
MOVR1,#21H
LOOP2:
MOVA,@R1
CLRC
SUBBA,@R0
JCGO
JMPRETURN
GO:
MOVA,@R1
XCHA,@R0
MOV@R1,A
RETURN:
INCR0
INCR1
DJNZR3,LOOP2
DJNZR4,LOOP3
JMP$
ORG2000H
TABLE:
DB0FEH,39H,27H,13H,44H,78H,22H,06H,51H,01H,0A3H
END
11中断方式下定时器应用设计
设单片机的晶振为12MHz,,定时器0方式0工作,产生1ms定时,在P1.0引脚上输出周期为2ms的方波,中断方式完成,试设计程序。
ORG0000H
LJMPINT
ORG2000H
MOVTMOD,#00H;设置工作方式
MOVTH0,#0E0H;装入初值
MOVTL0,#18H
SETBEA
SETBET0
SETBTR0
SJMP$
INT:
MOVTH0,#0E0H
MOVTL0,#18H
CPLP1.0;取反输出方波
RETI
12查询方式下定时器应用设计
设单片机的晶振为12MHz,,定时器0方式0工作,产生1ms定时,在P1.0引脚上输出周期为2ms的方波,查询方式完成,试设计程序.
ORG0000H
LJMPLOOP1
ORG2000H
MOVTMOD,#00H
MOVTH0,#0E0H
MOVTL0,#18H
MOVIE,#00H;禁止中断
SETBTR0;启动计数
LOOP:
JBCTF0,LOOP1;查询计数溢出自动清TR0
SJMPLOOP
LOOP1:
CLRTF0
CPLP1.0
MOVTH0,#0E0H
MOVTL0,#18H
SJMPLOOP
END
13中断方式下定时器应用设计
设片内RAM的70H单元的初值为01H,要求每1秒钟将其内容左环移一位,采用定时器T1,采用定时方式1,晶振频率为6MHz。
中断方式完成,试设计程序。
ORG0000H
LJMPMAIN
ORG001BH;T1中断入口
LJMPINT
ORG2000H
MAIN:
MOVTMOD,#10H;T1工作于方式1
MOVTH1,#3CH
MOVTL1,#0B0H
SETBEA
SETBET1
SETBTR1
MOV70H,#01H
MOVR0,#0AH;设置软件计数器
HALT:
SJMPHALT
INT:
DJNZR0,NEXT
MOVA,70H
RLA
MOV70H,A
MOVR0,#0AH
NEXT:
MOVTH1,#3CH
MOVTL1,#0B0H
RETI
END
分析:
当晶振频率为6MHz时,一个定时器的最大定时值为131ms,现要求定时1s,已超过该最大定时值,故只能采用定时器定时和软件计数相结合的方法来扩展定时时间。
在本例中,要获得1s定时,可将定时器的定时值设为100ms,另设一个软件计数器(常用Rn寄存器),初值为10。
每100ms定时时间一到,产生定时溢出中断,在中断服务程序中首先使软件计数器减1,若不为0,则立即退出中断;若已减为0,说明1s定时时间已到,可进入中断处理。
当中断处理完后,再重新设置软件计数器。
其它要求与前例类似。
①计算计数初值:
采用定时方式1(16位),计数初值为:
x=3CB0H(参阅例2)。
②确定TMOD方式字:
对于定时器T1来说,M1M0=01、C/T=0、GATE=0,而定时器T0不用,取为全0。
于是TMOD=00010000B=10H
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 字节 符号 加法