微机原理实验2:多字节BCD加法实验

一、实验目的

掌握数据传送、算术指令和循环指令的用法。

二、实验内容

将两个多位十进制数相加。要求加数,被加数均以ASCII码形式存放在以DATA1和DATA2为首的5个内存单元中( 低位在前),结果存在DATA1处。

三、程序清单

CRLF    MACRO                           ;建立宏命令,利用INT中断实现回车换行的功能,方便后续直接调用MOV     DL,0DHMOV     AH,02HINT     21H                     ;光标移到第一列MOV     DL,0AHMOV     AH,02HINT     21H                     ;光标移到下一行
ENDMDATA    SEGMENT
DATA1   DB      33H,39H,31H,37H,34H     ;被加数ASCII码
DATA2   DB      36H,35H,30H,38H,32H     ;加数ASCII码
DATA    ENDSSTACK   SEGMENT STACK                   ;堆栈段
STA     DB      20 DUP(?)
TOP     EQU     LENGTH STA
STACK   ENDSCODE    SEGMENTASSUME  CS:CODE,DS:DATA,SS:STACK,ES:DATA
START:  MOV     AX,DATAMOV     DS,AXMOV     AX,STACKMOV     SS,AXMOV     AX,TOPMOV     SP,AXMOV     SI,OFFSET DATA2         ;SI存放数据地址MOV     BX,05                   ;BX中存放数字长度CALL    DISPL                   ;显示加数CRLFMOV     SI,OFFSET DATA1         ;源地址指向被加数MOV     BX,05CALL    DISPL                   ;显示被加数CRLFMOV     DI,OFFSET DATA2         ;目的地址指向加数CALL    ADDA                    ;调加法运算子程序MOV     SI,OFFSET DATA1MOV     BX,05CALL    DISPL                   ;显示结果CRLFMOV     AX,4C00HINT     21H                     ;返回DOSDISPL   PROC    NEAR                    ;显示子程序
DS1:    MOV     AH,02MOV     DL,[SI+BX-1]            ;显示字符串中一个字符INT     21HDEC     BXJNZ     DS1RET
DISPL   ENDPADDA    PROC    NEAR                    ;加法运算子程序MOV     DX,SIMOV     BP,DIMOV     BX,05
AD1:    SUB     BYTE PTR [SI+BX-1],30H  ;将ASCII码转换位二进制数SUB     BYTE PTR [DI+BX-1],30HDEC     BXJNZ     AD1MOV     SI,DXMOV     DI,BPMOV     CX,05                   ;五位数加法, 5 作为循环次数CLC                             ;清进位标志
AD2:    MOV     AL,[SI]MOV     BL,[DI]ADC     AL,BL                   ;带进位加法AAA                             ;非组合BCD码调整;如果al的低4位是在0到9之间,保留低4位,清除高4位,如果al的低4位在10到15之间;则通过加6,来使得低4位在0到9之间,然后再对高4位清零。;如果al的低4位是在0到9之间,ah值不变,CF和AF标志清零,否则,ah=ah+1,并设置CF和AF标志MOV     [SI],AL                 ;结果存被加数区INC     SI                      ;指向下一位INC     DILOOP    AD2                     ;没有加够 5 位转MOV     SI,DX                   ;恢复加数,被加数地址指针MOV     DI,BPMOV     BX,05
AD3:    ADD     BYTE PTR [SI+BX-1],30H  ;转换为ASCII码ADD     BYTE PTR [DI+BX-1],30HDEC     BXJNZ     AD3RET
ADDA    ENDP
CODE    ENDSEND     START

四、实验过程

1.用编辑器建立源文件D101-2.ASM
在这里插入图片描述
2.用汇编程序MASM.EXE对源文件进行汇编,产生目标文件,再用连接程序LINK产生可执行文件
在这里插入图片描述
3.使用调试工具DEBUG进行程序调试
先用U命令反汇编,以便了解指令地址。显示结果如下,具体调试结果见第五部分。
在这里插入图片描述

五、实验结果分析

