汇编程序:查找数组中最大最小值
实验内容
1. 从数据段DS中包含9个字节的数组数据VALUE中分别找出最大值(存到max中)、最小值(存到min中)。
2. 能够单步执行程序,认真观察、判断每条指令执行的结果是否正确,对错误结果,能够做出相应的处理。
实验步骤
(1)启动“emu8086”软件。
(2)输入源程序并存盘为*.asm文件。
(3)编译、链接、运行程序并查看实验结果。
(4)实验报告要求附上程序代码,并记录运行结果。
模拟C语言的for循环遍历数组,比对最大值最小值
程序代码
code1
这段程序是边检索边手搓的,不会将字符显示在显示屏上
DATAS SEGMENT ;定义数据段X DW 5,2,3,4,12,6,7,8,9,5 ;定义10个数MAX DW ? ;存放最大值MIN DW ? ;存放最小值,定义成? 不确定大小
DATAS ENDS ;定义数据段结束 ends与segment成对出现 STACK SEGMENT ;定义堆栈段;DW 20 DUP(0) ;为堆栈段分配空间
STACK ENDS ;定义堆栈段结束CODE SEGMENT ;定义代码段ASSUME CS:CODE, DS:DATAS, SS:STACK ;告诉编译器将段寄存器与符号对应起来
START: ;程序入口 起始地址标号,名称可以自己取MOV AX, DATAS ;取DATA段地址给AXMOV DS, AX ;将段地址DATAS送入DS中 初始化DS段地址,建立CS与DS段联系 MOV DI,OFFSET X ;DI 变址寄存器 ,取X地址?MOV AX,[DI] ;将段地址为 DS 偏移地址为 DI 的内存单元中的值移入 AX 中MOV MIN,AX ;存第一个数,当做默认最大值MOV MAX,AX ;存第一个数,当做默认最小值MOV CX,9 ;设定循环次数9, 一共10个数,减去一个默认值,还需要循环9次Loop_Max_Min: ;循环判断最大值、最小值INC DIINC DI ;DI += 2,DW类型,一个字=两个字节,所以要加两次MOV AX, [DI];将段地址为 DS 偏移地址为 DI 的内存单元中的值移入 AX 中 CMP AX, MAX ;CMP指令,不回送结果,只影响标志位状态JG MAX_Reload ;有符号AX>MAX, 跳转到 MAX_RELOAD CMP AX, MIN ;只影响标志位状态JL MIN_Reload ;有符号 AX<=MIN, 跳转到 MIN_ReloadJG LOOP_Judge ;加一句判断,比最大的小,比最小的大的情况,直接跳转到 Loop_Max_Min,避免顺序执行给MAX变量赋值!MAX_Reload:MOV MAX, AX ;将最大值赋值给MAXJMP LOOP_Judge ;跳转到判断是否继续循环MIN_Reload:MOV MIN, AX ;将最小值赋值给MINJMP LOOP_Judge LOOP_Judge: LOOP Loop_Max_Min ;判断CX,如果大于0就继续循环 MOV AH, 4CH ;返回DOS系统INT 21H
CODE ENDS ;定义代码段结束END START ;程序结束
复制代码,模拟,变量,运行

点击变量会弹出一个变量框

运行(run)


修改MAX和MIN的显示类型

数据段的定义:X DW 5,2,3,4,12,6,7,8,9,5 ;定义10个数
最大是12,最小是2
验证正确,代码没有问题~

