一、实验目的
1.熟练掌握8086/8088常用汇编指令的使用方法
2.熟练掌握循环结构程序编程技巧
3.熟练掌握汇编语言程序运行调试方法
二、实验要求
认真分析实验题目,设计程序流程图,独立完成代码编写及运行调试。
三、实验题目
给出不大于255的十个正整数,分别计算出其中偶数和奇数的平均值,并以十进制的方式输出,保留到小数点后两位。
四、程序流程图
略。
五、程序代码
sseg segment stack
stp	db 100 dup(0)
sseg ends
dseg segment
dta	db 12,14,12,14,12,16,57,21,25,11
dtb	db 0;偶数计数器
dtc	db 0;奇数计数器
jishu	db 0,0
oushu	db 0,0
num	db ?
flag	db 1
dseg ends
cseg segment
assume cs:cseg,ds:dseg
assume ss:sseg
print macro 
	add al,30h
	mov dl,al
	mov ah,02h
	int 21h
endm
huanhang macro
	mov al,0ah
	mov dl,al
	mov ah,02h
	int 21h
endm
shijinzhi macro
local a,b,c
	mov num,al
	;判断是否大于100
	cmp num,100
	jc a;num<100,cf =1,跳a
	mov ah,0
	mov al,num
	mov bl,100
	div bl;al为商,ah为余数
	mov num,ah
	print
	mov flag,0
a:	;判断是否大于10
	cmp num,10
	jc b
	mov ah,0
	mov al,num
	mov bl,10
	div bl;al为商,ah为余数
	mov num,ah
	print
	mov flag,1
b:	cmp flag,1
	;flag的作用是防止余数小于10
	jnc c
	mov al,0
	print
c:	mov al,num
	print
endm
panduan proc
	mov dl,2eh
	mov ah,02h
	int 21h
	mov al,num
	mov ah,0
	cmp ah,al
	jc notzero
	print
	ret
notzero:	mov al,num
	mov num,100
	mul num;存在ax中
	div bl
	shijinzhi
	ret
panduan endp
start:	mov ax,dseg
	mov ds,ax
	mov ax,sseg
	mov ss,ax
	mov sp,size stp
	mov cx,10
	mov si,0
again:	mov al,[si]
	shr al,1;cf = 1奇,cf = 0偶
	jc d
	mov bl,[si]
	add oushu,bl
	adc byte ptr oushu+1,0
	inc dtb
	jmp e
d:	mov bl,[si]
	add jishu,bl
	adc byte ptr jishu+1,0
	inc dtc
e:	inc si
	loop again
	mov ah,oushu+1
	mov al,oushu
	div dtb;al中存平均值,ah存余数
	mov oushu,al
	mov oushu+1,ah
	mov ah,jishu+1
	mov al,jishu
	div dtc;
	mov jishu,al
	mov jishu+1,ah
	;按十进制输出
	mov al,oushu
	shijinzhi
	mov al,oushu+1
	mov num,al
	mov bl,dtb
	call panduan
	huanhang
	mov al,jishu
	shijinzhi
	mov al,jishu+1
	mov num,al
	mov bl,dtc
	call panduan
	mov ah,4ch
	int 21h
cseg ends
end start 
运行截图:

六、实验总结
本次实验中,我对循环结构程序又有了更新一层认识,对汇编指令的使用规则及方法掌握的更熟练了。在本次实验中,我同时也遇到了一些困难:
- 在最后的几次调试时,发现小数位是不对的,且只有一位数。经过调试发现是我直接将余数打印了出来,并没有处理成小数。要想将余数转化成小数,将余数乘以10的倍数再除以除数即可。
 - 在写宏定义时,也想运用循环结构,不知是否可行。在老师的帮助下,发觉需要在头部声明:local x,x,x。原因是当宏在主程序中被二次展开时,标号会重名,所以要提前声明一下防止出错。
 - 在写程序的过程中也犯了一些基础的错误,如不能直接div 数值,需将数值放在寄存器中;adc oushu+1,0是不行的,需要指明数值类型是字还是字节,应修改为:adc byte ptr oushu+1,0;以及mov 存储器,存储器这种低级的错误。
 
经过这段时间的训练,一点点地编写代码与调试,对于汇编语言有了更高一层的理解与掌握,也认识到了它身为低级语言的重要性,希望我在未来的学习中能更加深刻的学习与掌握相关知识,搭建好人与机器沟通的桥梁。



















