多字节、多进制加法运算实验报告

更新时间:2023-11-01 19:49:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

多字节、多进制加减运算

学生: 何绍金 学号: 201203870408

专业班级:自动化1202

指导老师: 杨东勇

2014年12月

一、实验目的

1. 学习多字节压缩 BCD 码加减法运算的程序设计; 2. 学习单字节有符号数加减运算的程序设计。

二、实验设备

统一电子开发平台

三、实验要求

1.编写通用 4 字节压缩 BCD 码的加、减法运算程序; 2.编写通用单字节有符号二进制数加、减法运算程序;

四、实验原理(单字节带符号数加法运算)

对于简单的8 位加减可以直接调用指令就可以了。例如加法可以使用指令ADD 以及带进位加ADDC,但单字节加减法只能在256 之内进行运算;在实际应用中经常需要进行多字节运算,从而处理更大的数据。该实验介绍单片机BCD 码多字节加、减运算通用程序的设计。

五、实验过程

1.多字节无符号压缩BCD 码加法运算假设多字节无符号被加数的最低字节的地址为R0,加数的最低字节地址为R1,字节数共为len;计算结果的地址于被加数相同。

(1)入口参数:

R0:被加数地址指针; R1:加数地址指针; len:字节数。 (2)出口参数: @R0:计算结果;

rLen:计算结果字节数。

(3)使用资源:ACC,R0、R1,内部RAM 单元len、rlen 及存放被加数、加数、计算结果的内存单元。 示例程序如下:

;多字节无符号压缩BCD 码加法运算 rlen data 30h; 存放计算结果字节数 len data 31h; 存放相加字节数

; r0 定位40h,r1 定位50h

; 此处的程序的问题是前面字节的进位没有处理, ; 只是对最后字节相加处理了进位

ORG 0000h;

ADDl: PUSH PSW ;保护标志寄存器内容

CLR C ;进位位清0

MOV rlen,#00H ;和的字节数先清0 ADD: MOV A,@R0 ;取被加数 ADD A,@R1 ;求和

DA A ;十进制调整 MOV @R0,A ;保存 INC R0 ;地址增1 INC R1

INC rlen ;字节数增1

DJNZ len,ADD ;所有字节未加完继续,否则向下执行 JNC ADD20 ;和的最高字节无进位转ADD20 MOV @R0,#01H ;和的最高字节地址内容为01H INC rlen

ADD20: POP PSW

RET END

多字节加法运算一般是按从低字节到高字节的顺序进行的,所以必须考虑低字节向高字节的进位情况,被加数和加数的压缩BCD 码,最大不超过99,而99+99+1(进位)=199,此时不需要使用ADDC 指令,但当两字节当最低两字节相加后,必须使用“DA A”进行十进制调整,调整后产生进位。而最高两字节相加后应考虑是否有进位。若有进位,应向和的最高位字节地址写入01H,这时和数将比加数或被加数多出一个字节。

2.单字节带符号数加法运算 编程范例:

两个8 位二进制带符号数加法,被加数和加数分别存于BLK 和BLK+1 单元,和超过8 位要占两个单元,设为SUM 和SUM+1 单元。

解:两个带符号数的加法是作为补码加法处理的。由于和超过8 位,因此,和就是一个16 位带符号数,符号位在16 位数的最高位。为此,直接相加进位是不够的,还要做一些处理。例如-65 和-65 相加,若直接求和产生溢出,即使扩展到16 位,结果也不正确。如:

-65 1 0 1 1 1 1 1 lB

+) -65 1 0 1 1 1 1 1 1B 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 OB

现在这个16 位数的最高位为0,两个负数相加变为正数,显然是错误的。 处理的方法是先将8 位带符号数扩展成16 位带符号数,然后再相加。若是8 位正数,则高8 位扩展为00H;若是8 位负数,则高8 位扩展为0FFH。这样处理后,再按双字节相加,就可以得到正确的结果。如上例,由于是负数,高8 位应是全1,然后再加:

-65 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1B +) -65 1 1 1 1 1 1 1 1 1 0 1 l 1 1 1 1B

1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0B,

最高位的进位丢失不计。换算成真值为—130,结果正确。 在编程时,判别加数和被加数的符号位,再决定是否要将高8 位改为0FFH。 程序如下:

BLK DATA 30H SUM DATA 40H ORG 0000h MAIN:

MOV R0,#BLK ;R0 指向被加数 MOV R1,#SUM ;R1 指向和

