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

关于汇编语言与程序设计——子程序设计

学习目标:

编程实现两个数:#8888H 和 #79H 的乘除运算。


一、实验要求

能够熟练掌握算术运算汇编指令的使用;熟练掌握子程序设计的基本方法;熟练掌握程序的调试方法。

二、实验设计

 1.整体思路

乘法:将单字节的乘数由低位字节到高位字节依次相乘(MUL AB),将当前字节运算的积的低位字节A与上一字节的运算结果的进位(B+Cy)相加所得结果存入寄存器,反复跳转循环,直至完成运算。

除法:将被除数由高位字节到低位字节依次不断减去除数,当进行减法的被减数字节不够减去除数时,向上一字节的运算结果的余数进行借位,直至上一字节的运算结果的余数变为0,且当前字节小于除数时,被除数进入下一位运算,直至完成最低位运算,并存入余数。

2.流程图

乘法程序:

除法程序:

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

(1)乘法模块/子程序

(2)除法模块/子程序

三、 实现效果

(1)乘法运行结果 

(2)除法运行结果

四、学习总结

1.对多字节的运算,可以通过合理的转换,转换成多次的单字节运算。

2.注意现场保护和恢复现场。

3.在实验开始前,不清楚应该怎样去移位,要移几位,也不知道商和余数具体怎样去计算。学习过程中,通过翻找指令集,一点一点把这部分编程完成了,感觉收获很多,且学到了很多新的指令。

附录:

(1)乘法:
ORG 0000H  
NUM1:   DW 8888H
NUM2:   DB 79H
START:MOV DPTR,#0000HMOVC A,@A+DPTR			MOV R0,A					;将88H(高位)存入R0CLR AINC DPTR	   MOVC A,@A+DPTR		    MOV R1,A					;将88H(低位)存入R1CLR AINC DPTR	MOVC A,@A+DPTRMOV R2,A					;将79H存入R2
MUL_LOOP:MOV B,R1MUL AB				    ;高位->R1,低位->AMOV R5,A	MOV R1,B			   		MOV A,R0					MOV B,R2MUL AB					;高位->R2,低位->AADDC A,R1				;R2*R1结果的高8位与R2*R0结果的低8位做进位加法MOV R4,AMOV A,BADDC A,#00HMOV  R3,AEND除法:ORG 0000H  
NUM1:   DW 8888H
NUM2:   DB 79HMOV DPTR,#0000HMOVC A,@A+DPTRMOV R0,A	 	;将88H(高位)存入R0
CLR A
INC DPTR    MOVC A,@A+DPTRMOV R1,A		;将88H(低位)存入R1CLR AINC DPTR MOVC A,@A+DPTRMOV R2,A		;将79H存入R2MOV R6,#0000H
START:;低位累次相减MOV A,R0CLR CSUBB A,R2JNC LOOP1       ;若R0>R2则跳转到LOOP1
LOOP:MOV A,R6INC AMOV R6,ASUBB A,#08HJZ LOOP_END	    ;若累加器为0则跳转至LOOP_ENDMOV A,R1   CLR C    		;将进位清零RLC A    		;R1带进位循环左移,最高位->CyMOV R1,A     	;将循环左移后的数保存回R1MOV A,BRLC A     		;余数循环左移MOV B,A   		;将循环左移后的余数存回B中JNC LOOP    	;循环这一操作,直到余数最高位为1RRC A     		;将余数循环右移至最高位为1nopMOV R7,A		MOV A,R1RRC A			;余数循环右移nopCLR C			;将进位清零SUBB A,R2		;判断是否够减JNC LOOP2		;若进位标志为0则跳转至LOOP2LOOP1:MOV A,R0MOV B,R2DIV AB			;R0-R2MOV R3,A		;取低位为余数AJMP LOOP		;返回LOOP继续循环
LOOP2:MOV A,R7MOV B,R2DIV AB			;R7-R2MOV R4,A		;取低位为余数AJMP LOOP		;返回LOOP
LOOP_END:      END   

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

相关文章:

  • Android WIFI体系
  • Vue基础(一) 基础用法
  • 【Delphi】简化数据库读写(Helper)
  • Canvas基础篇:绘制矩形
  • 废品回收小程序:全链路数字化解决方案,赋能绿色未来
  • SDC命令详解:使用get_nets命令进行查询
  • windows如何使用cmd命令翻转屏幕
  • 多源数据整合与数据虚拟化:构建灵活、高效的数据架构
  • RPG2.设置角色摄像机
  • js day9
  • 按键精灵安卓ios辅助工具脚本:实用的文件插件(lua开源)
  • 解决ktransformers v0.3 docker镜像中 operator torchvision::nms does not exist 问题
  • Redis入门到实战——基础篇
  • JavaSE第12篇:接口interface
  • Shopify网上商店GraphQL Admin接口查询实战
  • keep-alive具体使用方法
  • 我心中的现代前端大厦
  • LabVIEW模板之温度监测应用
  • dx11 龙宝书 第五 六章 流水线
  • leetcode 2962. 统计最大元素出现至少 K 次的子数组 中等
  • 规范编码策略以及AST的应用的学习
  • 如何使用 Nacos 对 Python 服务进行服务发现与注册
  • 【Dify系列教程重置精品版】第三章:Dify平台的本地化部署
  • Idea 如何配合 grep console过滤并分析文件
  • 关于浏览器对于HTML实体编码,urlencode,Unicode解析
  • Janus-1B评测
  • vue 优化策略,大白话版本
  • 一页概览:统一数据保护方案
  • Discord多账号注册登录:如何同时管理多个账户?
  • 全球667629个流域90m分辨率数据(流域参数含:面积、长度、宽度、纵横比、坡度和高程等)