汇编与接口实验报告2Word文档下载推荐.docx
《汇编与接口实验报告2Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《汇编与接口实验报告2Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
某控制系统为了抗干扰,采用去极值滤波法处理采集数据,取连续6个A/D采样值(12位——双字节,低12位),要求去掉最大值和最小值,将余下4个数求平均值,用该平均值代表当前时刻系统状态的真值。
试编一程序完成这个滤波过程。
3、键盘及屏幕显示功能调用
试编一程序扫描键盘,当B键按下时,在屏幕上显示0~9循环计数;
S键按下时停止计数;
再按B键继续计数过程。
E键按下时退出程序。
4、流程图与代码
1、多字节无符号数加法:
(所用寄存器为16位)
(1)流程图:
(2)代码:
.MODELSMALL
.DATA
DATA1DW4321H,2265H,3333H,4444H,5555H,6666H,7777H,8888H,9999H,0AAAAH
RESULTdw?
?
.CODE
.startup
MOVSI,OFFSETDATA1;
设指针
MOVCX,10;
累加次数
MOVAX,0;
清累加器
MOVDX,0;
清进位累加器
LOP:
ADDAX,[si];
累加一个数到AX
ADCDX,0;
将进位累加到DX
INCSI;
改指针
INCSI
LOOPLOP;
循环
MOVRESULT,AX;
存结果
MOVRESULT+2,DX
.EXIT
END
(3)运行结果:
2、延时器设计(本人学号为偶数,因此以下的程序是在计算机屏幕上显示两列,第一列0---F,第二列F---0列。
)
主程序流程图:
延时子程序流程图:
.modelsmall
.data
data1db5dup(20H)
num1db30h
num2db46h,0ah,0dh,'
$'
.code
.startup
movcx,10h;
设循环次数
lop:
movah,09h;
显示功能调用
movdx,offsetdata1
int21h
callnearptrdelay;
调用延时子程序
incnum1
decnum2
cmpnum1,3ah
jnznext1;
num1为冒号:
时跳转next1
movnum1,41h
next1:
cmpnum2,40h
jnznext2;
num2位@时跳转next2
movnum2,39h
next2:
looplop
nop
.exit
delayprocnearusescxbx;
延时子程序
movbx,06ffh;
06ffh,设第二时常数
delay1:
movcx,0h
loop$;
自身循环CX次
decbx;
第二时常数减1
jnzdelay1;
不为零循环
ret
delayendp
end
3、单字节无符号数排序
.586
.STACK200H
numdb10
data1db3h,23h,55h,12h,89h,99h,5fh,6ah,29h,47h
.STARTUP
movbl,num;
数据个数
decbl
lop1:
movzxcx,bl;
扩展为16位
movsi,0
lop2:
moval,data1[si]
cmpal,data1[si+1]
jblop3;
[si]<
[si+1]
incsi
looplop2
jmpnext
lop3:
xchgal,data1[si+1]
movdata1[si],al
next:
jzendl
jmplop1
endl:
END
4、去极值滤波
.modelsmall
.data
datanumdb6
datasdw0123h,0abch,0234h,0345h,0456h,0567h
.code
.startup
callpx;
排序
movsi,offsetdatas+2;
掐头去尾送指针
movcx,4;
送累加次数
clc;
清进位
movax,0
qh:
addax,[si];
累加
adcdx,0
loopqh
shrax,2;
除4
mov[datas],ax;
存结果到DATAS首位
.exit
pxprocnear
movbl,datanum;
取字长
decBL
lop0:
movzxcx,bl;
送比较次数
movax,datas[si];
送前数
cmpax,datas[si+2];
与后数比较
jbejh;
若大于则跳转到jh
looplop;
循环比较
jmpnext;
一轮排序完
jh:
xchgax,datas[si+2];
交换
movdatas[si],ax
decbl;
修改比较次数
jzfinish
jmplop0
finish:
nop;
结束
pxendp
5、键盘及屏幕显示功能调用
mess1db'
pressbbutton---count'
0dh,0ah
mess2db'
presssbutton---stop'
mess3db'
pressebutton---exit'
0dh,0ah,'
mess4db'
end'
countdb5dup(20h)
count1db30h,0dh,'
movah,09h;
显示提示信息
movdx,offsetmess1
leasi,count1;
count_;
设处理指针
scan:
callnearptrdelay;
调延时、键扫程序
orbx,bx;
判有无键动
jnzscan1;
有键动,转键处理
jmpsi;
无键动,转当前处理程序
scan1:
;
键处理程序
cmpal,'
b'
jeb_proc
s'
jes_proc
e'
jee_proc
calldelay
jmpsi
b_proc:
leasi,count_;
B键处理
jmpscan
s_proc:
leasi,stop;
S键处理
e_proc:
E键处理
count_:
inccount1;
修改显示数字
moval,3ah;
比较超限
cmpal,count1
jadown;
若不超限,调显示
movcount1,30h;
超限,设启始值
down:
leadx,count;
ds:
dx
stop:
delayprocnearusescx;
movbx,300h;
设第二时常数
loop$;
movdl,0ffh;
监测键动
movah,06h;
若标志位ZF=0,表示AL有来自键盘的字符
int21h;
若标志位ZF=1,表示没有得到字符,且AL=0
jnzkey_ret;
若有键动,延时终止,转键处理
decbx;
jnzdelay1;
jmpdelay_ret
key_ret:
movbx,1;
做键动标志
delay_ret:
ret
按下B键开始计数:
按下S键停止计数:
按下E键退出:
5、总结
本次实验涉及到循环程序的设计跟冒泡排序的汇编程序编写,以及分支条件语句在汇编程序中的实现,这次实验考虑到很多寄存器位数的拓展,因为有时候进位的结果常常使程序运行结果异常,最后一个键动程序涉及到分支条件跳转,较难理解,再者,因为32位应用程序的局限性,我在自己电脑用的是轻松汇编,查询数据都要用到物理地址,不是很方便,总之,通过这次实验,实践操作能力再次提高了。