双字节无符号数加法.docx

上传人:b****5 文档编号:27650398 上传时间:2023-07-03 格式:DOCX 页数:16 大小:138.48KB
下载 相关 举报
双字节无符号数加法.docx_第1页
第1页 / 共16页
双字节无符号数加法.docx_第2页
第2页 / 共16页
双字节无符号数加法.docx_第3页
第3页 / 共16页
双字节无符号数加法.docx_第4页
第4页 / 共16页
双字节无符号数加法.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

双字节无符号数加法.docx

《双字节无符号数加法.docx》由会员分享,可在线阅读,更多相关《双字节无符号数加法.docx(16页珍藏版)》请在冰豆网上搜索。

双字节无符号数加法.docx

双字节无符号数加法

双字节无符号数加法

 

 

————————————————————————————————作者:

————————————————————————————————日期:

 

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 天文地理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1