单片机多字节BCD码加法减法
运用单片机进行加减乘除法的运算

运用单片机进行加减乘除法的运算
单片机介绍 单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示
驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。
单片微型计算机简称单片机,是典型的嵌入式微控制器(Microcontroller Unit),常用英文字母的缩写MCU表示单片机,它最早是被用在工业控制领域。
单片机由芯片内仅有CPU的专用处
理器发展而来。
最早的设计理念是通过将大量外围设备和CPU集成在一个芯
片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。
INTEL的Z80是最早按照这种思想设计出的处理器,从此以后,单片机和专用处理器的发展便分道扬镳。
看到这个题目,呵呵,可能好多人要打石头哥的板子;7+5等于几啊?
这还用你教?但是单片机里,数字是用二进制来表示的:这个就有一点拗口啦/ 虽然我们的教材到这里你可能还没有学会一个指令。
但是我的意思是首先作几个试验,提高大家对单片机的兴趣。
具体的指令太多了,不过还好,一般我们只需要记住常用的10-20条就够了。
OK,现在开始动手。
我们写入以下两条指令
MOV P1,#23H
END
这个程序大家想必看得懂,就是把23H这个16进制数送往P1口(即P1.0--P1.7)汇编得到HEX烧写后然后把芯片插入实验卡座;可以看到P1.0-1.7的状态为;。
BCD码加减法

BCD码加减法3、BCD码的加减运算由于编码是将每个十进制数用一组4位二进制数来表示,因此,若将这种BCD码直接交计算机去运算,由于计算机总是把数当作二进制数来运算,所以结果可能会出错。
例:用BCD码求38+49。
解决的办法是对二进制加法运算的结果采用"加6修正,这种修正称为BCD调整。
即将二进制加法运算的结果修正为BCD码加法运算的结果,两个两位BCD数相加时,对二进制加法运算结果采用修正规则进行修正。
修正规则:(1)如果任何两个对应位BCD数相加的结果向高一位无进位,若得到的结果小于或等于9,则该不需修正;若得到的结果大于9且小于16时,该位进行加6修正。
(2)如果任何两个对应位BCD数相加的结果向高一位有进位时(即结果大于或等于16),该位进行加6修正.(3)低位修正结果使高位大于9时,高位进行加6修正。
下面通过例题验证上述规则的正确性。
用BCD码求35+21 BCD码求25+37 用BCD码求38+49 用BCD码求42+95用BCD码求91+83 用BCD码求94+7 用BCD码求76+45两个组合BCD码进行减法运算时,当低位向高位有借位时,由于"借一作十六"与"借一作十"的差别,将比正确的结果多6,所以有借位时,可采用"减6修正法"来修正.两个BCD码进行加减时,先按二进制加减指令进行运算,再对结果用BCD调整指令进行调整,就可得到正确的十进制运算结果。
实际上,计算机中既有组合BCD数的调整指令,也有分离BCD数的调整指令。
另外,BCD码的加减运算,也可以在运算前由程序先变换成二进制数,然后由计算机对二进制数运算处理,运算以后再将二进制数结果由程序转换为BCD码。
4、8421BCD码、余3码、格雷码用四位二进制代码来表示一位十进制数,称为二--十进制编码,简称BCD(Binary Coded Decimal)码。
单片机实验多字节加减法

实验二实现多字节加(减)法一、 实验目的:a)熟悉单片机指令系统,b)学会用汇编语言编写计算程序二、 实验内容:(一)实验要求:正确建立工程文件、编写程序,会利用keil进行程序调试并观察运行结果。
z基本要求:编写程序,将存放在内部RAM起始地址为20H和30H的两个3字节无符号相加,结果存放在内部RAM单元70H、71H、72H中(低位对应低字节)。
数据要求初始化:参考将20H和30H分别存放两个三字节的无符号数333333H和222222H。
z提高要求:将基本要求中的“相加”改成“减法”,其它要求与基本要求相同,数据要求初始化:参考将20H和30H分别存放两个三字节的无符号数333333H和223344H。
编写相应的程序并给予适当的注释。
(二)实验基本步骤:1.打开Keil,新建工程:Project/New Project,输入工程名,并保存2.选项选择器件:Atmel 的89C513.新建程序文本,并另存为该文件为汇编文件格式: (1)“File/New”,(2) File/Save As/键入欲使用的文件名及后缀名,即“文件名.asm”。
再单击“保存”4.添加该文件该工程:回到编辑界面后,单击“Target 1”前面的“+”号,然后在“SourceGroup 1”上单击右键,单击“Add File to Group ‘Source Group 1’”选择刚才新建的汇编文件。
5.在keil的汇编文件中输入程序代码,并编译,调试。
(1)写完代码后单击“Project”菜单,再在下拉菜单中单击“Built Target”选项(或者使用快捷键F7),编译成功后(0个errors),(每次修改程序后都要重新编译下,才能生效)。
(2)再单击“Debug”菜单,在下拉菜单中单击“Start/Stop Debug Session”(或者使用快捷键Ctrl+F5),点击RUN进行运行,或者按F11进行单步运行。
单片机实验多字节加减法