code2
第二个思路
并且可以将最大值最小值输出在屏幕上
DATA SEGMENT ;数据段VALUE DB 13,8,36,66,56,65,12,15,24VALNUM EQU $-VALUE ;取地址$ P132 $- 是取长度MAX DB 0 ;定义最大值 8位数据MIN DB 0 ;定义最小值MAX1 DB 'MAX = $'MIN1 DB 'MIN = $' CHANGELINE DB 13,10,'$';用来表示换行符
DATA ENDS CODE SEGMENT ;代码段ASSUME CS:CODE, DS:DATA
START:MOV AX,DATAMOV DS,AXCLD ; DF=0LEA SI,VALUE ;取VALUE地址MOV AH,[SI] MOV MAX,AH ;赋初值MOV MIN,AHINC SIMOV CX,VALNUM-1 ;循环次数
NEXTMAX:LODSB ;串读取指令,将SI指向的内容读入AL,并且SI自加CMP AL,MAX ;与最大值比较JBE TOZUIXIAO ;小于等于最大值,跳转到和最小值比较MOV MAX,AL ;否则顺序执行,赋值给MAX
TOZUIXIAO:CMP AL,MIN ;和最小值比较JAE NEXT ;如果大于等于最小值,跳转到下一次循环MOV MIN,AL ;否则顺序执行,赋值给MIN
NEXT:LOOP NEXTMAX ;判断CX,如果大于0就继续循环 ;如果循环完成,就执行下面显示输出的语句 MOV DX,OFFSET MAX1 ;存放MAX1字符串偏移地址MOV AH,09H ;09H字符串输出 INT 21H MOV AL, MAX ;输出最大值,先将最大值赋值给ALCALL DISPLAY ;调用DISPLAY MOV DX,OFFSET CHANGELINE ;输出换行符MOV AH,9INT 21HMOV DX,OFFSET MIN1MOV AH,09HINT 21HMOV AL, MIN ;最小值赋值给ALCALL DISPLAY MOV AH,4CH ;返回DOSINT 21H;在屏幕上输出
DISPLAY:PUSH BX ;压入堆栈保护PUSH CX;数位分离,分别显示个位十位MOV AH,0MOV BL,10DIV BL ; AX/10,商送AL余数送AHXCHG AL,AH ;一条语句实现交换AL与AH内容OR AX,3030H ;或3030H,将数字转ASCII码MOV CX,AXMOV DL,CH ;AH送DLMOV AH,02H ;单字符显示DL的内容INT 21HMOV DL,CL ;AL送DLMOV AH,02H ;单字符显示DL的内容INT 21H POP CX ;先出POP BX
RETCODE ENDS
END START
- 编程思路:
寻找9个数的最大值最小值的思路,先用第一个数赋初始值,赋给MAX和MIN,取下一个数和最大值比较,如果小于等于最大值就跳转到比较最小的程序,否则赋值给MAX,在比较最小的程序里,如果大于等于最小,就执行下一次循环比较,否则赋值给MIN,依次循环遍历8次,即可找出最大值与最小值。- 程序编写:
段定义:段定义语句后面要加SEGMENT,段定义结束语句后面要加ENDS
定义变量:定义需要用到的变量,可以边写边定义。
段分配:用符号把段定义完成后还需要用ASSUME声明,将段寄存器与符号对应起来。
模块化:将输出显示的部分,封装成一个子函数。- Debug:
运行代码输出MAX=36MIN=36,输出显示有问题,可能是比较大小的程序部分出错,也可能是显示出错,再次运行代码,查看每个变量的值,发现MAX和MIN的数值是正确的,说明比较大小部分的代码正确,那问题就是显示输出有问题,既然能在终端显示36说明可以输出数字,只是输出的数字不对,查看代码,输出最大值最小值的时候,并没有赋要显示的值,在CALL DISPLAY语句前面加上要显示的变量即可。


