汇编语言(8086)问题

2024-12-02 20:52:38
推荐回答(1个)
回答(1):

朋友,我帮你做的汇编题目,回答你百度的提问,希望对你有帮助,
我采用的是键盘输入数据方式,
另外我用的是EMU8086写的不知你的MASM可不可以用!
满意的话把分给我哈。。。。。。。。。。。

;********************************************************************
;题目:已知从BUF单元开始存放着10个8位无符号数,要求编写汇编语言程序 **
;将这10个数去掉一个最大的,去掉一个最小的, **
;将其余的数的算术平均值计算出来并存于AVERG字节单元。 **
;要求输出时有提示信息。 **
;附加一:在输出之前显示一下这10个数,要有提示信息 **
;附加二:从键盘输入10个十进制无符号数, **
; 而不是在数据区中预存,输入数据前要有提示信息。 **
;********************************************************************
;********************************数据段
data segment
array db 0,0,0,0,0,0,0,0,0 ;为键盘输入数据开辟空间
AVERG db 10 dup(0) ;AVERG单元保存平均值
string1 db "Please input 10 numbers: $" ;字符串以$结束
string2 db "Ok,the data you input have been sorted! $"
string3 db "Now,the max numbers: $"
string4 db " and the min numbers: $"
string5 db " had been deleted! $"
string6 db "The other 8 numbers are :$"
string7 db "The AVERG of this 8 numbers is : $"
crlf db 13,10,13,10,"$" ;13回车,10换行
data ends
;**********************************
;**********************************代码段
code segment
assume ds:data,cs:code ;段对应关系的说明
main proc far ;far子程序调用时的参数
start:
push ds
sub ax,ax ;清零
push ax ;压栈
mov ax,data ;将数据传送入数据段
mov ds,ax
;---------------------------------------
;主程序开始
;---------------------------------------------------------
;显示"Please input 10 numbers:$" 的内容
mov ah,09h
lea dx,string1
int 21h
;-----------------------------------------------------------
;键盘输入数字
mov bx,offset array ;设定基址
mov si,0 ;循环计数设定
input:
mov ah,02h
mov dl,20h ;每隔数据间加上一个空格
int 21h
mov ah,01h
int 21h
cmp al,20h ;20h=32d,ASCII中的空格键
je input ;可以采用空格隔开
sub al,30h ;ASCII值与十进制数转换
mov [bx+si],al ;将累加器中的数据传送到数组中保存起来
inc si ;计数器加1
cmp si,9
jle input ;小于等于9则继续输入(共10个数)
;--------------------------------------------------------------
;对数组元素进行排序找出最大最小元素
mov bx,offset array
mov cx,0ah ;求实际循环次数,cx作为里层循环计算器
dec cx
again1:
mov dx,cx ;dx赋初值作为外层循环计数器
mov si,00H ;si作为数据指针置0
again2:
mov al, [bx+si] ;取第一个数给al
cmp al, [bx+si+1] ;与下一个数比较
jnb again3 ;al大于或等于第二个数则转跳
xchg al,[bx+si+1] ;若小于则互换,大的数放低字节
mov [bx+si],al ;小的数放高字节
again3:
add si,1 ;si加2,指向下一个数
dec dx ;修改外循环次数
jnz again2 ;如果dx不等于0,则跳转至Loop2
loop again1
;----------------------------------------------------------------
;换行
mov ah,09h
lea dx,crlf
int 21h
;------------------------------------------------------------
;屏显"Ok,the data you input have been sorted!"并换行
mov ah,09h
lea dx,string2 ;显示字符串string2的内容
int 21h
mov ah,09h
lea dx,crlf
int 21h
;--------------------------------------------------------------
;输出数组中的数据
mov bx,offset array ;设定基址
mov si,0
output1: ;输出
mov ah,02h
mov al,[bx+si]
add al,30h
mov dl,al ;将数组中的数据一次传送给dl显示
int 21h
mov ah,02h
mov dl,20h ;每隔数据间加上一个空格
int 21h
inc si
cmp si,9
jle output1 ; 小于等于9则继续输出(共10个数)
;----------------------------------------------------------------
;换行
mov ah,09h
lea dx,crlf
int 21h
;--------------------------------------------------------------
;屏显"Now,the max numbers: $"
mov ah,09h
lea dx,string3 ;显示字符串string3的内容
int 21h
mov al,[bx]
add al,30h
mov dl,al ;显示最大的数
mov ah,02h
int 21h
;--------------------------------------------------------------
;屏显" and the min numbers: $"
mov ah,09h
lea dx,string4 ;显示字符串string4的内容
int 21h
mov al,[bx+9]
add al,30h
mov dl,al ;显示最小的数
mov ah,02h
int 21h
;--------------------------------------------------------------
;屏显" had been deleted!$"并换行
mov ah,09h
lea dx,string5 ;显示字符串string5的内容
int 21h
mov ah,09h
lea dx,crlf ;换行
int 21h
;------------------------------------------------------------
;删除最大和最小的两个数据
mov [bx],00h ;删除最大的数据
mov [bx+9],00h ;删除最小的数据
;--------------------------------------------------------------
;屏显"The other 8 numbers are :$"并换行
mov ah,09h
lea dx,string6 ;显示字符串string6的内容
int 21h
mov ah,09h
lea dx,crlf ;换行
int 21h
;--------------------------------------------------------------
;输出数组中的数据
mov bx,offset array ;设定基址
mov si,0
output2: ;输出
mov ah,02h
mov al,[bx+si]
add al,30h
mov dl,al ;将数组中的数据一次传送给dl显示
int 21h
mov ah,02h
mov dl,20h ;每隔数据间加上一个空格
int 21h
inc si
cmp si,9
jle output2 ; 小于等于9则继续输出(共10个数)
;----------------------------------------------------------------
;换行
mov ah,09h
lea dx,crlf
int 21h
;----------------------------------------------------------
;先求总和
mov al,[bx] ;al中存储第一个数
mov si,00h ;计数值
sum:
add al,[bx+si+1]
inc si
cmp si,8
jbe sum
mov cl,al ;用cl来保存和
shr cl,3 ;cl中的值除以8
mov bx,offset AVERG
mov [bx],cl ;保存平均值到AVERG单元中
;--------------------------------------------------------------
;屏显"The AVERG of this 8 numbers is : $"并换行
mov ah,09h
lea dx,string7 ;显示字符串string7的内容
int 21h
mov al,[bx]
add al,30h
mov dl,al ;显示al中的平均值
mov ah,02h
int 21h
mov ah,09h
lea dx,crlf ;换行
int 21h
ret ;返回(return)
main endp ;主函数结束
;********************************************
code ends ;代码段定义结束
end start ;这个程序段全部结束,程序段不但有代码段还有其他段