作业帮 > 综合 > 作业

汇编语言,最大值、最小值、中值问题

来源:学生作业帮 编辑:神马作文网作业帮 分类:综合作业 时间:2024/11/17 14:08:36
汇编语言,最大值、最小值、中值问题
通过键盘输入7个不相等的数据(数据均介于0-255之间),将最小值、最大值和中值显示在屏幕上
汇编语言,最大值、最小值、中值问题
; 本程序通过编译,运行正确.
Code Segment
Assume CS:Code,DS:Code
; -----------------------------------------
; 定义常量
Yes equ 1
No equ 0
On equ 1
Off equ 0
CR equ 0DH
LF equ 0AH
KBBack equ 8
; -----------------------------------------
; 定义结构类型
Bubb_Para Struc ; 冒泡排序法参数表
Carry DB No ; 是否带符号.Yes:有符号数;No:无符号数
Sort DB No ; 升序/降序.Yes:升序;No:降序
Yes_No DB 73h,76h,7dh,7eh
Load DB 0ach,0adh
Comp DB 3ah,3bh
Exchange DB 86h,87h
Store DB 0aah,0abh
Bubb_Para EndS
; -----------------------------------------
; 功能:按要求对数组元素排序,能够对字节元素、字元素进行无符号数、有符号数的升序、降序排序.
; 子程序原型:对字节元素进行无符号升序排序.
Bubbling Proc Near
PUSH AX
PUSH BX
PUSH CX
PUSH SI
PUSH DI
; ------------------根据排序参数,修改排序指令
LEA SI,Parameters
LEA DI,@@Compare
MOV AL,TYPE Number
DEC AL
PUSH AX
LEA BX,[SI.Load]
XLAT
MOV [DI][2],AL
POP AX
PUSH AX
LEA BX,[SI.Comp]
XLAT
MOV [DI][3],AL
POP AX
PUSH AX
LEA BX,[SI.Exchange]
XLAT
MOV [DI][7],AL
POP AX
LEA BX,[SI.Store]
XLAT
MOV [DI][9],AL
MOV AL,[SI.Carry]
SHL AL,1
OR AL,[SI.Sort]
XOR AH,AH
LEA BX,[SI.Yes_No]
XLAT
MOV [DI][5],AL
; ------------------按要求排序
MOV CX,Elements-1 ;外循环次数
@@Scanning: PUSH CX ;入栈保存外循环次数
LEA SI,Number ;数组首地址装入源变址寄存器
@@Compare: PUSH SI
POP DI ;当前数组元素地址赋给目的变址寄存器,以备交换之用
LODSB ;将当前数组元素读入累加器
CMP AL,[SI] ;当前数组元素与相邻的下一个数组元素相比较
JBE @@NextOne ;若小于或等于,不作数据交换,处理下一个数组元素
XCHG AL,[SI] ;若大于,交换数组元素
STOSB ;保存数值较小者
@@NextOne: LOOP @@Compare ;处理下一个数组元素
POP CX ;外循环次数出栈
LOOP @@Scanning ;下一趟比较
; ------------------
POP DI
POP SI
POP CX
POP BX
POP AX
RET
Bubbling EndP
; -----------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -----------------------------------------
; 功能:取光标位置
; 入口:无
; 出口:DH=行号,DL=列号
GetCursor Proc Near
PUSH AX
PUSH BX
PUSH CX
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP CX
POP BX
POP AX
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
; -----------------------------------------
; 功能:置光标位置
; 入口:Cursor_Row=行坐标; Cursor_Col: 列坐标)
SetCursor Proc Near
PUSH CX
PUSH BX
PUSH AX
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
RET
SetCursor EndP
; -----------------------------------------
; 功能:输出回车换行
enter_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
enter_CTLF endp
; -----------------------------------------
; 功能:键盘输入一个N位的十进制数字,
; 数据输入说明:
; 1、输足N位的,不用回车,自然结束本数据输入;
; 2、不足N位的,需回车结束本数据输入
; 入口:N=数字位数;di=保存输入的数字首地址
; 出口:转换后的二进制数保存在di所指的单元
Input_Digit Proc Near
push dx
push cx
push bx
push di
lea di,@@Save_Tmp
push di
cld
mov cx,N
push cx
@@Input: call GetCursor ;取光标位置
mov ah,1 ;从键盘接受一个字符
int 21h
cmp al,CR ;若键入的是回车,已经键入的数字不足N位
jz @@ASC_Dec ;转去处理已经键入的数字
cmp al,KBBack
jz @@KB_Back ;若是回空键,重新输入
cmp al,'0'
jb @@KBBack ;若低于数字'0',重新输入
cmp al,'9'
ja @@KBBack ;若低于数字'9',重新输入
jmp @@Save_Dig
@@KB_Back: dec Cursor_Col
inc cx
dec di
@@KBBack: call SetCursor ;置光标位置
jmp @@Input
@@Save_Dig: and al,0fh ;转换成二进制数
stosb ;保存
loop @@Input ;接受下一个数字
@@ASC_Dec: mov ax,cx
pop cx
pop si
sub cx,ax ;实际输入的数字位数
xor dx,dx
xor ax,ax
jcxz @@Save_Ret ;若直接回车,没有输入任何数字,按输入'0'处理
dec cx ;实际输入的数字位数减1,准备把输入的这一串数字转换成二进制数
mov bl,10
@@Mul_Ten: lodsb
cbw
add ax,dx
mul bl
mov dx,ax
loop @@Mul_Ten
lodsb
cbw
add ax,dx
@@Save_Ret: pop di
stosb
pop bx
pop cx
pop dx
ret
@@Save_Tmp db 16 dup(?)
Input_Digit EndP
; -----------------------------------------
; 功能:把AL中的二进制无符号数转换成显式的十进制ASCII码
; 入口:AL=二进制数;di=转换后的ASCII保存地址
; 出口:无
Dec_ASCII Proc Near
push si
push cx
push bx
push di
mov bl,10
xor cx,cx
lea di,@@Temp_Save[3]
cld
@@Divide: xor ah,ah
div bl
or ah,30h
mov [di],ah
dec di
inc cx
test al,0ffh
jnz @@Divide
push di
pop si
inc si
pop di
pop bx
push di
rep movsb
mov byte ptr [di],'$'
pop di
pop cx
pop si
ret
@@Temp_Save db 4 dup(?)
Dec_ASCII EndP
; -----------------------------------------
N equ 3 ;数字位数(介于0-255之间的无符号数)
Elements equ 7 ;数据个数
PromptStr db 'Please Enter ',N or 30h,' digits for ',Elements or 30h,' numbers: $'
Max_Num db 13,10,13,10,'The maximum is $'
Mix_Num db 13,10,13,10,'The miximum is $'
Mid_Num db 13,10,13,10,'The midoule is $'
Number db Elements dup(?) ;从键盘接受的Elements个N位数字
Parameters Bubb_Para ;无符号数降序排序
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段