实验二汇编语言程序设计(一)【实验目的】复习MCS-51单片机汇编语言的编辑、编译、调试方法,熟练掌握汇编语言程序设计的方法与技巧。
【实验内容】1.多字节加减法2.多字节乘法3.数据转换(选做)【实验原理】利用子程序调用在内部RAM单元中实现多字节的加法程序,并且把和再放回原单元中,其中R7是循环次数计数器,R0和R1分别作为加数和被加数指针。
1、多字节加法源程序:ORG 0000HMOV R0,#40HMOV R1,#50HMOV R7,#03HCLR CLOOP1: MOV A,@R0ADD A,@R1MOV @R0,AJNC LOOP2LOOP2: INC R0INC R1MOV A,R0DJNZ R7,LOOP1SJMP $END实验结果如下图:2、多字节乘法源程序:ORG 0000HQMUL: MOV A,R3MOV B,R7MUL ABXCH A,R7MOV R5,B MOV B,R2 MUL AB ADD A,R5 MOV R4,A CLR A ADDC A,B MOV R5,A MOV A,R6 MOV B,R3 MUL AB ADD A,R4 XCH A,R6 XCH A,B ADDC A,R5 MOV R5,A MOV F0,C MOV A,R2 MUL AB ADD A,R5 MOV R5,A CLR AMOV ACC.0,CMOV C,F0ADDC A,BMOV R4,AEND实验结果如下图:Welcome To Download !!!欢迎您的下载,资料仅供参考!。
单片机多字节加减乘除法程序

单片机多字节加减乘除法程序文章长度[6790]加入时间[2007-8-14]更新时间[2012-6-12 18:04:14]级别[0][评论][收藏]一种实用的单片机多字节除法算法一种实用的单片机多字节除法算法在单片机的实际应用中,除法运算是比较常见的一种运算。
以MCS-51单片机为例,虽然它提供了除法指令,但只能进行单字节除以单字节的运算,如果要进行多字节的除法运算,就得自己设计算法。
目前,许多资料上都介绍了四字节除以二字节的算法,但它们主要有以下几点不足:1.只能求出商,不能求出余数;2.在被除数高二位大于除数时,不能进行运算;3.商只有两个字节。
例如,被除数是0FFFFFFFFH,除数是0004H时,商数应该是3FFFFFFFH,余数是0003H。
但是,用以前的算法是无法进行运算的。
在实际运用中,参与运算的数是任意的,有时需要求出余数,有时商数要求有四个字节,因此,以前的算法在实际应用中受到了很大的限制。
为了满足实际运用中的需要,我设计了一套新的四字节除以二字节的算法,克服了上述算法中的缺点,可以适合广泛的实际需要。
下面以MCS-51汇编语言为例进行说明。
该算法增加了两字节的余数单元,并把被除数单元用来存放商数。
运算时,首先判断除数是否为零,若为零时,则设溢出标志为1,然后退出。
若除数不为零,则采用移位相减法进行运算。
首先,把进位位和余数单元清零。
再将进位位、余数单元和被除数单元按顺序首尾相连,逐位进行向左循环移位(如图示),共移位32次。
每移位一次,余数单元都 C (H L)(HH HL LH LL) 进位位余数单元被除数单元和除数作一次减法运算,若够减,余数单元内容更新为两者之差,并且将被除数最末一位置为1;若不够减,则余数单元内容保持不变,且将被除数最末一位置为0。
判断是否够减的方法是:在作减法之前,先保存进位位,再看作完减法后的进位位。
仅在作减法之前进位位为0,并且作减法之后进位位为1时判为不够减,其余情况均视为够减。
单片机多字节乘除法

二,用减法做除法: 用减法做除法:
例2 如何用减法做除法计算十六进制89/2=44,余1。 如何用减法做除法计算十六进制89/2=44,余1 用一个空RAM0,RAM0位与除数最多用位数相同, 用一个空RAM0,RAM0位与除数最多用位数相同, 如除数2最多用4位,如除数是88最多用8 如除数2最多用4位,如除数是88最多用8位。 有下式: RAM1=1000 1001,RAM0=0000。和为一体为 1001,RAM0=0000。和为一体为 RAM= RAM=1000 1001 0000, RAM0最后保存的数为余数, RAM0最后保存的数为余数, 8位除以8位,多字节以此类推。 位除以8
直观如下:89( 直观如下:89(1000 1001)/2。结果为44,余1。 1001)/2。结果为44,余 RAM1 RAM0,RAM0为保存余数用。 RAM0,RAM0为保存余数用。 1000 1001 0000 1,0001 0010 0001 2,0010 0100 0010 0010 0101 0000 RAM0>=2,RAM0-2,RAM1+1。 RAM0>=2,RAM0RAM1+1。 3,0100 1010 0000 4,1001 0100 0000 5,0010 1000 0001 6,0101 0000 0010 0101 0001 0000 RAM0>=2,RAM0-2,RAM1+1。 RAM0>=2,RAM0RAM1+1。 7,1010 0010 0000 8,0100 0100 0001
步骤如下:
1,左移一位到C,结果 C=1,RAM= 0110 0000 1,左移一位到C 1,RAM= 2,C=1,则RAM0+2,RAM=0110 0010 2,C=1,则RAM0+2,RAM= 3,左移一位到C,结果 C=0,RAM=1100 0100 3,左移一位到C 0,RAM= 4,C=0,则RAM不加。 4,C=0,则RAM不加。 5,左移一位到C,结果 C=1,RAM= 1000 1000 5,左移一位到C 1,RAM= 6,C=1,则RAM0+2,RAM=1000 1010 6,C=1,则RAM0+2,RAM= 7,左移一位到C,结果 C=1,RAM= 0001 0100 7,左移一位到C 1,RAM= 8,C=1,则RAM0+2,RAM=0001 0110 8,C=1,则RAM0+2,RAM=
单片机bcd码的用法

