一、实验题目
编写一段程序,在数据段的十个数据单元中,定义20个8位无符号数(或键盘输入)。找出最大数和最小数,分别送到MAX和MIN单元中。显示原始数据、最大值、最小值。
二、代码
DATA SEGMENT
BUF DB 20,35H,38H,34H,36H,30H,41H,47H,55H,33H,39H,57H,59H,49H,62H,78H,61H,37H,65H,66H,68H,'$'
P1 DB 0DH,0AH,'THE ORIGINAL NUMBER ARE:','$'
//定义一个P1为字类型,0ah和0dh组合起来是换行的意思,$经常时字符串的结束标记做回车换行,使字串符能另起一行显示
P2 DB 0DH,0AH,'THE MAX IS:','$'
P3 DB 0DH,0AH,'THE MIN IS:','$'
MAX DB 20 DUP(?) //20 DUP(?)意思表示20个字节单元,内容未知
MIN DB 20 DUP(?)
DATA ENDS
STACK SEGMENT STACK 'STACK'
SA DB 100 DUP(?)
TOP LABEL BYTE //LABEL用作定义变量TOP属性,其类型可以为BYTE、WORD等
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
MAIN PROC FAR //可以换一种写法main:,方便link
START: MOV AX,STACK
MOV SS,AX
MOV SP,OFFSET TOP //意思是将top的首地址传送给寄存器sp
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET P1
MOV AH,9
INT 21H //调用DOS功能,该功能为显示DS:DX地址处的字符
MOV DX,OFFSET BUF[1]
MOV AH,9
INT 21H
MOV DI,OFFSET BUF
MOV CL,BUF[DI]
DEC CL //CL自减少
L1:MOV DL,CL
MOV BH,0
L2: ADD DI,1
MOV AL,BUF[DI]
CMP AL,BUF[DI+1]
JBE CONTI// 即当低于或等于时转移到CONTI ,大于进行前后数据交换,小的到前面来,冒泡排序
XCHG AL,BUF[DI+1]
MOV BUF[DI],AL
MOV BH,1
CONTI: LOOP L2
CMP BH,30H
JE STOP
MOV CL,DL
MOV DI,OFFSET BUF
LOOP L1
MOV DH,BUF[DI+20]
MOV MAX,DH
MOV CH,BUF[DI+1]
MOV MIN,CH
MOV DX,OFFSET P2
MOV AH,9
INT 21H
MOV DL,MAX
mov bl,dl
shr bl,4 ;右移4位,左边填0------先输出高四位
add bl,30h;加上30h
mov dl,bl;
mov ah,2
int 21h
mov bl,max
sal bl,4;左移4位 //SAL是算数左移指令,而SHL是逻辑左移指令
shr bl,4;再右移4位得到低四位,高四位为0----下边相同
add bl,30h
mov dl,bl
MOV AH,2
INT 21H
MOV DX,OFFSET P3
MOV AH,9
INT 21H
MOV DL,MIN
mov bl,dl
shr bl,4
add bl,30h
mov dl,bl
mov ah,2
int 21h
mov bl,MIN
sal bl,4
shr bl,4
add bl,30h
mov dl,bl
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
STOP: RET
MAIN ENDP
CODE ENDS
END START