汇编语言编写一个程序,求10个无符号数组中的最大值和最小值。

这篇博客详细介绍了如何使用汇编语言编写一个程序,来找出10个无符号数组中的最大值和最小值。通过DOSBOX环境,博主展示了从编写源代码到编译、运行、调试的完整过程,以及在debug工具中使用u、g、d、r、t命令来验证程序的正确性。在实验过程中,博主发现了因未正确初始化变址寄存器导致的错误,并给出了修正方案。

汇编语言编写一个程序,求10个无符号数组中的最大值和最小值。

实验原理:

1、使用记事本等编辑软件编写程序源代码,并保存为asm文件。

DATA SEGMENT
AREA DW 100,3,654,54,898,3,125,6666,545,781
COUNT EQU ($-AREA)/2
MAX DW 65535
MIN DW 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
           MOV DS,AX
		   MOV SI,OFFSET AREA
		   MOV AX,65535
		   MOV BX,0
		   MOV CX,COUNT
COMPARE: MOV BX,AREA[SI]
		 CMP AX,BX
		 JB NEXCHANGE
		 MOV AX,BX
NEXCHANGE: ADD SI,2
		   LOOP COMPARE
		   MOV MIN,AX
		   MOV AX,0
		   MOV BX,0
		   MOV CX,COUNT
COMPARE2: MOV BX,AREA[SI]
		 CMP BX,AX
		 JB NEXCHANGE2
		 MOV AX,BX
NEXCHANGE2: ADD SI,2
		   LOOP COMPARE2
		   MOV MAX,AX
		   MOV AH,4CH
            INT 21H			
CODE ENDS
END START

2、使用DOSBOX软件搭建汇编环境,调用masm和link程序,将源代码编译链接成可执行程序(maxmin.exe)。如图
在这里插入图片描述在这里插入图片描述

3、运行maxmin.exe,查看程序运行情况及结果检验
在DOS环境中运行debug maxmin.exe,运用debug的u,g,d,r,t调用功能,即可查看检验程序运行状况。
首先调用反汇编指令u查看每条代码的代码段偏移地址
在这里插入图片描述
找到已初始化完成语句MOV AX,SEG AREA,该语句对应的偏移地址为0005,
再调用运行命令g,执行g5 ,并调用显示内存单元内容的命令D (d0)查看内存单元内容
在这里插入图片描述
绿框中为待处理10个无符号数100,3,654,54,898,3,125,6666,545,781对应的16进制存储单元,每4位16进制对应一个0~65535无符号数,共20个存储单元。两红框中为表示最大值和最小值的变量MAX和MIN的存储单元,预设值分别为65535和0,即16进制数FFFF和0000。
再次调用反汇编指令u查看后续代码的代码段偏移地址,找到主程序已运行完毕的语句MOV AH,4CH,该语句对应的偏移地址为0046
在这里插入图片描述
再调用运行命令g,执行g0046,并调用显示内存单元内容的命令D (d46)查看内存单元内容
在这里插入图片描述
变量MAX中为十六进制数1A0A,刚好对应十个数中最大数6666,
变量MIN中为十六进制数0003,刚好对应十个数中最小数3,运行结果正确。

实验过程原始记录及计算结果(数据、表格、计算、曲线等)

在完成求取最小值程序编写后,我尚未继续编写求取最大值程序,以便于检验最小值程序和整体框架的正确性,经运行调试后,得到正确的求取最小值程序,但之后我本打算将最小值程序稍作修改得到最大值程序,编写后进行调试发现如下错误结果
在这里插入图片描述
经检查发现,是我在求取最小值程序后尚未将变址寄存器SI赋值回数组AREA的首地址,使得求取最大值程序发生错误。改正方法:求取最大值程序前应重新初始化,将SI赋回数组AREA的首地址,修改程序,加上 MOV SI,OFFSET AREA命令,之后运行调试正确。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值