单片机bcd码的用法
BCD码(Binary Coded Decimal)是一种将十进制数表示为二进制形式的编码方式。
它采用4位二进制数来表示一个十进制数的各个数字,每一位二进制数的取值范围为0-9。
单片机中可以使用BCD码进行数字的存储和显示。
下面是BCD码在单片机中的常见用法:
1. 存储:可以使用BCD码将数字存储到寄存器或内存中。
对于一个十进制数字,可以将其各个位的BCD码存储在相应的内存位置上,每个位置占用4位二进制数。
这样可以方便地访问和操作每个数字位。
2. 显示:将BCD码转换为对应的数字位,可以实现数字的显示。
单片机可以通过将BCD码送到数码管、LCD屏幕或其他显示设备上,来实现数字的显示。
3. 运算:单片机可以对BCD码进行加、减、乘、除等算术运算。
通过BCD码的相加或相减,可以实现两个数字的加法或减法。
通过BCD码的移位和逻辑运算,可以实现乘法或除法。
4. 输入输出:可以通过外部输入设备(如键盘)将BCD码输入到单片机中,也可以通过外部输出设备(如LED灯)将BCD码输出显示出来。
需要注意的是,BCD码虽然便于存储和显示数字,但占用的存储空间相对较大,且运算速度较慢。
在实际应用中,根据需求可以选择其他编码方式来表示数字,例如二进制、十六进制等。
微机原理与接口技术:加法减法运算指令

1. 加法运算指令和调正指令ADD,ADC,INC,AAA,DAA(1)不带进位的加法运算指令ADDADD指令完成两个操作数相加,并将结果保存在目的操作数中。
指令格式:ADD OPRD1, OPRD2功能:操作数OPRD1与OPRD2相加,结果保存在OPRD1中。
说明:操作数OPRD1可以是累加器AL或AX,也可以是其它通用寄存器或存储器操作数,OPRD2可以是累加器、其它通用寄存器或存储器操作数,还可以是立即数。
OPRD1和OPRD2不能同时为存储器操作数,不能为段寄存器。
ADD指令的执行对全部6个状态标志位产生影响。
例如:ADD AL, BL ;AL+BL结果存回AL中。
ADD AX, SI ;AX+SI结果存回AX中。
ADD BX, 3DFH ;BX+03DFH结果存回BX中。
ADD DX, DA TA[BP+SI] ;DX与内存单元相加,结果存回DX中。
ADD BYTE PTR[DI], 30H ;内存单元与30H相加,结果存回内存单元中。
ADD [BX], AX ;内存单元[BX]与AX相加,结果存回[BX]中。
ADD [BX+SI], AL ;内存单元与AL相加,结果存回内存单元中。
【例题3-3】求D9H与6EH的和,并注明受影响的标志位状态。
MOV AL, 0D9HMOV BL, 6EHADD AL, BL结果AL=47H,标志位CF=1,PF=1,AF=1,ZF=0,SF=0,OF=0(2)带进位的加法运算指令ADCADC指令完成两个操作数相加之后,再加上Flags的进位标志CF。
CF的值可能为1或0。
指令格式:ADD OPRD1, OPRD2功能:操作数OPRD1与OPRD2相加后,再加上CF的值,结果保存在OPRD1中。
说明:对操作数的要求与ADD指令一样。
例如:ADC AL, BLADC AX, BXADC [DI], 30HADC指令主要用于多字节数的加法运算,以保证低位向高位的进位被正确接收。
单片机实验报告——加减法

单片机实验一一、实验目的1.学习多字节压缩BCD 码加减法运算的程序设计;2.学习单字节有符号数加减运算的程序设计。
二、实验设备统一电子开发平台三、实验要求1.编写通用4 字节压缩BCD 码的加、减法运算程序;2.编写通用单字节有符号二进制数加、减法运算程序;四、实验原理对于简单的8 位加减可以直接调用指令就可以了。
例如加法可以使用指令ADD 以及带进位加ADDC,但单字节加减法只能在256 之内进行运算;在实际应用中经常需要进行多字节运算,从而处理更大的数据。
该实验介绍单片机BCD 码多字节加、减运算通用程序的设计。
1.多字节无符号压缩BCD 码加法运算假设多字节无符号被加数的最低字节的地址为R0,加数的最低字节地址为R1,字节数共为len;计算结果的地址于被加数相同。
◆入口参数:R0:被加数地址指针;R1:加数地址指针;len:字节数。
◆出口参数:@R0:计算结果;rLen:计算结果字节数。
◆使用资源:ACC,R0、R1,内部RAM 单元len、rlen 及存放被加数、加数、计算结果的内存单元。
示例程序如下:;多字节无符号压缩BCD 码加法运算rlen data 30h; 存放计算结果字节数len data 31h; 存放相加字节数; r0 定位40h,r1 定位50h; 此处的程序的问题是前面字节的进位没有处理,; 只是对最后字节相加处理了进位ORG 0000h;ADDl: PUSH PSW ;保护标志寄存器内容CLR C ;进位位清0MOV rlen,#00H ;和的字节数先清0ADD: MOV A,@R0 ;取被加数ADD A,@R1 ;求和DA A ;十进制调整MOV @R0,A ;保存INC R0 ;地址增1INC R1INC rlen ;字节数增1DJNZ len,ADD ;所有字节未加完继续,否则向下执行JNC ADD20 ;和的最高字节无进位转ADD20MOV @R0,#01H ;和的最高字节地址内容为01HINC rlenADD20: POP PSWRETEND多字节加法运算一般是按从低字节到高字节的顺序进行的,所以必须考虑低字节向高字节的进位情况,被加数和加数的压缩BCD 码,最大不超过99,而99+99+1(进位)=199,此时不需要使用ADDC 指令,但当两字节当最低两字节相加后,必须使用“DA A”进行十进制调整,调整后产生进位。
BCD码算术运算指令

