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命令,之后运行调试正确。