汇编程序:查找数组中最大最小值
实验内容
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. 首先指出博弈论是一种研究策略形式的方法,对于经济学中,完全竞争市场只能被动接受均衡…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...

多模态大语言模型arxiv论文略读(110)
CoVLA: Comprehensive Vision-Language-Action Dataset for Autonomous Driving ➡️ 论文标题:CoVLA: Comprehensive Vision-Language-Action Dataset for Autonomous Driving ➡️ 论文作者:Hidehisa Arai, Keita Miwa, Kento Sasaki, Yu Yamaguchi, …...