表5.76所示梯形图程序及指令表的功能是: 5.76所示梯形图程序及指令表的功能是: 所示梯形图程序及指令表的功能是 当触发信号X0接通时,数据寄存器DT11 DT10中 X0接通时 DT11和 当触发信号X0接通时,数据寄存器DT11和DT10中 的内容和数据寄存器DT3 DT2中的内容相加 DT3和 中的内容相加, 的内容和数据寄存器DT3和DT2中的内容相加,相加的 结果存放在外部输出继电器WY2 WY1中 WY2和 结果存放在外部输出继电器WY2和WY1中。
8位BCD数据相加指令 二、F41(DB+) 8位BCD数据相加指令
当触发信号接通时, 当触发信号接通时,由S指定的8位BCD常 指定的8 BCD常 数或8 BCD数据与由 指定的8 BCD数据相加 数据与由D 数据相加, 数或8位BCD数据与由D指定的8位BCD数据相加, 相加结果存放在(D+1,D) (D+1,D)中 相加结果存放在(D+1,D)中。 (D+1,D)+(S+1,S) D+1,D) (D+1,D)
表5.73所示梯形图程序及指令表的功能是: 5.73所示梯形图程序及指令表的功能是: 所示梯形图程序及指令表的功能是 当触发信号X0接通时,内部字继电器WR0 X0接通时 WR0和数据寄 当触发信号X0接通时,内部字继电器WR0和数据寄 存器DT1中的内容相加, DT1中的内容相加 存器DT1中的内容相加,相加的结果存放在内部字继电 WR0中 器WR0中。
表5.77所示梯形图程序及指令表的功能是: 5.77所示梯形图程序及指令表的功能是: 所示梯形图程序及指令表的功能是 当触发信号X0接通时,内部字继电器WR0 X0接通时 WR0的内容 当触发信号X0接通时,内部字继电器WR0的内容 减去数据寄存器DT1中的内容,内部字继电器WR0 DT1中的内容 WR0中 减去数据寄存器DT1中的内容,内部字继电器WR0中。
单片机24算术运算类指令分析

算术运算指令共有24条,算术运算主要是执行加、减、乘、除法四则运算。
另外MCS-51指令系统中有相当一部分是进行加、减1操作,BCD码的运算和调整,我们都归类为运算指令。
虽然MCS-51单片机的算术逻辑单元ALU仅能对8位无符号整数进行运算,但利用进位标志C,则可进行多字节无符号整数的运算。
同时利用溢出标志,还可以对带符号数进行补码运算。
需要指出的是,除加、减1指令外,这类指令大多数都会对PSW(程序状态字)有影响。
这在使用中应特别注意。
[1]. 加法指令(4条)这4条指令的作用是把立即数,直接地址、工作寄存器及间接地址内容与累加器A的内容相加,运算结果存在A中。
ADD A,#data ;(A)+#data→(A)累加器A中的内容与立即数#data相加,结果存在A中ADD A,data ;(A)+(data)→(A)累加器A中的内容与直接地址单元中的内容相加,结果存在A中ADD A,Rn ;(A)+(Rn)→(A)累加器A中的内容与工作寄存器Rn中的内容相加,结果存在A中ADD A,@Ri ;(A)+((Ri))→(A)累加器A中的内容与工作寄存器Ri 所指向地址单元中的内容相加,结果存在A中这些指令所用到的源操作数都是累加器ACC,目的操作数则根据自已的需要来选择。
上述这四条指令的用途是:将A中的值与后面的值相加,最终结果存回到累加器A中。
例:MOV A,#30H ADD A,#10H则执行完本条指令后,A中的值就是40H下面的题目请大家自行练习MOV 34H,#10HMOV R0,#13HMOV A,34HADD A,R0MOV R1,#34HADD A,@R1练习题说明:MOV 34H,#10H这条指令的目的是将立即数10H送入34H这个存储单元MOV R0,#13H这条指令的目的是将立即数13H送入R0这个寄存器MOV A,34H这条指令大家要特别注意了,这条指令的源操作数在哪里呢?它的源操作数是在34H这个存储单元里,也就是34H是个存储单元,而不是一个数这条指令用的是直接寻址,大前看前面的指令,第一条指令将10H这个立即数送入了34H 这个存储单元。
51单片机数学运算

