实验2-寻找最大数最小数

  • 格式:docx
  • 大小:383.28 KB
  • 文档页数:6

实验一、寻找最大数最小数实验
吴艳红 11283019
一、实验目的
1、 学习循环程序结构,掌握编写循环处理程序的方法和技巧。
2、 通过循环结构程序熟悉汇编语言程序设计的主要方法。
3、 了解和掌握程序设计过程中算法的选择。
4、 掌握汇编语言调试方法。

二、实验题目
以buff开始的内存单元中有10个有符号数(字节型DB):
-37、28、-115、-2、98、-100、93、120、56、-99
请编写程序,找出最大的数并存入MAX单元中,同时也找出最小的数并存入MIN单元中,
在Debug下运行程序,查看数据区MAX和MIN的内容检验运行结果。

三、实验过程
1、 新建一个.txt文件,在文件中编辑寻找最大数最小数的源程序代码,并以max——
min.asm命名保存,程序代码见附。
2、 用MASM 文件汇编源程序,C>masm max_min.asm; 生成目标文件max_min.obj和
max_min.lst。
3、 用LINK连接程序,C>link max_min; 形成max_min.exe文件。
结果见截图1:

截图 1
4、在DEBUG调试环境下调试并运行max_min.exe程序。
C>debug max_min.exe,首先用R指令,后使用U指令查看编写的程序结果见截图2

截图 2
单步执行完命令后,用 D DS:0 检查数据区MAX及MIN内容,检查结果是否正确。见截图3:
已知78H为最大数,8DH为最小数,说明程序运行结果正确。

截图 3
四、实验过程遇到的问题以及解决办
之前一直在尝试利用加法将ASCII码转换成字符输出,结果总是出现乱码,经过仔细的
考虑和认真的尝试之后,终于发现了问题所在:本组给定的数据为-37、28、-115、-2、98、
-100、93、120、56、-99,当把最大数还有最小数输入到寄存器DL中用以输出时,数据以
补码的形式保存,可是数据默认是ASCII码,每一个ASCII码对应一个字符,所以当存入数
据78H时,表示ASCII码的120位字符x,即输出x,而不是78H,如果提出改进,将BUF
的输入值改为0,1,2,3,4,5,6,7,8,9十位数时,经过ASCII码与字符的转换,即在ASCII
码的基础上加一个30H,那么就将数字转换成了相应的字符,如截图4,即为修改后的运行
结果截图:输出结果为0和9,结果正确。

截图 4
除了上述将输入数据改变以外,提出另外的改进方法,参考教材有关子程序的设计,发
现可以将2位十六进制数转换成相应的ASCII码,子程序设计如下:
CONHA PROC
MOV AH,BL ;保存待转换的数
AND BL,0FH ;处理十六进制数低位
CMP BL,0AH ;判断是不是十六进制中的字母
JB ASCI ;不是 转移
ADD BL,07 ;是 加7
ASCI: ADD BL,30H ;转换为ASCII码
MOV DH,BL ;保存转换的低位数据
MOV CL,4 ;移位控制
SHR AH,CL ;将原数右移 处理高位
CMP AH,0AH
JB ASCI1
ADD AH,07
ASCI1: ADD AH,30H
MOV DL,AH ;保存转换好的高位
MOV AH,2
INT 21H
MOV DL,DH
MOV AH,2
INT 21H
RET
CONHA ENDP
在程序中调用如下子程序后输出结果见截图5:可以看到,输出结果分别是8DH,78H 结果
正确,达到了此次试验的目标。

截图 5
五、思考
1、 查看DOS操作系统把可执行程序装载到内存的首地址及结束地址。
当我们用编辑程序把源程序输入到机器中,用汇编程序把它转换为目标程序,用连
接程序对其进行连接和定位时,操作系统为每一个用户程序建立了一个程序段前缀区
PSP,其长度为256个字节,主要用于存放所要执行程序的有关信息,同时也提供了程
序和操作系统的接口。操作系统在程序段前缀的开始处(偏移地址0000H)安排了一条
INT 20H软中断指令,INT 20H中断服务程序由DOS提供,执行该服务程序后,控制就
转移到DOS,即返回到DOS管理的状态。因此,用户在组织程序时,必须使程序执行完
后能去执行存放于PSP 开始处的INT 20H指令,这样便返回到DOS,否则就无法继续键
入命令和程序。
DOS在建立了程序段前缀区PSP之后,就将要执行的程序从磁盘装入内存。在定位程
序时,DOS将代码段置于PSP下方,代码段之后是数据段,最后放置堆栈段。内存分配
好之后,DOS就设置段寄存器DS和ES的值,以使它们指向PSP的开始处,即INT 20H
的存放地址,同时将CS设置为PSP后面代码段的段地址,IP设置为指向代码段中第一
条要执行的指令位置,把SS设置为指向堆栈的段地址,让SP指向堆栈段的栈底(取决
于堆栈的长度),然后系统开始执行用户程序。

2、 查看MAX和MIN的段地址及偏移地址。
见下图6,max的段地址为ds,偏移地址为000A,min的段地址为ds,偏移地址为
000B.

截图 6
3、 分别计算数据段和代码段占用的地址空间大小。
见下图7,可见数据段使用的空间大小0000-000B,代码段使用的空间大小是
0000-005E
截图 7
六、附程序代码
DATA SEGMENT
BUF DB -37,28,-115,-2,98,-100,93,120,56,-99 ;数据
CNT EQU $-BUF ;循环次数
MAX DB ? ;存放最大数
MIN DB ? ;存放最小数
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV CX,CNT-1
MOV BX,OFFSET BUF ;首地址
MOV AH,[BX] ;假定第一个数为最大数
MOV AL,[BX] ;假定第一个数为最小数
LOOP1: INC BX ;指向下一个数
CMP AH,[BX] ;比较
JGE NEXT1 ;AH中数大
MOV AH,[BX] ;AH中数小,替换
JMP NEXT2
NEXT1: CMP AL,[BX] ;比较
JNGE NEXT2
MOV AL,[BX] ;AL中数大,替换
NEXT2: DEC CX
JNZ LOOP1 ;循环
MOV MIN,AL
MOV MAX,AH ;存储最大数
MOV BL,AL
MOV BH,AH

CALL CONHA
MOV BL,BH
CALL CONHA

MOV AH,4CH
INT 21H
CONHA PROC
MOV AH,BL ;保存待转换的数
AND BL,0FH ;处理十六进制数低位
CMP BL,0AH ;判断是不是十六进制中的字母
JB ASCI ;不是 转移
ADD BL,07 ;是 加7
ASCI: ADD BL,30H ;转换为ASCII码
MOV DH,BL ;保存转换的低位数据
MOV CL,4 ;移位控制
SHR AH,CL ;将原数右移 处理高位
CMP AH,0AH
JB ASCI1
ADD AH,07
ASCI1: ADD AH,30H
MOV DL,AH ;保存转换好的高位
MOV AH,2
INT 21H
MOV DL,DH
MOV AH,2
INT 21H
RET
CONHA ENDP
CODE ENDS
END START