1.程序调试及结果
可以看到在076D:0015地址处的指令是调用显示子程序DISPL来显示加数,被加数的显示类似,使用G命令执行到076D:0039处,查看显示结果。
在这里插入图片描述
使用-G 0076命令执行到ADDA子程序中,使用D命令查看ASCII码被转化为十六进制数后在内存中的存放情况,如下
在这里插入图片描述
使用-G 008f命令执行到BCD加法结束,查看被加数内存区域数值如下,因为28056+47193=75249,因此内存区域由低地址到高地址应依次为09 04 02 05 07,使用-d ds:0命令进行查看,与理论值一致。
在这里插入图片描述
继续使用G命令运行程序,直到将计算结果转化为ASCII码后,结果为
在这里插入图片描述
最后,运行到程序结束,将结果打印到屏幕上,如下:
在这里插入图片描述
2.分析总结

首先,在MASM编译器Microsoft ® Macro Assembler Version 5.00版本下,纠正实验指导书中出现的一个小问题。实验指导书中对“CRLF”命令宏的建立代码放在了文件最开头,然而在该版本编译器下编译会报错:Out of memory,将该宏命令放入代码段后编译即可编译成功,后续又将其放在文件开头编译,又可以编译成功没任何报错信息,对此迷惑不解,具体原因还需查阅相关资料。

本次实验的核心在于数据的传送指令、算数指令和循环指令的用法,其中比较重要的指令有:AAA(ASCII adjust after addition)指令,是BCD指令集中的一个指令,用于在两个未打包的BCD值相加后,调整al和ah寄存器的内容;BCD(Binary-coded decimal)数是指2进制编码的10进制数,占据一个字节的低4位,只有0-9是有效值。AAA指令做两件事情:(1)如果al的低4位是在0到9之间,保留低4位,清除高4位,如果al的低4位在10到15之间,则通过加6,来使得低4位在0到9之间,然后再对高4位清零。(2)如果al的低4位是在0到9之间,ah值不变,CF和AF标志清零,否则,ah=ah+1,并设置CF和AF标志。此外,还要搞清楚ADC等带进位加法指令与不带进位加法ADD指令的区别,将这些搞明白,则本实验的核心内容就没有什么问题了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微机原理实验3:键盘输入与显示实验

一、实验目的 了解移位指令的使用方法。 掌握子程序的调用方法,了解子程序的入口参数和出口参数。 二、实验内容 将键盘接收的四位十六进制数转换为二进制数,并显示在屏幕上。 三、程序清单 CRLF MACRO ;建立宏命令&a…

【JavaWeb】HTTP协议请求响应全解

文章目录一、HTTP简介二、请求报文三、请求方式四、媒体类型五、响应报文一、HTTP简介 HTTP:Hyper Text Transfer Protocol 超文本传输协议。HTTP最大的作用就是确定了请求和响应数据的格式。浏览器发送给服务器的数据:请求报文;服务器返回给…

【JavaWeb】一文Servlet全解:继承关系、生命周期、容器和请求转发与重定向等

文章目录一、Servlet 概述二、Servlet HelloWorld三、Servlet 继承关系四、Servlet 生命周期五、ServletConfig 和 ServletContext六、请求转发与重定向七、获取请求参数一、Servlet 概述 1、Servlet名字 Servlet Server applet Server:服务器 applet:…

微机原理实验4:统计学生成绩

一、实验目的 掌握比较综合性的汇编程序设计流程,以及多分支情况下程序的设计技巧。 二、实验内容 设计程序统计学生数学成绩。分别归类90-99分、80-89分、70-79分、60-69分及60分以下,并将各段的人数及成绩存入对应的内存单元中,并在屏幕…

Spring Boot的Spring Data JPA示例

1.简介 在本文中,我们将演示如何利用功能强大的Spring Data JPA API与本课程中的数据库(内存中的H2数据库)进行交互。 Spring Data JPA提供了一组非常强大且高度抽象的接口,用于与任何基础数据库进行交互。 数据库可以是MySQL&am…

为什么写路径这事有点复杂?动态Web工程内编写路径【JavaWeb】

文章目录一、为什么要写路径?二、为什么写路径这事有点复杂?三、准则四、写路径的步骤五、动态获取上下文路径一、为什么要写路径? 整个系统要根据功能拆分成许许多多独立的资源资源之间既要完成自身的功能又要和其他资源配合写路径就是为了从…

Windows编程初步(一)

第一节:安装帮助文档 使用C语言进行Windows开发,必然使用到WindowsSDK。Windows SDK指Windows开发人员工具包,是为使用C语言开发Windows程序所提供的工具集。里面提供的工具异常全面丰富,很少有人能全部了解,在开发Wi…

2022大学生免费(24元)申请个人软著专利(微信小程序)