51单片机数学运算51单片机是一种常用的微控制器,具有广泛的应用领域。
在数学运算方面,51单片机可以进行基本的算术运算、逻辑运算和位运算等。
本文将介绍51单片机在数学运算方面的应用。
一、算术运算51单片机可以进行加法、减法、乘法和除法等基本的算术运算。
通过使用相关的指令,可以将数值存储在寄存器中,并进行各种算术运算。
例如,可以使用ADD指令将两个数相加,并将结果保存在某个寄存器中。
类似地,可以使用SUB指令进行减法运算,MUL指令进行乘法运算,DIV指令进行除法运算。
二、逻辑运算51单片机可以进行与、或、非和异或等逻辑运算。
逻辑运算常用于判断条件、控制程序流程和实现逻辑控制等。
通过使用相关的指令,可以将两个数进行逻辑运算,并根据结果进行相应的处理。
例如,可以使用AND指令进行与运算,OR指令进行或运算,NOT指令进行非运算,XOR指令进行异或运算。
三、位运算51单片机可以进行位移、与、或、非和异或等位运算。
位运算常用于处理二进制数据和位控制等。
通过使用相关的指令,可以对数据进行位运算,并根据需要进行相应的处理。
例如,可以使用MOV指令将数据移动到某个寄存器中,使用AND指令进行与运算,使用OR指令进行或运算,使用NOT指令进行非运算,使用XOR指令进行异或运算。
四、数值转换51单片机可以进行十进制和二进制、十六进制之间的转换。
通过使用相关的指令和算法,可以将不同进制的数值进行转换,并进行相应的处理。
例如,可以使用MOV指令将十进制数值转换为二进制或十六进制数值,使用CLR指令清除数据,使用INC指令增加数据,使用DEC指令减少数据。
五、数学函数除了基本的算术运算和逻辑运算,51单片机还可以进行一些常用的数学函数计算。
通过使用相关的库函数和算法,可以进行数值的平方、开方、对数、三角函数等计算。
例如,可以使用库函数sqrt计算一个数的平方根,使用库函数log计算一个数的自然对数,使用库函数sin计算一个角度的正弦值。
单片机多字节BCD码加法减法.

单片机多字节BCD码加法减法(1)标号:BCDA功能:多字节BCD码加法入口条件:字节数在R7中,被加数在[R0]中,加数在[R1]中。
出口信息:和在[R0]中,最高位进位在CY中。
影响资源:PSW、A、R2 堆栈需求:2字节BCDA: MOV A,R7 ;取字节数至R2中MOV R2,AADD A,R0 ;初始化数据指针MOV R0,AMOV A,R2ADD A,R1MOV R1,ACLR CBCD1: DEC R0 ;调整数据指针DEC R1MOV A,@R0ADDC A,@R1 ;按字节相加DA A ;十进制调整MOV @R0,A ;和存回[R0]中DJNZ R2,BCD1 ;处理完所有字节RET(2)标号:BCDB功能:多字节BCD码减法入口条件:字节数在R7中,被减数在[R0]中,减数在[R1]中。
出口信息:差在[R0]中,最高位借位在CY中。
影响资源:PSW、A、R2、R3 堆栈需求:6字节BCDB: LCALL NEG1 ;减数[R1]十进制取补LCALL BCDA ;按多字节BCD码加法处理CPL C ;将补码加法的进位标志转换成借位标志MOV F0,C ;保护借位标志LCALL NEG1 ;恢复减数[R1]的原始值MOV C,F0 ;恢复借位标志RETNEG1: MOV A,R0 ;[R1]十进制取补子程序入口XCH A,R1 ;交换指针XCH A,R0LCALL NEG ;通过[R0]实现[R1]取补MOV A,R0XCH A,R1 ;换回指针XCH A,R0RET(3)标号:NEG功能:多字节BCD码取补入口条件:字节数在R7中,操作数在[R0]中。
出口信息:结果仍在[R0]中。
影响资源:PSW、A、R2、R3 堆栈需求:2字节NEG: MOV A,R7 ;取(字节数减一)至R2中DEC AMOV R2,AMOV A,R0 ;保护指针MOV R3,ANEG0: CLR CMOV A,#99HSUBB A,@R0 ;按字节十进制取补MOV @R0,A ;存回[R0]中INC R0 ;调整数据指针DJNZ R2,NEG0 ;处理完(R2)字节MOV A,#9AH ;最低字节单独取补SUBB A,@R0MOV @R0,AMOV A,R3 ;恢复指针MOV R0,ARET。
汇编语言多字节BCD码加法减法

汇编语言多字节BCD码加法减法(1)标号:BCDA功能:多字节BCD码加法给大家介绍一个单片机汇编语言写的多字节BCD 码加法减法子程序入口条件:字节数在R7 中,被加数在[R0]中,加数在[R1]中。
出口信息:和在[R0]中,最高位进位在CY 中。
影响资源:PSW、A、R2 堆栈需求:2字节BCDA: MOV A,R7 ;取字节数至R2 中MOV R2,AADD A,R0 ;初始化数据指针MOV R0,AMOV A,R2ADD A,R1MOV R1,ACLR CBCD1: DEC R0 ;调整数据指针DEC R1MOV A,@R0ADDC A,@R1 ;按字节相加DA A ;十进制调整MOV @R0,A ;和存回[R0]中DJNZ R2,BCD1 ;处理完所有字节RET汇编语言多字节BCD 码加法减法(2)标号:BCDB功能:多字节BCD码减法入口条件:字节数在R7 中,被减数在[R0]中,减数在[R1]中。
出口信息:差在[R0]中,最高位借位在CY 中。
影响资源:PSW、A、R2、R3 堆栈需求:6字节BCDB: LCALL NEG1 ;减数[R1]十进制取补LCALL BCDA ;按多字节BCD码加法处理CPL C ;将补码加法的进位标志转换成借位标志MOV F0,C ;保护借位标志LCALL NEG1 ;恢复减数[R1]的原始值MOV C,F0 ;恢复借位标志RETNEG1: MOV A,R0 ;[R1]十进制取补子程序入口XCH A,R1 ;交换指针XCH A,R0LCALL NEG ;通过[R0]实现[R1]取补MOV A,R0XCH A,R1 ;换回指针XCH A,R0RET(3)标号:NEG功能:多字节BCD码取补汇编语言多字节BCD 码加法减法入口条件:字节数在R7 中,操作数在[R0]中。
出口信息:结果仍在[R0]中。
影响资源:PSW、A、R2、R3 堆栈需求:2字节NEG: MOV A,R7 ;取(字节数减一)至R2 中DEC AMOV R2,AMOV A,R0 ;保护指针MOV R3,ANEG0:。
bcd码的运算