; 通过键盘输入7个不相等的数据(数据均介于0-255之间),将最小值、最大值和中值显示在屏幕上
Output PromptStr ;提示输入Elements个N位数字
lea di,Number ;数字存放地址
mov cx,Elements ;数据个数
Read_Number:call enter_CTLF ;输入一个回车、换行
call Input_Digit ;从键盘接受指定位数的数据
loop Read_Number
call Bubbling ;无符号数降序排序
Output Max_Num ;最大值
mov al,Number ;取最大值
lea di,Temp_STr ;显式的十进制ASCII码字符串暂存地址
call Dec_ASCII ; 把AL中的二进制无符号数转换成显式的十进制ASCII码
Output Temp_STr ;显示最大值
Output Mix_Num ;最小值
mov al,Number[Elements-1] ;取最小值
lea di,Temp_STr ;显式的十进制ASCII码字符串暂存地址
call Dec_ASCII ; 把AL中的二进制无符号数转换成显式的十进制ASCII码
Output Temp_STr ;显示最小值
Output Mid_Num ;中值
mov al,Number[(Elements-1)/2] ;取中值
lea di,Temp_STr ;显式的十进制ASCII码字符串暂存地址
call Dec_ASCII ; 把AL中的二进制无符号数转换成显式的十进制ASCII码
Output Temp_STr ;显示中值
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Temp_STr:
Code ENDS
END Start ;编译到此结束