实验二 算术运算实验.docx

上传人:b****8 文档编号:13111736 上传时间:2023-06-11 格式:DOCX 页数:17 大小:132.52KB
下载 相关 举报
实验二 算术运算实验.docx_第1页
第1页 / 共17页
实验二 算术运算实验.docx_第2页
第2页 / 共17页
实验二 算术运算实验.docx_第3页
第3页 / 共17页
实验二 算术运算实验.docx_第4页
第4页 / 共17页
实验二 算术运算实验.docx_第5页
第5页 / 共17页
实验二 算术运算实验.docx_第6页
第6页 / 共17页
实验二 算术运算实验.docx_第7页
第7页 / 共17页
实验二 算术运算实验.docx_第8页
第8页 / 共17页
实验二 算术运算实验.docx_第9页
第9页 / 共17页
实验二 算术运算实验.docx_第10页
第10页 / 共17页
实验二 算术运算实验.docx_第11页
第11页 / 共17页
实验二 算术运算实验.docx_第12页
第12页 / 共17页
实验二 算术运算实验.docx_第13页
第13页 / 共17页
实验二 算术运算实验.docx_第14页
第14页 / 共17页
实验二 算术运算实验.docx_第15页
第15页 / 共17页
实验二 算术运算实验.docx_第16页
第16页 / 共17页
实验二 算术运算实验.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

实验二 算术运算实验.docx

《实验二 算术运算实验.docx》由会员分享,可在线阅读,更多相关《实验二 算术运算实验.docx(17页珍藏版)》请在冰点文库上搜索。

实验二 算术运算实验.docx

实验二算术运算实验

实验二算术运算实验

一、实验目的

1、掌握MASMforWindows环境下的汇编语言编程环境使用;

2、掌握汇编语言程序设计的基本流程及汇编语言中的二进制、十六进制、十进制、BCD

码的表示形式;

3、掌握汇编语言对多精度十六进制和十进制的编程方法及运算类指令对各状态标志

位的影响及测试方法;

4、掌握无符号数和有符号数运算区别及编程方法;

5、掌握BCD码调整指令的使用方法

二、软硬件实验环境

1、硬件环境:

惠普64位一体化计算机及局域网;

2、软件环境:

windows8,红蜘蛛管理系统,MASMforWindows。

三、实验基本原理

算术运算实验需要对运行结果进行调试及查看状态字,其相关知识如下。

1)标志位

在debug调试过程中,标志位用特殊符号表示的,其标志名和状态符号的对照表参照表1所示。

表1标志名和状态符号的对照表参照表

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数据类型的数据运算表

四、实验步骤与内容

1)对于表格中三组无符号数,试编程求这三组数的指定运算结果,并考虑计算结果对标志寄存器中状态标志位的影响:

实验分析

本实验要求简单,仅对指定三组数进行基本运算。

只需使用ADD、SUB、MUL、DIV四个运算命令,并以MOV命令作为数值转移的手段即可。

运算结果和状态标志的情况可以通过debug调试中的T命令进行逐步查看。

需要注意的主要有以下几点:

1.在进行加法和乘法运算时,会出现对高位的进位扩展。

因此,在记录结果的时候不能仅仅记录低2位(十六进制)的结果,应记录包含高位的完整结果;

2.在使用MUL和DIV命令时,语句的写法与ADD和SUB有区别;

3.除法运算既可得到商,也可得到余数,余数存在DL中;

4.查看结果时以三个语句为一次运算,输入三个T命令后的结果才是此次运算的结果。

②流程图

③程序样例

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

ENDSTART

3、DATASSEGMENT

;此处输入数据段代码

BUF1DB0ABH,64H,0A2H

BUF2DB78H,5AH,3FH