bcd码的运算BCD码是一种常用的二进制编码形式,它采用4位二进制数来表示一个十进制数的每一位数字。
在计算机科学中,BCD码的运算是一项重要的技术,它在计算机系统中的数据处理和数值计算中起着重要的作用。
BCD码的运算涉及到加法、减法、乘法和除法等基本运算。
下面将分别介绍这些运算的原理和方法。
一、BCD码的加法运算BCD码的加法运算与二进制码的加法运算类似,但需要考虑到进位的情况。
具体步骤如下:1. 将两个BCD码的相应位数进行相加,得到一个4位的二进制数。
2. 如果相加结果大于9,则需要进位,进位的值为6。
3. 将进位与下一位的相加结果相加,重复上述步骤,直到所有位数相加完毕。
例如,将BCD码1010和0110相加:1 0 1 0+ 0 1 1 0-----------1 0 0 0二、BCD码的减法运算BCD码的减法运算与二进制码的减法运算类似,需要考虑到借位的情况。
具体步骤如下:1. 将被减数与减数的BCD码相应位数进行相减,得到一个4位的二进制数。
2. 如果相减结果小于0,则需要借位,借位的值为6。
3. 将借位与下一位的相减结果相减,重复上述步骤,直到所有位数相减完毕。
例如,将BCD码1010减去0110:1 0 1 0- 0 1 1 0-----------1 0 0 0三、BCD码的乘法运算BCD码的乘法运算是通过多次的加法运算实现的。
具体步骤如下:1. 将被乘数与乘数的BCD码的各位进行相乘,得到一个4位的二进制数。
2. 将相乘结果进行累加,得到最终的乘积。
例如,将BCD码1010乘以0011:1 0 1 0x 0 0 1 1-----------1 0 1 00 0 0 0 +-----------1 1 0 1四、BCD码的除法运算BCD码的除法运算是通过多次的减法运算实现的。
具体步骤如下:1. 将被除数与除数的BCD码进行相减,得到一个4位的二进制数。
2. 如果相减结果小于0,则继续向后一位借位,再进行相减。
南邮51单片机软件实验程序2----加减法运算

二、加减法运算1.实验目的(1)正确使用单片机的加减运算指令(2)掌握不同指令对于程序状态字的影响及程序状态字的意义、用处(3)掌握ADD,ADDC,SUBB和DA A等指令的用法(4)学习模块化程序设计方案2.实验内容(1)编写3字节二进制加法子程序,并用主程序调用不同的加数和被加数来检测该子程序的正确性。
需考虑有进位和无进位情况。
程序入口为:加数:22H,21H,20H三字节,22H为最高位被加数:32H,31H,30H三字节,32H为最高位程序出口为:23H,22H,21H,20H四字节,23H为最高位ORG 0000HLJMP MAINORG 0030HMAIN: MOV 20H,#0f0HMOV 21H,#0F0HMOV 22H,#0FFHMOV 30H,#02MOV 31H,#09MOV 32H,#05ACALL JIAFASJMP $JIAFA:MOV R0, #20H ;加数1地址、和的地址MOV R1, #30H ;加数2地址CLR CMOV R2, #3 ;循环3次A_LOOP:MOV A, @R0 ;取ADDC A, @R1 ;加MOV @R0, A ;存INC R0INC R1DJNZ R2, A_LOOPCLR AADDC A, #0 ;得到进位MOV 23H, A ;保存RETEND(2)编写3字节二进制减法子程序,用主程序调用多组数据来调试,需考虑无借位和有借位两种情况。
入口:被减数:52H,51H,50H,50H为最低位减数:42H,41H,40H,40H为最低位出口:差:外部数据存贮器2003H~2000H(2003H为最高位)ORG 0000HLJMP MAINORG 0030HMAIN:MOV 50H,#02MOV 51H,#09MOV 52H,#05MOV 40H,#30HMOV 41H,#30HMOV 42H,#30HACALL JIANFASJMP $JIANFA:MOV DPTR,#2000HMOV R0, #50H ;被减数地址MOV R1, #40H ;减数地址CLR CMOV R2, #3 ;循环3次A_LOOP:MOV A, @R0 ;取SUBB A, @R1 ;减MOVX @DPTR, A ;存INC R0INC R1INC DPTRDJNZ R2, A_LOOPCLR ASUBB A, #0 ;得到借位MOV DPTR,#2003HMOVX @DPTR, A ;保存RETEND(3)编写10位十进制加法子程序(十进制数采用压缩BCD码存放)入口:加数:24H-20H,低地址放低字节被加数: 29H-25H,低地址放低字节要求调用多组数据调试,注意观察PSW的变化,理解DA A指令的含义。
多字节加减程序

