只为记录汇编实验(子程序设计)
题目:编写程序,设有10个无符号数的字节序列,利用子程序的方法编程,求出该序列中的最大值和最小值。最大值放在BH,最小值放在BL(显示一位16进制)
代码如下:
;编写程序,设有10个无符号数的字节序列,利用子程序的方法编程,求出该序列中的最大值和最小值。
;最大值放在BH,最小值放在BL(显示一位16进制)
DATA SEGMENT
ARRAY DB 15,1,2,3,0,8,14,13,10,5 ;定义数组
LEN DB $-ARRAY ;定义字符串长度
CRLF DB 0AH,0DH,'$' ;定义换行
STR1 DW 'THE MAX NUMBER IS:$' ;定义输入输出提示语句
STR2 DW 'THE MIN NUMBER IS:$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE ,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
XOR CX,CX ;cx初始化
MOV CL,LEN ;把len长度赋值给cl,按照题目要求,也可以用MOV CL,10也可以
SUB CL,1
MOV SI,OFFSET ARRAY ;使指针si指向array
MOV BH,[SI] ;把si指向的内容赋值给bh
MOV BL,[SI] ;把si指向的内容赋值给bl
INC SI ;si指针自增1
CALL FIND ;执行find子程序,其程序功能是找出最大与最小值
MOV DX,OFFSET STR1 ;输出提示语句
MOV AH,9H
INT 21H
MOV DL,BH ;把bh内容赋值给dl
CALL PRINT ;执行print子函数
MOV DX,OFFSET CRLF ;换行
MOV AH,9
INT 21H
MOV DX,OFFSET STR2 ;输出提示语句
MOV AH,9
INT 21H
MOV DL,BL ;把bl内容赋值给dl
CALL PRINT ;执行print子程序
MOV AH,4CH ;结束程序
INT 21H
FIND PROC
X: MOV AL,[SI] ;把si指向地址的内容赋值给AL
CMP AL,BL ;al和bl比较
JB CHANGE_BL ;如果al比较小则跳change_bl函数
F: CMP AL,BH ;al和bh比较
JA CHANGE_BH ;如果al比较大则跳转change_bh函数
NEXT:
INC SI ;si指针自增1
LOOP X ;做循环 当cl=0时,退出循环执行下一条语句
JMP OVER ;跳到over函数
CHANGE_BL: ;把al的值赋给bl
MOV BL,AL
JMP F ;跳f函数
CHANGE_BH: ;把al的值赋给bh
MOV BH,AL
JMP NEXT ;跳next函数
OVER: ;结束子函数
RET
FIND ENDP
PRINT PROC
CMP DL,9 ;dl与9比较
JB NEXT1 ;跳next1函数
ADD DL,7 ;因为dl>9因此要转换成A-F的格式
NEXT1:
ADD DL,30H;dl+30H转ascll码输出
MOV AH,02H;输出dl
INT 21H
RET ;结束子程序
PRINT ENDP
CODE ENDS
END START