文章目录一、发放的软著证书二、申请流程概览三、官网提交申请四、纸质材料打印五、纸质材料邮寄六、模板及代码统计工具点击查看《再易江南》微信小程序 一、发放的软著证书 挂号信封 软著证书 点击查看《再易江南》微信小程序 二、申请流程概览 一般情况下,按照文…

Windows编程初步(二)

第二节:简单的Windows程序(二) 下面为这个程序增加一个菜单项: 首先设计用户菜单。在工作区里找到资源视图。点击Menu左边的号,双击出现的IDC_WIN_STEP1菜单。 图7 资源视图中的菜单 将help右边的虚框拖入左侧File菜…

Java数字分类给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:A1 = 能被5整除的数字中所有偶数的和;A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3

题目描述: 给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字: A1 能被5整除的数字中所有偶数的和; A2 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2n3-n4…; A3 被5除后…

Windows编程之互动与动画

第五节: 考虑屏幕左侧一台坦克,向水平方向发射一枚炮弹,穿越屏幕。 很自然地,这场景中有坦克和炮弹两个对象,各自有各自坐标,坦克坐标是固定的,而炮弹坐标是变化的。因此有两个结构体类型:Tank…

Java福尔摩斯的约会大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧 3485djDkxh4hhGE 2984akDfkkkkggEdsb shgsfdk dHyscvnm”。大侦探很快就明白了

题目描述: 大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间“星期四 14:04”,因为前面…

Windows编程之网络之邮件槽通讯

第6节 使用邮件槽传输数据 网络通讯的理论很复杂,可是初学者不考虑性能的话,可以使用很简单的模式。一般而言网络通讯有两种模式,点对点模式或者广播模式。点对点模式就像一对一辅导,双方都能听清楚对方说什么,并作出…

java 批量处理 示例_Java异常处理教程(包含示例和最佳实践)

java 批量处理 示例异常是可能在程序执行期间发生的错误事件,它会破坏其正常流程。 Java提供了一种健壮且面向对象的方式来处理异常情况,称为Java异常处理 。 我们将在本教程中研究以下主题。 Java异常处理概述 异常处理关键字 异常层次 有用的异常方…

Windows编程之多媒体

一、语音接口的使用: 第一步,安装MSSpeech SDK。 MSSpeech SDK可从网络课堂安装,也可在微软公司直接下载,安装完毕后具有了语音处理能力。 安装过程全选默认即可。 安装完毕后,在开始菜单中会增加MS Speech SDK 5.1&#xff0…

Windows编程之调用Matlab

一、选择matlab: 注意。Matlab的安装需要较长时间,建议本拓展在同学们自己的电脑上运行。 Matlab是大多数工科学生必修的科目,是一个口碑极佳的数学计算工具,可以支持立即运算和程序设计两种形式。Matlab较新的版本均提供32位版本…

Windows编程之使用外部动态链接库——纸牌

C语言功能强大的一个重要原因是因为具有丰富的库函数,例如字符串处理有string库,数学处理有math库。微软公司对程序库的支持又更进一步,提供了丰富的动态链接库。下面以微软操作系统内嵌的纸牌链接库为例写一个简单的小程序。 由于我们已经较…

netbeans7.4_使用NetBeans 7.4 beta提示进行更好的基于JUnit的单元测试

netbeans7.4在上一篇文章中 ,我写了NetBeans 7.4 beta中提供的提示 ,这些提示提高了开发人员避免Java异常处理带来的讨厌的运行时问题的能力。 在本文中,我将探讨如何使用NetBeans 7.4 beta提供的另外两个提示使单元测试在执行单元测试期间更…

【MATLAB函数系列】fskmod函数参数及源代码详解

关注回复【fskmod】可看 在用matlab仿真生成fsk信号时,发现matlab库提供fskmod函数可以直接生成fsk信号,但生成的信号为复信号,于是查看其源码,结果对其原理看了好久都没明白,在网上查询资料也少得可怜,唯一…

Java Spring Security示例教程中的2种设置LDAP Active Directory身份验证的方法

LDAP身份验证是全球范围内最流行的企业应用程序身份验证机制之一,而Active Directory (Microsoft针对Windows的LDAP实现)是另一种广泛使用的LDAP服务器。 在许多项目中,我们需要通过登录屏幕中提供的凭据使用LDAP对活动目录进行身…