当前位置: 首页 > java >正文

关于汇编语言与接口技术——算术运算程序的设计

学习目标:能够熟练掌握算术运算汇编指令的使用、理解有符号数和无符号数运算、熟练掌握简单程序设计的基本方法、熟练掌握程序的调试方法。


一、设计方案

1.整体思路

将两个操作数NUMB1,NUMB2的低位、中位、高位分离开,存放在指定的地址单元内,分别进行相加减,最后得出结果。

2.流程图

3.主要模块设计思路及分析

1加法模块实现:

低位:首先读取NUMB1的低位地址2H的内容77,将其放入R0暂存;接着读取NUMB2的低位地址5H的内容99,放入累加器,然后与R0相加后得出结果再重新放入R0,更新结果。

中位:首先读取NUMB1的中位地址1H的内容88,将其放入R1暂存;接着读取NUMB2的中位地址4H的内容88,放入累加器,然后与R1相加后得出结果再重新放入R1,更新结果。

高位:首先读取NUMB1的高位地址0H的内容99,将其放入R2暂存;接着读取NUMB2的高位地址3H的内容77,放入累加器,然后与R2相加后得出结果再重新放入R2,更新结果。

低位相加部分主要代码(中位高位同理):

2减法模块实现:

低位:首先读取NUMB2的低位地址5H的内容77,将其放入R0暂存;接着读取NUMB1的低位地址2H的内容99,放入减法器,然后低位相减后得出结果再重新放入R0,更新结果。

中位:首先读取NUMB2的中位地址4H的内容88,将其放入R1暂存;接着读取NUMB1的中位地址1H的内容88,放入减法器,然后中位相减后得出结果再重新放入R1,更新结果。

高位:首先读取NUMB2的中位地址3H的内容99,将其放入R2暂存;接着读取NUMB1的高位地址0H的内容77,放入减法器,然后高位相减后得出结果再重新放入R2,更新结果。

低位相减部分主要代码(中位高位同理):

二、实现效果

(1)加法部分:

低位相加(77H+99H):单步运行后R0内容变为0x10

PSW内ov位为0,cy为1,表示有进位,无溢出

中位相加(88H+88H):单步运行后R1内容变为0x11

PSW内ov位为1,cy为1,表示有进位,有溢出

高位相加(99H+77H):单步运行后R2内容变为0x11

PSW内ov位为0,cy为1,表示有进位,无溢出

(该步与低位相加结果一致,但由于有进位,R2内容变为0x10+1=0x11)

最后运行结果如图:

(2)减法部分:

低位相减(77H-99H):单步运行后R0内容变为0xde

   PSW内ov位为1,cy为1,表示有借位,有溢出

中位相减(88H-88H):单步运行后R1内容变为0xff

PSW内ov位为0,cy为1,表示有借位,无溢出

高位相减(99H-77H):单步运行后R2内容变为0x21

PSW内ov位为1,cy为0,表示有溢出,无借位

最后运行结果如图:

三、学习小结

1.在实验开始前,我对于Keil软件的使用还不是很熟悉,经常误点到错误的位置,连简单的文件保存和程序运行都没法操作。在后来询问了舍友之后得到解决。

2.在本次实验中,我学会了简单程序设计的基本方法,掌握了程序的调试和运行。将数据内容传入指定寄存器,通过累加器和减法器进行相应操作,而不用清空原数据的内容,超越了我之前对这两个器件的认知,这是让我觉得最神奇的地方。

3.在实验后,我还产生了一个小小的困惑:最后得出的结果是分别存在R0,R1,R2里面,但要如何将这三个分离的数据合成为一个具体相加减得出的结果呢?目前还没有得到一个确定的答案。希望在之后的实验中,可以以此为鉴,再接再厉,解决这个问题,得到满意的结果。

附录:

