一、实验目的
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 存储器,存储器这种低级的错误。
经过这段时间的训练,一点点地编写代码与调试,对于汇编语言有了更高一层的理解与掌握,也认识到了它身为低级语言的重要性,希望我在未来的学习中能更加深刻的学习与掌握相关知识,搭建好人与机器沟通的桥梁。