MOV R2,#0 ;高8 位先设为0 MOV R3,#0

MOV A,@R0 ;取出被加数

JNB ACC.7,N1 ;若是正数转移到N1 MOV R2,#0FFH ;若是负数高8 位为全1 N1:INC R0 ;修改即指针 MOV B,@R0 ;取加数到B

JNB B.7,N2 ;若是正数转移N2

MOV R3,#0FFH ;若是负数高8 位为全1 N2:ADD A,B ;低8 位相加 . MOV @R1,A ;存低8 位和 INC R1 ;修改R1 指针 MOV A,R2 ;准备加高8 位 ADDC A,R3 ;高8 位相加 MOV @R1,A ;存高8 位和 SJMP $

END

3.多字节无符号压缩BCD 码减法运算

为了使用“DA A”指令对十进制减法进行调整,必须采用对减数求补相加的方法,以9AH 为模减去减数即得到减数的补数。设被减数低字节地址存在R1,减数低字节地址存在R0,字节数存在len;差的低字节地址存在R0,差的字节数存在rlen。

(1)入口参数: R0:减数地址指针; R1:被减数地址指针; len:字节数

(2)出口参数: R0:差的地址指针 R3:差的字节数

(3)使用资源: A,R0,R1,内部RAM 单元 范例程序如下:

rlen data 30h ; 存放计算结果字节数 len data 31h ; 存放相加字节数 ORG 0000h;

SUBCD: MOV rlen,#00H ;差字节单元清0 CLR 07H ;符号位清0 CLR C ;借位位清0 33

SUBBCD: MOV A,#9AH ;减数对模100 求补 SUBB A,@R0

ADD A,@R1 ;补码相加 DA A

MOV @R0,A ;存结果 INC R0 INC R1 1NC rlen

CPL C ;进位求反以形成正确借位

DJNZ len,SUBCDl ;未减完去SUBCDl,减完向下执行

JNC SUBCD2 ;无借位去别Ⅸm 返回主程序,否则继续 SETB 07H ;有借位,置“1”符号位 SUBCD2: RET

END

程序中对减数求补后与被减数相加,用“DA A”指令进行调整。若二者相加调整后结果无进位(C=0),则表示二者相减有借位;若二者相加调整后有进位(C;1),则表示二者相减无借位。所以必须对进位标志位C 进行求反操作,才能得到正确结果。

六、实验思考题

1.检查结果是否正确:打开资源管理窗口,键入DS:0030H,窗口便会显示从30H地址开始,寄存器的值,其中,30H是一加数的值,31H则是另一加数的值,在窗口中把30H值改为01,31H改为02,再次运行程序后,在资源管理中键入DS:0040H,40H地址显示的值便是03,结果符合要求。

2.分析 DA A指令的作用。

答:被加数A与加数R1都是以补码的形式进行运算,即形式上是十进制的相加,但在单片机中是以二进制进行运算即十六进制进行运算的,结果自然也就是二进制的,DA指令就是为了把结果调整为十进制的运算结果,但以二进制形式存储。

3.说明怎样处理单字节有符号数的减法? 答:先将8位带符号数扩展成16位带符号数,然后再相加。若是8位正数,则高8位扩展为00H;若是8位负数,则高8位扩展成0FFH。这样处理后,再按双字节相加,就可以得到正确的结果。

附:实验源代码:

1.程序清单和注释 BLK DATA 30H SUM DATA 40H ORG 0000h MAIN:

MOV R0,#BLK ;R0 指向被加数 MOV R1,#SUM ;R1 指向和

MOV R2,#0 ;高 8 位先设为 0 MOV R3,#0

MOV A,@R0 ;取出被加数

JNB ACC.7,N1 ;若是正数转移到 N1 MOV R2,#0FFH ;若是负数高 8 位为全 1 N1:INC R0 ;修改即指针 MOV B,@R0 ;取加数到 B

JNB B.7,N2 ;若是正数转移 N2

MOV R3,#0FFH ;若是负数高 8 位为全 1 N2:ADD A,B MOV @R1,A INC R1 MOV A,R2 ADDC A,R3 MOV @R1,A SJMP $ END

;低 8 位相加 . 8 位和 ;修改 R1 指针 ;准备加高 8 位 ;高 8 位相加 ;存高 8 位和 ;存低

本文来源:https://www.bwwdw.com/article/anv2.html

Top