相关文章:
汇编程序:查找数组中最大最小值
实验内容 1. 从数据段DS中包含9个字节的数组数据VALUE中分别找出最大值(存到max中)、最小值(存到min中)。 2. 能够单步执行程序,认真观察、判断每条指令执行的结果是否正确,对错误结果,能够做出…...
ElasticSearch之禁用交换分区
操作系统将进程加载至内存中执行时,对于当前未使用到的内存页,可能会将相关内存页交换至硬盘上,即swap。 对于性能敏感、时延敏感的应用程序比如ElasticSearch,swap特性会明显影响性能和稳定性,因此最好禁用swap特性。…...
【Linux】第二十一站:文件(一)
文章目录 一、共识原理二、C系列文件接口三、从C过渡到系统:文件系统调用四、访问文件的本质 一、共识原理 文件 内容 属性 文件分为打开的文件 和 没打开的文件 打开的文件:是谁打开的?是进程!----所以研究打开的文件本质是研…...
centos7 docker开启认证的远程端口2376配置
docker开启2375会存在安全漏洞 暴露了2375端口的Docker主机。因为没有任何加密和认证过程,知道了主机IP以后,,任何人都可以管理这台主机上的容器和镜像,以前贪图方便,只开启了没有认证的docker2375端口,后…...
Java王者荣耀小游戏
Background类 package LX;import java.awt.*; //背景类 public class Background extends GameObject{public Background(GameFrame gameFrame) {super(gameFrame);}Image bg Toolkit.getDefaultToolkit().getImage("C:\\Users\\ASUS\\Desktop\\王者荣耀图片\\Map.jpg&…...
谈谈Redis的几种经典集群模式
目录 前言 主从复制 哨兵模式 分片集群 前言 Redis集群是一种通过将多个Redis节点连接在一起以实现高可用性、数据分片和负载均衡的技术。它允许Redis在不同节点上同时提供服务,提高整体性能和可靠性。在Redis中提供集群方案总共有三种:主从复制、…...
【腾讯云 HAI域探秘】基于高性能应用服务器HAI部署的 ChatGLM2-6B模型,我开发了AI办公助手,公司行政小姐姐用了都说好!
目录 前言 一、腾讯云HAI介绍: 1、即插即用 轻松上手 2、横向对比 青出于蓝 3、多种高性能应用部署场景 二、腾讯云HAI一键部署并使用ChatGLM2-6B快速实现开发者所需的相关API服务 1、登录 高性能应用服务 HAI 控制台 2、点击 新建 选择 AI模型,…...
服务器tar压缩解压文件
文章目录 一、前言二、命令2.1、解压2.2、压缩 三、最后 一、前言 前端上传dist代码到服务器上后,是在linux上操作,所以和window有所不同。一般是打好dist,然后压缩成gz传输到服务器,此时在服务器上可能涉及到解压和压缩的操作&a…...
博物馆线上导览系统的设计与实现-计算机毕业设计源码64574
摘 要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存…...
vue升级题
不熟悉的: 2, 3.你用过befcoreDetory 吗?清除定时器,第一个和第二个再看一下 实例加载完成是在哪个生命周期--beforecreate 7.父子组件生命周期执行顺序?为什么这么渲染?场景 8.简单描述每个周期具体适…...
Edit And Resend测试接口工具(浏览器上的Postman)
优点 可以不用设置Cookie或者Token,只设置参数进行重发接口测试API 使用Microsoft Rdge浏览器 F12——然后点击网络——在页面点击发起请求——然后选择要重发的请求右键选择Edit And Resend——在网络控制台设置自己要设置的参数去测试自己写的功能...
maven常用打包命令,值传递和引用传递,Java包 ,JDK 中常用的包有哪些,import java和javax有什么区别
文章目录 maven常用打包命令Java程序设计语言对对象采用的不是引用调用,实际上,对象引用是按值传递的。值传递和引用传递有什么区别Java包 ,JDK 中常用的包有哪些import java和javax有什么区别 谈谈java基础的内容,而且很多人都回…...
【c++随笔14】虚函数表
【c随笔14】虚函数表 一、虚函数表(Virtual Function Table)1、定义2、查看虚函数表2.1、 问题:三种类型,包含一个int类型的class、一个int类型的变量、int类型的指针:这三个大小分别是多少呢?2.2、怎么发现…...
分布式链路追踪实战篇-日志库集成opentelemetry的思路
由上文分布式链路追踪入门篇-基础原理与快速应用可以知道分布式链路追踪的作用,但是距离应用到项目中,我们还需要对项目中一些关键组件进行opentelemetry的集成,例如日志库,ORM、http框架、rpc框架等。 一、日志库如何集成opentel…...
电脑投屏到电视的软件,Mac,Linux,Win均可使用
电脑投屏到电视的软件,Mac,Linux,Win均可使用 AirDroid Cast的TV版,可以上笔记本电脑或台式电脑直接投屏到各种安卓电视上。 无线投屏可以实现本地投屏及远程投屏,AirPlay协议可以实现本地投屏,大家可以按需…...
基于vue+element-plus+echarts编写动态绘图页面
我们都知道网页的echarts可以画图,但是很多情况下都需要编码实现绘图逻辑,如果有一个前端页面可以让我输入数据然后动态生成图表的话那么该多好,其实这个需求不难实现,先看效果。 整体页面分为左右两个部分,其中左边的…...
无人机巡检如何做到实时识别,从数据到模型全流程解读
在数字化和自动化飞速发展的今天,AI识别算法正在加速进入行业生产系统。 基于巡检数据的智能开发,识别算法突破性进展的核心驱动力在于需求——从全天候巡视的平安城市,到潮汐变化的交通网络,从广阔的水域,到繁忙的街道…...
zlmediakit实现rtsp流服务器
本次实现是将内存中的H264数据经过zlmediakit实现为rtsp流。 我是用的是CAPI的方式,将zlmediakit作为一个sdk嵌入到自己的程序中而不是作为一个独立的进进程服务。 1.编译完成zkmedialit后会得到bin include lib三个文件夹如图 其中bin中的MediaServer是作为独立的…...
保姆级 ARM64 CPU架构下安装部署Docker + rancher + K8S 说明文档
1 K8S 简介 K8S是Kubernetes的简称,是一个开源的容器编排平台,用于自动部署、扩展和管理“容器化(containerized)应用程序”的系统。它可以跨多个主机聚集在一起,控制和自动化应用的部署与更新。 K8S 架构 Kubernete…...
耶鲁博弈论笔记
编辑记录: 1126:开个新坑,耶鲁大学的博弈论课程, 和专业相关不大,纯兴趣,尽量写好一点吧 1. 首先指出博弈论是一种研究策略形式的方法,对于经济学中,完全竞争市场只能被动接受均衡…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