加法部分:ORG 0000h
NUM1:	DW 9988H		  DB 77H		   ; data: 99 88 77; addr: 0H 1H 2H
NUM2:	DB 77H,88H,99H ; data: 77 88 99; addr: 3H 4H 5HSTART:MOV DPTR, #0H     ; 加法模块//低位					 MOV A, #2H		  MOVC A, @A+DPTR   ; 读取程序存储器地址 2H 数据 77(低位)MOV R0, A		  ; 使用 R0 暂时存储数据MOV A, #5HMOVC A, @A+DPTR   ; 读取程序存储器地址 5H 数据 99(低位)ADDC A,R0		  ; 低位相互加MOV R0, A		  ; 将低位相加后得到的结果放入R0//中位MOV A, #1H		  ; 读取程序存储器地址 1H 数据 88(中位)MOVC A, @A+DPTR	  ; 使用 R1 暂时存储数据MOV R1, AMOV A, #4H		  MOVC A, @A+DPTR	  ; 读取程序存储器地址 4H 数据 88(中位)ADDC A,R1		  ; 中位相互加MOV R1, A		  ; 将中位相加后得到的结果放入R1//高位MOV A, #0H		  ; 读取程序存储器地址 0H 数据 99(高位)MOVC A, @A+DPTR	  ; 使用 R2 暂时存储数据MOV R2, AMOV A, #3HMOVC A, @A+DPTR	  ; 读取程序存储器地址 3H 数据 77(高位)ADDC A,R2		  ; 高位相互加MOV R2, A	  	  ; 将高位相加后得到的结果放入R2END减法部分:ORG 0000h
NUM1:	DW 9988H		  DB 77H		   ; data: 99 88 77; addr: 0H 1H 2H
NUM2:	DB 77H,88H,99H ; data: 77 88 99; addr: 3H 4H 5HSTART:	MOV DPTR, #0H     ; 减法模块//低位					 MOV A, #5H		  MOVC A, @A+DPTR   ; 读取程序存储器地址 5H 数据 77(低位)MOV R0, A		  ; 使用 R0 暂时存储数据MOV A, #2HMOVC A, @A+DPTR   ; 读取程序存储器地址 2H 数据 99(低位)SUBB A, R0		  ; 低位相减MOV R0, A		  ; 将低位相减后得到的结果放入R0//中位MOV A, #4HMOVC A, @A+DPTR	  ; 读取程序存储器地址 4H 数据 88(中位)MOV R1, A		  ; 使用 R1 暂时存储数据MOV A, #1HMOVC A, @A+DPTR	  ; 读取程序存储器地址 1H 数据 88(中位)SUBB A, R1		  ; 中位相减MOV R1, A		  ; 将中位相减后得到的结果放入R1//高位MOV A, #3HMOVC A, @A+DPTR	  ; 读取程序存储器地址 3H 数据 99(高位)MOV R2, A		  ; 使用 R2 暂时存储数据MOV A, #0HMOVC A, @A+DPTR	  ; 读取程序存储器地址 0H 数据 77(高位)SUBB A, R2		  ; 高位相减MOV R2, A		  ; 将高位相减后得到的结果放入R2END

http://www.xdnf.cn/news/2156.html

相关文章:

  • 高精度运算(string函数)
  • 【Linux应用】交叉编译环境配置,以及最简单粗暴的环境移植(直接从目标板上复制)
  • 【OSG学习笔记】Day 10: 字体与文字渲染(osgText)
  • ※※惯性时间常数与系统惯量定义、区别、联系
  • 水果成篮--LeetCode
  • Java—— 包装类
  • Arduino+ESP01S烧录
  • AudioVideoMerger 下载与使用
  • 计算机网络 | 应用层(1)--应用层协议原理
  • Git 工具的安装
  • django之优化分页功能(利用参数共存及封装来实现)
  • 一篇入门之-评分卡变量分箱(卡方分箱、决策树分箱、KS分箱等)实操例子
  • 软件开发架构设计原则详解(含案例)
  • 精益数据分析(28/126):解读商业模式拼图与关键指标
  • KTT入门
  • 现代化Android开发:Compose提示信息的最佳封装方案
  • qt事件过滤与传递机制
  • 关于图论的知识
  • 2025.4.26总结
  • GitOps进化:深入探讨 Argo CD 及其对持续部署的影响
  • 图像特征检测算法对比及说明
  • FPGA前瞻篇-数字电路基础-逻辑门电路设计
  • ssm乡村合作社商贸网站设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
  • 【C】初阶数据结构13 -- 快速排序
  • Pygame物理模拟:实现重力、弹跳与简单物理引擎
  • DAM-3B,英伟达推出的多模态大语言模型
  • IntelliJ IDEA 2025.2 和 JetBrains Rider 2025.1 恢复git commit为模态窗口
  • 23种设计模式-行为型模式之迭代器模式(Java版本)
  • 测试基础笔记第十三天
  • 工业摄像头通过USB接口实现图像