多字节加/减程序实验通信1班李耀东23320112204128一.实验目的(1)掌握多字节二进制,BCD码加减运算程序的编程方法;(2)掌握多字节二进制,BCD码加减运算程序的调试方法;(3)掌握循环程序的编程方法;(4)了解调试程序的选区原则;(5)熟练掌握DEBUG中D,E,A,G等命令的使用。
二.实验内容(1)二进制加法78563412+FODEBC9A=016934F0ACCCDDEEFF+8899AABB=01557799BA(2)多字节压缩型BCD码的加法56868656+34654387=9152304387645425+76656522=0164301947(3)多字节非压缩型BCD码的加法08050607+08030704=010*******05020403+02080602=08010005(4) DATA SEGMENTDATA1 DB 4 DUP(?)DATA2 DB 4 DUP(?)DATA3 DB 5 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV SI,OFFSET DATA1MOV CX,DATA2-DATA1CLCNEXT:MOV AL,[SI]ADC AL,[SI+DATA2]NOPMOV [SI+DATA3],ALINC SILOOP NEXTMOV AL,0ADC AL,0MOV [SI+DATA3],ALMOV AH,4CHINT 21HCODE ENDSEND START(5)将上述DATA SEGMENTDATA1 DB 4 DUP(?)DATA2 DB 4 DUP(?)DATA3 DB 5 DUP(?)DATA ENDS改为DATA SEGMENTDATA1 DB 8 DUP(?)DATA2 DB 8 DUP(?)DATA3 DB 9 DUP(?)DATA ENDS(6) DATA SEGMENTDATA1 DW 4 DUP(?)DATA2 DW 4 DUP(?)DATA3 DW 5 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV SI,OFFSET DATA1MOV DI,OFFSET DATA2MOV BX,OFFSET DATA3MOV CX,(DATA2-DATA1)/2 CLCNEXT:MOV AX,[SI]ADC AX,[DI]NOPMOV [BX],AXINC SIINC DIINC BXINC SIINC DIINC BXLOOP NEXTMOV AL,0ADC AL,0MOV [BX],ALMOV AH,4CHINT 21HCODE ENDSEND START三.选择实验(1)要改为多字节二进制减法程序,则将ADC指令改为SBB指令即可:修改为多字节压缩型,非压缩型BCD码减法程序只需将NOP指令改为DAS 和AAS。
算术运算类指令

√ √ √ √ 累加器A中的内容与工作寄存 器Ri所指向地址单元中的内容 相加,结果存在A中
各标志位的形成方法: 如果位7有进位输出,则置位CY,否则清CY; 如果位3有进位输出,则置位AC,否则清AC; OV=CY7⊕CY6。 若累加器A中1的个数为奇数,则P=1,否则,P=0。
√ √ √ √ 累加器A中的内容减工作寄存器中 的内容再减借位位,结果存在A中
A←(A)-((Ri))-(CY)
√√
√ √ 累加器A中的内容减工作寄存器Ri 指向的地址单元中的内容再减借位 位,结果存在A中
在减法运算中
CY=1表示有借位,CY=0则无借位。 OV=1表明带符号数相减时,从一个正数减去一个负数结果为
√√
√
√
累加器A中的内容与立即数连同进位
位相加,结果存在A中
√√
√
√
累加器A中的内容与工作寄存器Rn中
的内容、连同进位位相加,结果存在
A中
√√
√
√
累加器A中的内容与工作寄存器Ri指
向的地址单元中的内容、连同进位位
相加,结果Байду номын сангаас在A中
3. 带借位减法指令(4条)
指令
功能
标志位
解释
PO A C VCY
SUBB A,direct
注意: DA A 只能用于加法运算
【例】:有两个BCD数36与45相加,结果应为BCD码81, 程序如下:
MOV A,#36H
ADD A,#45H
DA A
加法指令执行后得结果7BH;第三条指令对累加器A中的 结构进行十进制调整,低4位(为0BH)大于9,因此要加6, 最后得到调整的BCD码为81。
(完整版)BCD码指令

BCD码指令 AAA DAA AAS DAS AAM AAD( 四 )十进制数(BCD码)运算指令以上我们介绍的是二进制数的算术运算指令,二进制数在计算机长进行运算是特别简单的。
可是,往常人们习惯于用十进制数。
在计算机中十进制数是用 BCD码来表示的, BCD码有两类:一类叫压缩型BCD码,一类叫非压缩型BCD码。
用 BCD码进行加、减、乘、除运算,往常采纳两种方法:一种是在指令系统中设置一套专用于BCD码运算的指令;另一种是利用二进制数的运算指令算出结果,而后再用特意的指令对结果进行修正(调整),使之转变成正确的BCD码表示的结果。
8086/8088指令系统所采纳的是后一种方法。
在进行十进制数算术运算时,应分两步进行:①先按二进制数运算规则进行运算,获得中间结果。
②再用十进制调整指令对中间结果进行修正,获得正确的结果。
下边经过几个例子说明BCD码运算为何要调整以及如何调整。
结果正确,这时调整指令不需要做什么。
结果不正确,由于在进行二进制加法运算时,低4 位向高4 位有一个进位,这个进位是按十六进制进行的,即低4 位逢十六才进一,而十进制数应是逢十进一。
所以,比正确结果少 6,这时,调整指令应在低 4 位上加 6。
即:加法运算后,低 4 位若向高 4 位有进位(即 AF=1)时,调整指令应做加 06H办理。
加法运算后,低4位 >9时,调整指令需做加 06H 办理;高4位 >9时,调整指令需做加 60H办理。
加法运算后,当CF=1(有进位产生)时,调整指令应做加60H办理。
前方我们已经详尽地介绍了二进制数的算术运算指令,下边主要介绍十进制数( BCD码)的调整指令。
⒈十进制加法的调整指令依据 BCD码的种类,对 BCD码加法进行十进制调整的指令有两条AAA 和 DAA。
⑴非压缩型 BCD码加法调整指令AAA (ASCII Adjust for Addition)指令格式:AAAAAA也称为加法的 ASCII 调整指令。
单片机开发中BCD码调整技巧

