实验七 无符号多字节加减法
- 格式:doc
- 大小:28.50 KB
- 文档页数:3
1 双字节无符号数加法例1: 双字节无符号数加法(R0 R1)+(R2 R3) → (R4 R5), R0、R2、R4存放16位数的高字节, R1、R3、R5存放低字节。
已知(R0 R1)=(93h,79h);(R2 R3)=(25h,a4h)假设其和不超过16位。
请编程。
提示:由于不存在16位数加法指令, 所以只能先加低8位, 后加高8位, 而在加高8位时要连低8位相加时产生的进位一起相加。
查看psw中的标志CY=?, OV=?, AC=?, P=?。
熟悉软件环境,要求能知道在哪里看数据的值,在哪里能看一些寄存器的内容,在哪里看程序代码。
如何在伟福软件环境下建立项目,运行文件。
要求按照标准模式来写程序,ORG 0000HLJMP STARTORG 0050HSTART:MOV R1,#79HMOV R3,#0A4HMOV A,R1ADD A,R3MOV R5,ACLR AMOV R0,#93HMOV R2,#25HMOV A,R0ADDC A,R2MOV R4,A SS:JMP SSEND2双字节无符号数减法例2: 双字节无符号数相减(R0 R1)-(R2 R3) → (R4 R5)。
R0、R2、R4存放16位数的高字节, R1、R3、R5存放低字节,已知(R0 R1)=(93h,79h);(R2 R3)=(25h,a4h);请编程。
同学自己可以设置被减数与减数数值提示:先减低8位, 后减高8位和低位减借位。
由于低位开始减时没有借位, 所以要先清零。
ORG 0000HLJMP STARTORG 0050HSTART:MOV R0,#93HMOV R1,#79HMOV R2,#25HMOV R3,#0A4HMOV A,R1SUBB A,R3MOV R5,ACLR AMOV A,R0SUBB A,R2MOV R4,ASS:JMP SSEND3双字节数乘以单字节数例3: 利用单字节乘法指令,进行双字节数乘以单字节数运算。
北京XXX大学实验报告课程(项目)名称:微机原理与接口技术学院:专业:姓名:学号:指导教师:成绩:2013年12 月15 日实验一认识实验及多字节加减法程序一、任务与目的1. 实验任务:(1) 熟悉和掌握MASM汇编程序及TD调试软件的使用;(2) 熟悉代码段、数据段、堆栈段的结构;(3) 掌握8086/8088汇编程序的结构;(4) 掌握多字节加减法程序的编写。
2. 实验目的:(1). 掌握8086/8088汇编程序及调试程序的基本使用方法;(2) 熟悉8086/8088汇编语言编写的基本结构;(3) 熟悉多字节加减算术运算的基本方法。
二、原理(条件)1.相关知识:(1) MASM汇编程序及TD调试软件的使用方法;(2) 8086/8088汇编程序结构及算术运算等相关指令。
2.实验条件:MASM汇编程序及TD调试软件。
三、内容步骤1.启动TD(Turbo Debugger)输入程序段,观察执行情况并分析结果:(1) MOV BL,08HMOV CL,BLMOV AX,03FFHMOV BX,AXMOV [0200H],BXMOV ES:[0300H],AX(2) MOV AX,0A268H MOV SI,9D1CH ADD AX,SIAX= 3f84h CF= 1 AF=1 ZF=0 PF= 1 OF= 1 SF= 0 ADD AL,30HAX= 3fb4h CF= 0 AF= 0 ZF= 0 PF=1 OF= 0SF= 1ADC AX,0FFFFHAX= 3fb3h CF=1 AF= 1 ZF= 0 PF=0 OF= 0 SF= 0(3) 输入程序段,分步运行:MOV AX,0102HMOV BX,0304HMOV CX,0506HMOV DX,0708HPUSH AXPUSH BXPUSH CXPUSH DXPOP DXPOP CXPOP BXPOP AX2.编写多字节加/减汇编程序,观察执行情况并分析结果:利用MASM宏汇编程序及TD程序进行调试。
实验二实现多字节加(减)法一、 实验目的: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进行单步运行。
多字节、多进制加减运算学生:何绍金学号: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 ;进位位清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”进行十进制调整,调整后产生进位。
多字节无符号数加法实验报告
通信二班张晓宇 200800120295
一、实验目的
熟悉汇编中的加法指令。
二、实验内容
将被加数置入片内RAM 以40H 单元为起始地址的区间,将加数置入片内
RAM 以50H 单元为起始地址的区间。
置入时,多字节数按先低位后高位的次序存数,相加结果,放回30H 的存放单元。
三、流程图
否 有
开始
R0指向加数最低位地址40h
R1指向被加数最低位地址50h
R0与R1对应为相加将相
加结果放入R0中
R0加1,R1加1
所有位加完 最高位是否有进
位 否
是
向最高位进位
四、实验程序
org 0000h
ajmp main
org 0030h Main: mov r0,#40h mov r1,#50h mov r2,#4h
clr c
loop1:MOV A,@R0
ADDC A,@R1
MOV @r0,A
INC R0
INC R1
djnz r2,loop1 mov a,#00h
addc a,#00h mov @r0,a
mov r0,#40h mov r1,#30h mov r2,#10h loop2:mov a,@r0
mov @r1,a
inc r0
inc r1
djnz r2,loop2 Sjmp $
END 将40h地址数据移到30h地址中
结束。
多字节的二进制加法程序的实验
实验人员:冯媛莉1312230136 实验地点:2s517 实验时间:3.25 指导老师:赵鹏
1.实验目的与要求
(1)进一步熟悉在PC机上建立、汇编、链接和运行汇编语言程序的全过程。
(2)设计一个完整的汇编程序,并学习数据传送指令的用法。
2. 实验内容:
将两个两字节长的二进制数相加,运算结果存放在相应结果单元中。
3.源程序如下:
4.程序运行结果:
5. 本次实验心得体会:
这次成功的运行了指令,熟悉在PC机上建立、汇编、链接和运行汇编语言程序的全过程。
熟悉的掌握住了操作符,这次我学习好多,谢谢老师的谆谆教导。
实验四ARM多字节整数除法201010405224 计科102 杨志虎一、实验目的●进一步学习使用Embest IDE for ARM 开发环境及ARM软件模拟器;●掌握ARM多字节整数除法的汇编程序设计方法。
二、实验原理1.. ARM内核对除法运算不提供硬件支持。
除法运算必须通过调用基于标准算术操作的软件程序来完成。
通过试探减法实现无符号数除法,在ARM的运算中是很有用的。
其原理如下:计算无符号整数n和d的商q=n/d和余数r=n%d,其中假定商q不超过N位(n/d<2N)。
试探减法算法以最高有效位――第N-1位开始,通过依次试图设置各个位来确定q的N位值。
这种做法和对结果的二分搜索是等价的。
如果可以从当前的余数减去(d<<k),且减法结果不是负数,那么就可以设置位k。
这个算法的C实现代码如下:unsigned udiv_simple(unsigned d,unsigned n,unsigned N){unsigned q=0,r=n;do{ /*计算下一个商*/N--;/*移到下一位*/if((r>>N)>=d) /*if r>=d*(1<<N)*/{r -=(d<<N);/*计算余数*/q +=(1<<N);/*计算商*/}}while(N);return q;}三、实验内容●编制2个64位整数除法的程序。
●运行Embest IDE集成开发环境,输入自己设计的64位整数除法汇编程序,生成目标代码,连接下载后进行调试。
四、实验步骤1.打开memory窗口,观察地址0x8000周围的内容。
2.执行程序并观察和记录寄存器与memory的值变化。
3.结合实验内容和相关资料,观察程序运行,通过实验加深理解ARM指令的使用。
五、实验参考程序(部分)/************************************************************************** ; 实现64位整数除法,商放在R0,R1中,余数在R2,R3中;*************************************************************************/.global _start.macro mCLZ Rd, Rs @ 求一个32位数的前导0个数,放在Rd中MOV \Rd, #0__mCLZ_\Rs:TST \Rs, #0x80000000ADDEQ \Rd, \Rd, #1MOVEQ \Rs, \Rs, ROR #31BEQ __mCLZ_\RsMOV \Rs, \Rs, LSR \Rd.endm.macro mCLZ64 Rd, Rsl, Rsh @ 求一个64位无符号数的前导0个数MOV \Rd, #0CMP \Rsh, #0x0BEQ __Low_mCLZmCLZ \Rd, \RshB __End_mCLZ__Low_mCLZ:mCLZ \Rd, \RslADD \Rd, \Rd, #32__End_mCLZ:.endm.macro mUNSIGN64 Rd, Rsl, Rsh @ 将一个64位整数无符号化TST \Rsh, #0x80000000 @ 将无符号的整数放到Rs中BEQ __End_mUNSIGN64_\RslEOR \Rd, \Rd, #1 @ 将这个数总的符号部分放到Rd中MVN \Rsh, \RshMVN \Rsl, \RslADDS \Rsl, \Rsl, #1ADC \Rsh, \Rsh, #0__End_mUNSIGN64_\Rsl:.endm.macro LeftMove64 Rd, Rsl, Rsh @ 将一个64位整数左移一位MOV \Rd, #0MOV \Rsh, \Rsh, LSL #1AND \Rd, \Rsl, #0x80000000MOV \Rd, \Rd, LSR #31ADD \Rsh, \Rsh, \RdMOV \Rsl, \Rsl, LSL #1.endm.macro RightMove64 Rd, Rsl, Rsh @ 将一个64位整数右移一位MOV \Rd, #0MOV \Rsl, \Rsl, LSR #1AND \Rd, \Rsh, #0x01MOV \Rd, \Rd, LSL #31ADD \Rsl, \Rsl, \RdMOV \Rsh, \Rsh, LSR #1.endm程序代码:.global _start.macro mCLZ Rd, Rs @ 求一个数的前导0个数MOV \Rd, #0 @ 在某些ARM中,可以使用指令CLZ __mCLZ_L1:TST \Rs, #0x80000000ADDEQ \Rd, \Rd, #1MOVEQ \Rs, \Rs, ROR #31BEQ __mCLZ_L1MOV \Rs, \Rs, LSR \Rd.endm.macro mUNSIGN Rd, Rs @ 将一个数无符号化TST \Rs, #0x80000000 @ 将无符号的整数放到Rs中EORNE \Rd, \Rd, #1 @ 将这个数总的符号部分放到Rd中MVNNE \Rs, \RsADDNE \Rs, \Rs, #1.endm.arm.text_start:LDR R0, =-123456 @ 被除数LDR R1, =523 @ 除数Div:MOV R6, #0 @ 结果的符号位mUNSIGN R6, R0 @ 判断被除数和除数的符号,无符号化mUNSIGN R6, R1MOV R5, #0 @ 商CMP R0, R1 @ 如果被除数小于除数BLT Division_L2 @ 直接商0mCLZ R3, R1 @ 判断除数位数,确定移位情况SUB R3, R3, #1MOV R1, R1, LSL R3Division_L1:MOV R5, R5, LSL #1CMP R0, R1 @ 判断是否够减SUBGT R0, R0, R1 @ 如果够减,做减法,上商1ORRGT R5, R5, #1SUBS R3, R3, #1MOVCS R1, R1, LSR #1BCS Division_L1Division_L2:TST R6, #1 @ 处理结果的符号MVNNE R5, R5ADDNE R5, R5, #1Division_F:MOV R1, R0MOV R0, R5Stop:B Stop.end。
无符号数加减法无符号数是一种数据类型,用于表示非负整数,不包含符号位。
在计算机中,对无符号数进行加减法运算时,不会考虑数值的正负,而是将其视为一个循环的数轴,通过对数值的模运算来实现加减法运算。
本文将详细介绍无符号数的加减法运算规则及实例。
一、无符号数加法无符号数的加法运算是通过对两个数值的模运算来实现的,具体步骤如下:1. 将参与运算的两个无符号数按二进制进行对齐。
如果位数不同,需要在短的数值前面补0,使其位数相等。
2. 从低位开始逐位相加。
3. 如果相加结果大于无符号数的最大表示范围,需要进行模运算,即将结果减去无符号数的最大值再加1。
4. 将上一步得到的结果转换为二进制,并补0到与原始位数相等。
例如,计算无符号数15 + 7的结果:15: 00001111+ 7: 00000111---------00010110根据上述步骤可得到结果为22。
二、无符号数减法无符号数的减法运算也是通过对两个数值的模运算来实现的,具体步骤如下:1. 将被减数与减数按二进制进行对齐,如果位数不同,需要在短的数值前面补0,使其位数相等。
2. 从低位开始逐位相减。
3. 如果相减结果为负数,需要对结果加上无符号数的最大值再加1。
4. 将上一步得到的结果转换为二进制,并补0到与原始位数相等。
例如,计算无符号数15 - 7的结果:15: 00001111- 7: 00000111---------00001000根据上述步骤可得到结果为8。
三、实例分析下面通过一些实例来进一步说明无符号数的加减法运算:1. 计算无符号数30 + 35的结果:30: 00011110+ 35:00100011--------------01010001根据计算结果可知,30 + 35的值为81。
2. 计算无符号数52 - 19的结果:52: 00110100- 19: 00010011--------------00000011根据计算结果可知,52 - 19的值为3。
实验七无符号多字节加/减法
一、实验目的
1、掌握多字节加减运算的设计方法;
2、进一步熟悉调试程序的方法。
二、实验仪器
1、DVCC-598JH单片开发机一台;
2、WD-5型直流稳压源一台。
三、实验预习
1、认真阅读实验指导书有关内容,明确实验目的、内容和操作步骤;
2、对实验中的程序和指令进行手工汇编;
3、复习实验中相关指令的功能。
四、实验内容
程序一:多字节无符号数加法
已知被加数首地址由R0指出,加数首地址由R1指出,字节数由R2指出,数据的存放方式以低位字节在前,高位字节在后。
参考程序:
ORG 4000H
CLR C
LOOP:MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R2,LOOP
JNC NEXT
MOV @R0,#01H
SJMP $
NEXT:MOV @R0,#00H
SJMP $
END
程序二:多字节无符号减法
在片内RAM40H~42H单元存入3字节的被减数(低位在前),在50H~52H 单元存入3字节的减数(低位在前),求这两个数的差,并将结果存入片外RAM 5000H为起始地址的单元中(低位在前)。
参考程序:
ORG 2000H
MOV R0,#40H
MOV R1,#50H
MOV DPTR,#5000H
MOV R7,#03H
CLR C
LOOP:MOV A,@R0
SUBB A,@R1
MOVX @DPTR,A
INC R0
INC R1
INC DPTR
DJNZ R7,LOOP
SJMP $
END
五、实验步骤
1、认真阅读实验参考程序并分析程序运行后的理论结果;
2、输入程序并检查输入是否正确;
3、根据已知条件输入程序执行前的原始数据;
4、执行程序,检查并记录结果
六、练习
1、如何将程序一改成多字节的十进制加法程序。
2、设三字节BCD码的被减数及减数由高位到低位存放在片内RAM中,它们的首地址分别为10H和20H,要求将其差值存放到30H为首地址的单元中。
试编写该程序。
七、实验报告
1、整理记录结果,并与理论结果进行比较;
2、调试过程及体会;
3、总结多字节加/减法程序设计思想;
4、试说明DA A指令进行十进制调整的过程。