BUF3DB10DUP(?

DATASENDS

STACKSSEGMENT

;此处输入堆栈段代码

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

START:

MOVAX,DATAS

MOVDS,AX

MOVSI,2

MOVCX,1

Q1:

MOVAH,0H

MOVAL,BUF2[SI]

MOVBL,AL

MOVAL,BUF1[SI]

DIVBX

MOVBUF3[SI],AL

ADDSI,1H;dotheoperation

DECCX

JNZQ1;doitagainwiththesecondgroupofnumbers

MOVAX,4CH

INT21H

CODESENDS

ENDSTART

④实验结果

0ABH+78H

64H+5AH

0ABH-78H

64H-5AH

0A2H*3FH

0A2H/3FH

计算

状态标志

算式

结果

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程序流程图

3程序样例

1、DATASSEGMENT

;此处输入数据段代码

BUF1DB92H,98H,45H,64H,78H

BUF2DB33H,46H,17H,45H,52H

BUF3DB10DUP(?

DATASENDS

STACKSSEGMENT

;此处输入堆栈段代码

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

START:

MOVAX,DATAS

MOVDS,AX

MOVSI,0

MOVCX,4

MOVAH,00H

Q1:

MOVAL,BUF2[SI]

MOVBL,AL

MOVAL,BUF1[SI]

ADCAL,BL

MOVBUF2[SI],AL

INCSI

DECCX

JNZQ1

MOVAX,4CH

INT21H

CODESENDS

ENDSTART

2、DATASSEGMENT

;此处输入数据段代码

BUF1DB92H,98H,45H,64H,78H

BUF2DB33H,46H,17H,45H,52H

BUF3DB10DUP(?

DATASENDS

STACKSSEGMENT

;此处输入堆栈段代码

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

START:

MOVAX,DATAS

MOVDS,AX

MOVSI,0

MOVCX,4

MOVAH,00H

Q1:

MOVAL,BUF2[SI]

MOVBL,AL

MOVAL,BUF1[SI]

SBBAL,BL

MOVBUF2[SI],AL

INCSI

DECCX

JNZQ1

MOVAX,4CH

INT21H

CODESENDS

ENDSTART

3、DATASSEGMENT

;此处输入数据段代码

BUF1DB92H,98H,45H,64H,78H

BUF2DB33H,46H,17H,45H,52H

BUF3DB10DUP(?

DATASENDS

STACKSSEGMENT

;此处输入堆栈段代码

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

START:

MOVAX,DATAS

MOVDS,AX

MOVSI,0

MOVCX,4

MOVAH,00H

Q1:

MOVAL,BUF2[SI]

MOVBL,AL

MOVAL,BUF1[SI]

ADCAL,BL

DAA

MOVBUF2[SI],AL

INCSI

DECCX

JNZQ1

MOVAX,4CH

INT21H

CODESENDS

ENDSTART

4、DATASSEGMENT

;此处输入数据段代码

BUF1DB92H,98H,45H,64H,78H

BUF2DB33H,46H,17H,45H,52H

BUF3DB10DUP(?

DATASENDS

STACKSSEGMENT

;此处输入堆栈段代码

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

START:

MOVAX,DATAS

MOVDS,AX

MOVSI,0

MOVCX,4

MOVAH,00H

Q1:

MOVAL,BUF2[SI]

MOVBL,AL

MOVAL,BUF1[SI]

SBBAL,BL

DAA

MOVBUF2[SI],AL

INCSI

DECCX

JNZQ1

MOVAX,4CH

INT21H

CODESENDS

ENDSTART

 

4实验结果

十六进制结果

十进制结果

BUF1+BUF2

C5DE5CA9+

25456309+

BUF1-BUF2

5F522E1F+

65523425+

3)编程计算280*584/190,运算结果用十六进制表示。

要求上式计算结果的商存入AX,余数存入DX寄存器。

实验分析

本实验要求很简单,可用基本运算直接完成。

值得注意的就是最后进行除法运算时,DIV命令的执行结果自动将商存在AX中,余数存于DX中,可直接满足实验要求,故无需多余操作。

程序流程图

实验流程即为从算式最左至最右逐步运算的基本运算律,故流程图略。

③程序样例

DATASSEGMENT

DATASENDS

STACKSSEGMENT

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

START:

MOVAX,DATAS

MOVDS,AX

MOVAX,280

MOVBX,584

MULBX

MOVBX,190

DIVBX

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

④实验结果

商为AX中的035CH余数为DX中的0078H

五、实验感想与收获

本次实验的难度比上一次有了很大的提高,也带给我们更多的收获。

第一个实验中我就已经在尝试使用循环的结构来进行加减法,这给我第二个实验的进行提供了极大的便利。

但是在进行第二个实验的时候,由于一开始在每个循环节中对SI+1的操作没有使用INC指令,而是使用了ADDSI,1这样的指令,影响了进位符,并最终导致了结果的输出错误。

经过了数次调试后终于发现了这个问题,并解决。

在这个过程中,我对ADD,ADC,SUB,SBB等指令的作用和原理有了很深入的理解,并且能够灵活的运用这几个指令。

可以说非常的有收获。

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

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2