单片机开发中BCD码调整技巧我是SUNNY!本人经过一年多的学习,掌握了很多单片机编程技巧,例如C 语言嵌入汇编等。
俗话说得好,熟能生巧!的确如此,本人很喜欢钻研,达到很好的效果。
在进行程序编程时,在某些场合,我们要进行BCD 码调整。
例如0x09+0x01,其结果是0x0a,因为这个是16 进制运算,而这个不是我们想要的结果,我们是要0x10 这个结果。
那怎么办呢?其实这些运算在某些地方运用还是比较常见的,比如在时钟芯片DS1302 中就要用到。
如果采用转换10 进制的方法来解决,不但程序长,效率低,占用资源也严重。
如果采用汇编语言就简单了,汇编语言中已经考虑到这个地方,可以采用DA A 这个指令来完成,如下面这个例子:假设内存中30H 的值为0x09,求加上1 后的BCD 码,下面是程序和解释:MOV A,30H 把30H 的值先送人累加器A,这时累加器的值为0x09ADD A,#01H 累加器的值加上1,这时累加器的值为0x0aDA A 累加器BCD 码调整,这时累加器A 的值为0x10MOV 30H,A 把累加器A 的值送回30H,实现BCD 调整RET上面是加法的BCD 码调整,比较简单,因为汇编语言已经提供了这个功能,但是减法呢?很遗憾,汇编语言并没有提供减法的BCD 码调整,那是不是就没辙了呢?答案是否定的!我们知道,一个数如果低位不够减时,要向高位借1,在51 单片机中,其借位标志就是AC,我们可以利用AC 是否为1 来进行判断,如果出现借位,就要进行BCD 码调整。
但是减法并没有调整指令,怎么办?我们知道,16 进制与10 进制其实只是相差6,只要在发生借位时将值减去6 就OK 了!哈哈...我是不是很聪明?哈哈...自夸一下!好了,光说没有用,做出来才是真的!下面看例子:假设内存中30H 的值为0x10,求减去1 的BCD 码。
下面是程序和解释:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
R2,BCD1 ;处理完所有字节RET(2) 标号: BCDB 功能:多字节BCD码减法入口条件:字节数在R7中, 被减数在[R0]中
,减数在[R1]中。出口信息:差在[R0]中,最高位借位在 CY中。影响资源:PSW、A、R2、R3 堆栈需求: 6R1]十进制取补LCALL BCDA ;按多字节 BCD码加法处理CPL C ;将补码加法的进位标志转换
数据指针DJNZ R2,NEG0 ;处理完(R2)字节MOV A,#9AH ; 最低字节单独取补SUBB A,@R0MOV @R0,A
MOV A,R3 ;恢复指针MOV R0,ARET
谢谢观赏!
软件下载 /
取补入口条件:字节数在R7中,操作数在[R0]中。出口信 息:结果仍在[R0]中。影响资源:PSW、A、R2、R3 堆栈 需求: 2字节
NEG: MOV A,R7 ;取(字节数减一)至R2中DEC AMOV R2,AMOV A,R0 ;保护指针MOV R3,ANEG0
: CLR C MOV A,#99HSUBB A,@R0 ;按字节十进制取补MOV @R0,A ;存回[R0]中INC R0 ;调整
成借位标志MOV F0,C ;保护借位标志LCALL NEG1 ;恢复 减数[R1]的原始值MOV C,F0 ;恢复借位标志RETNE
G1: MOV A,R0 ;[R1]十进制取补子程序入口XCH A,R1 ;交 换指针XCH A,R0LCALL NEG ;通过[R0
]实现[R1]取补MOV A,R0XCH A,R1 ;换回指针XCH A,R0RET (3) 标号: NEG 功能:多字节BCD码
单片机多字节BCD码加法减法2006年04月17日 21:050
[导读]
(1) 标号: BC
DA 功能:多字节BCD码加法入口条件:字节数关键
词:加法减法单片机多
(1) 标号: BCDA
功能:多字节BCD码加法入口条件:字节数在R7中, 被加数在[R0]中,加数在[R1]中。出口信息:和在[R0]中, 最高位进位在CY中
。影响资源:PSW、A、R2 堆栈需求: 2字节BCDA: MOV A,R7 ;取字节数至R2中MOV R2,AADD A,R0 ;
初始化数据指针MOV R0,AMOV A,R2ADD A,R1MOV R1,ACLR CBCD1: DEC R0 ;调整数据指针D
EC R1MOV A,@R0ADDC A,@R1 ;按字节相加DA A ;十进 制调整MOV @R0,A ;和存回[R0]中DJNZ