实验二算术运算实验.docx
《实验二算术运算实验.docx》由会员分享,可在线阅读,更多相关《实验二算术运算实验.docx(14页珍藏版)》请在冰豆网上搜索。
实验二算术运算实验
实验二算术运算实验
一、实验目的
1、掌握MASMforWindows环境下的汇编语言编程环境使用;
2、掌握汇编语言程序设计的基本流程及汇编语言中的二进制、十六进制、十进制、BCD
码的表示形式;
3、掌握汇编语言对多精度十六进制和十进制的编程方法及运算类指令对各状态标志
位的影响及测试方法;
4、掌握无符号数和有符号数运算区别及编程方法;
5、掌握BCD码调整指令的使用方法
二、软硬件实验环境
1、硬件环境:
惠普64位一体化计算机及局域网;
2、软件环境:
windows8,红蜘蛛管理系统,MASMforWindows。
三、实验基本原理
算术运算实验需要对运行结果进行调试及查看状态字,其相关知识如下。
1)标志位
在debug调试过程中,标志位用特殊符号表示的,其标志名和状态符号的对照表参照表1
所示。
表1标志名和状态符号的对照表参照表
址位
盜出标念OF阳否}
OV
NV
方向标吉DF(减/増)
DN
UP
叩斯标JiIF(ft许川止)
EI
DI
符号标£5F(ft/jE)
NG
PL
零标怎2R是/杏}
NZ
辅助就位杯左AFU田仰)
AC
NA
奇鶴校验标土PR0V奇]
PE
PO
进位标恋CR是/弼
CY
NC
2)加减法指令
ADD表示加法指令,ADC表示带进位加法指令,SUB表示减法指令,SBB表示带进位减法指令。
3)乘除法指令
MUL表示无符号数乘法指令,IMUL表示带符号数乘法指令,DIV表示无符号数除法指令,IDIV表示带符号数除法指令。
4)符号位扩展指令
CBW表示从字节扩展到字的指令,CWD表示从字扩展到双字的指令。
5)BCD码的调整指令
在进行十进制加减运算时,需要将数据用BCD码表示,还要考虑到是组合BCD码还是非组合
BCD码,组合BCD码是用一个字节表示两位十进制数,非组合BCD码是用一个字节表示一位
十进制数,对于组合的BCD码加减法运算其结果存放在AL中。
组合的BCD码加法调整指令DAA
组合的BCD码减法调整指令DAS
非组合的BCD码加法调整指令AAA
非组合的BCD码减法调整指令AAS
乘法的非组合BCD码调整指令AAM
除法的非组合BCD码调整指令AAD
8088/8086指令系统提供了实现加、减、乘、除运算指令,可参照表2所示内容。
表2数据类型的数据运算表
数制
二进制
BCD码
带苻号
无苻号
非组合
址?
7研
X、-V
-
一、X.S-
操作数
宁节(二位熬字)
字节(■位数宇)
四、实验步骤与内容
1)对于表格中三组无符号数,试编程求这三组数的指定运算结果,并考虑计算结果对标志寄存器中状态标志位的影响:
1实验分析
本实验要求简单,仅对指定三组数进行基本运算。
只需使用ADDSUBMULDIV四个运算命令,并以MOV命令作为数值转移的手段即可。
运算结果和状态标志的情况可以通过debug调试中的T命令进行逐步查看。
需要注意的主要有以下几点:
1.在进行加法和乘法运算时,会出现对高位的进位扩展。
因此,在记录结果的时候不能仅仅记录低2位(十六进制)的结果,应记录包含高位的
完整结果;
2.在使用MUL和DIV命令时,语句的写法与ADD和SUB有区别;
3.除法运算既可得到商,也可得到余数,余数存在DL中;
4.查看结果时以三个语句为一次运算,输入三个T命令后的结果才是此次运算的结果。
2流程图
3程序样例
1、
DATASSEGMENT
;此处输入数据段代码
BUF1DB0ABH,64H,0A2H
BUF2DB78H,5AH,3FH
BUF3DB10DUP⑺
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVSI,0
MOVCX,2
Q1:
MOVAH,0H
MOVAL,BUF1[SI]
MOVBL,AL
MOVAL,BUF2[SI]ADDAX,BX;进行运算
MOVBUF3[SI],AL
ADDSI,1H
DECCX
JNZQ1;跳转再做一次第二组数的加法运算
MOVAX,4CH
INT21H
CODESENDS
ENDSTART
2、
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVSI,0
MOVCX,2
Q1:
MOVAH,0H
MOVAL,BUF2[SI]
MOVBL,AL
MOVAL,BUF1[SI]
SUBAX,BX
MOVBUF3[SI],AL
ADDSI,1H;dotheoperation
DECCX
JNZQ1;doitagainwiththesecondgroupofnumbers
MOVAX,4CH
INT21H
CODESENDS
ENDSTART3、DATASSEGMENT
;此处输入数据段代码
BUF1DB0ABH,64H,0A2H
BUF2DB78H,5AH,3FH
BUF3DB10DUP?
)
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODES5EGMENT
ASSUMCS:
CODES,DS:
DATAS,SS:
STACKS
START
MOVXQATAS
MO\DS,AX
MO\SI,2
MOVCX,1
Q1:
MO\AH,0H
MO\AL,BUF2[SI]
MOV3L,AL
MO\AL,BUF1[SI]
DIVBX
MOV3UF3[SI],AL
ADDSI,1H;dotheoperation
DECCX
JNZQ1;doitagainwiththesecondgroupofnumbers
MO\AX,4CHINT21HCODESENDSENDSTART
④实验结果
0ABH+78H
X=91Z3BX=00AECX=O60EDX=0O00SF=O00©BF=G0O0SI=e0©ODI=006Q
S=0?
70ES=O7GGSS=0?
&FCS=OT71IF=O01SNUUPElPLNZACPOMC
771:
9019阳S4060OMDU[SI+00061用LDS:
GGG6=G6
64H+5AH
AX-0OBEBX-0064CX=0G01DX=O0O0SP-0000BP=G00OST=0001DI=0000
DS=WTOES=W6©SS=IJ?
6FCS=e7?
lIF=W13NUUPElFLHZNAPENC
G?
71:
G0198&84068GMOU[S1*0006】,HLDS:
0007=00
0ABH-78H
kx^oGiaaHX=€Kf7acx=oeezdx^oogosp^oqogar^eooost=00001)1=0000
DS=a?
7GES=67t0SS=flPFFCS=0771[P=0915HUIIPElPLMSMAPEMC
0771:
001^89B4660OMOU[SUOOGGl^LDS:
O00&-OG
64H-5AH
容hboaBx=ee»c)t=0S0in^eeee^=0000s1=0091vi=&&9&
1£>(7旳0SS-HI^KCS-^?
1IP-EW19HWUl1ELI'LMKHCFEAC
3771;C0US86HWOOMOUB[他66】,亂»366^7^0
0A2H*3FH
AX=Z7HERX=fiflflFCX=fB01DX=fiCMflSP=fifiFMST=(MfiZDWfiflfifl
DS-0770ES-0760SS-07bTCS-G771IP-0015NUUPElPLNZHAFDPC
£771^0015G83i060t>HOU[3I*OO0®】jBLI>3;9060-06
BP^eeeosi^oeozdi=ooog)
Huupeiplnsharahc
KJ:
4J0e8=00
0A2H/3FH
X00GKBX^OCKFCX=t»01DX=fc)tK4时GWWDS=O?
7DES=67EQSS=0?
bFCS-GP71IP-001.9
U/71:
f®l*J8H84«)0aHUUL^l+WOhJ.AL
计算
状态标志
算式
结果
AF
CF
ZF
OF
SF
PF
0ABH+78H
123H
1
0
0
0
0
0
0ABH-78H
33H
0
0
0
0
0
1
64H+5AH
0BEH
0
0
0
0
0
1
64H-5AH
0AH
1
0
0
0
0
1
0A2H*3FH
27DEH
1
0
0
0
0
1
0A2H/3FH
2H余24H
1
0
0
0
0
1
2)在数据段定义了两个多精度的有符号16进制数,BUF1和BUF2求两数的和与差,并将计算值存放在BUF2为首地址的缓冲区中;同时将两组数据当作十进制数据来处理,再次求两数的和与差,并将结果存放在BUF2为首地址的缓冲区
中。
试编程实现上述运算
BUF1DB92H,98H,45H,64H,78H
BUF2DB33H,46H,17H,45H,52H
1实验分析
本实验的思想是把这个两个多精度数进行按精度(每两位)进行运算,考虑进位与借位,
每种运算都可以使用循环和带进位加法,或循环和带进位减法进行实现。
对于十进制数运算
的要求,再辅以DAA和DAS两种十进制调整命令,将结果变为BCD码即可。
本实验中需要注意的有以下几点:
1.本实验要求就过存入以BUF2为首地址的缓冲区。
为在运算时保护BUF2的数据,需
定义另一个存储空间来存储和BUF2一样的数据;
2.在进行不同运算的间隙应当进行清除进位标志的操作,即使用CLC命令,避免上一
运算的进位影响下一位运算的结果;
3.DAA和DAS都只能对AL里的结果转换为压缩BCD码,因此十进制加减结果必须存
入AL里,且转换为压缩BCD码的结果要靠读取AL来获得。
2程序流程图
rIA进制抑乙十衣进制减
3.十进制加盅I•进制廠
*
3程序样例
1、DATASSEGMENT
;此处输入数据段代码
BUF1DB92H,98H,45H,64H,78H
BUF2DB33H,46H,17H,45H,52H
BUF3DB10DUP(?
)
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSE