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

汇编语言编写一个程序,求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)。如图
汇编语言编写一个程序,求10个无符号数组中的最大值和最小值。_第1张图片汇编语言编写一个程序,求10个无符号数组中的最大值和最小值。_第2张图片

3、运行maxmin.exe,查看程序运行情况及结果检验
在DOS环境中运行debug maxmin.exe,运用debug的u,g,d,r,t调用功能,即可查看检验程序运行状况。
首先调用反汇编指令u查看每条代码的代码段偏移地址
汇编语言编写一个程序,求10个无符号数组中的最大值和最小值。_第3张图片
找到已初始化完成语句MOV AX,SEG AREA,该语句对应的偏移地址为0005,
再调用运行命令g,执行g5 ,并调用显示内存单元内容的命令D (d0)查看内存单元内容
汇编语言编写一个程序,求10个无符号数组中的最大值和最小值。_第4张图片
绿框中为待处理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
汇编语言编写一个程序,求10个无符号数组中的最大值和最小值。_第5张图片
再调用运行命令g,执行g0046,并调用显示内存单元内容的命令D (d46)查看内存单元内容
汇编语言编写一个程序,求10个无符号数组中的最大值和最小值。_第6张图片
变量MAX中为十六进制数1A0A,刚好对应十个数中最大数6666,
变量MIN中为十六进制数0003,刚好对应十个数中最小数3,运行结果正确。

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

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

你可能感兴趣的:(汇编语言)