微机原理与汇编语言实验3循环程序设计实验汇总.docx
《微机原理与汇编语言实验3循环程序设计实验汇总.docx》由会员分享,可在线阅读,更多相关《微机原理与汇编语言实验3循环程序设计实验汇总.docx(20页珍藏版)》请在冰点文库上搜索。
微机原理与汇编语言实验3循环程序设计实验汇总
微机原理与汇编语言
实验报告
姓名
xxx
学号
xxxxxx
专业班级
计科x班
课程名称
微机原理与汇编语言
实验日期
2014.10.22
实验名称
循环程序设计实验
成绩
一、实验目的
1、掌握循环程序的设计方法。
2、掌握比较指令、转移指令和循环指令的使用方法。
3、进一步掌握调试工具的使用方法。
二、实验内容
1、实验原理
(1)键盘输入的十进制数如368在计算机中是以33H,36H,38H形式存放的,如何将它们转换为一个二进制数101110000B,以便对累加循环的循环次数进行控制是本程序首先要解决的问题
(2)累加结果为一个16位的二进制数,为了显示结果,必需把它们转换为十进制数
2、实验步骤
(1)流程图
(2)实验源码
.modelsmall
.stack;定义堆栈段
.data;定义数据段
inf1db"Pleaseinputanumber(1-627):
$"
inf2db0ah,0dh,"1+2+......+$"
ibufdb7,0,6dup(0)
obufdb6dup(0)
.code
start:
movax,@data
movds,ax
movdx,offsetinf1
;将屏幕输入的十进制数(存放于ibuf)转化为二进制数存储于ax中
movah,09h
int21h
movdx,offsetibuf
movah,0Ah
int21h
movcl,ibuf+1
movch,0
movsi,offsetibuf+2
movax,0
loop1:
movdx,10
muldx
andbyteptr[si],0Fh
addal,[si]
adcah,0
incsi
looploop1
movcx,ax;计算1+2+3+...+n
movax,0
movbx,1
loop2:
addax,bx
incbx
looploop2
movdi,offsetobuf+6;将ax中的二进制数转换为十进制数并以ascii的形式存于obuf
movbyteptr[di],'$'
movbx,10
loop3:
movdx,0
divbx
adddl,30h
decdi
mov[di],dl
orax,ax
jnzloop3
decdi
mov[di],'='
movdx,offsetinf2;结果输出
movah,09h
int21h
movcl,ibuf+1;显示n
movch,0
movsi,offsetibuf+2
loop4:
movdl,[si]
adddl,30h
incsi
movah,02h
int21h
looploop4
movdx,di
movah,09h
int21h
movax,4c00h
int21h
endstart
实验习题1源码:
;multi-segmentexecutablefiletemplate.
.modelsmall;定义程序的存储模式(small表示小型模式)
.stack;定义堆栈段
.data;定义数据段
inf1db0ah,0dh,"1+2+......+$"
obuf1db6dup(0)
obuf2db7dup(0);除了六位数字外还要有一个=号
.code
start:
movax,@data
movds,ax
movdx,offsetinf1;输出1+2+......+
movah,09h
int21h
movax,0;计算1+2+3+...+n
movbx,1
loop1:
addax,bx
incbx
cmpax,60000
jbeloop1
pushax;将最终结果备份入栈
pushbx;将n备份
popcx
movdi,offsetobuf1+5
;将cx二进制数转换为十进制数并以ascii的形式存于obuf1
movbyteptr[di],'$'
movax,cx
movbx,10
loop2:
movdx,0
divbx
adddl,30h
decdi
mov[di],dl
orax,ax
jnzloop2
movdx,di;输出n
movah,09h
int21h
popax
movdi,offsetobuf2+6
;将ax中的二进制数转换为十进制数并以ascii的形式存于obuf2
movbyteptr[di],'$'
movbx,10
loop3:
movdx,0
divbx
adddl,30h
decdi
mov[di],dl
orax,ax
jnzloop3
decdi
mov[di],'='
movdx,di;=输出结果
movah,09h
int21h
movax,4c00h
int21h
endstart
实验习题2源码:
;multi-segmentexecutablefiletemplate.
.modelsmall;定义程序的存储模式(small表示小型模式)
.stack;定义堆栈段
.data;定义数据段
inf1db'Pleaseinputsixnum:
',0ah,0dh,'$'
inf2db'sum:
$'
obuf0db0ah,0dh,'$'
ibufdb5,0,4dup(0)
obufdb6dup(0)
.code
start:
movax,@data
movds,ax
movdx,offsetinf1;输出提示信息
movah,09h
int21h
movbx,6;设置外层循环次数
loop1:
movdx,offsetibuf
movah,0Ah
int21h
movcl,ibuf+1;设置内层循环次数
movch,0
movsi,offsetibuf+2
movax,0
loop2:
movdx,10;将屏幕输入的十进制数(存放于ibuf)转化为二进制数存储于ax中
muldx
andbyteptr[si],0Fh
addal,[si]
adcah,0
incsi
looploop2
pushax;将结果入栈保存
movdx,offsetobuf0;回车换行
movah,09h
int21h
decbx
cmpbx,0
jnzloop1
movcx,6
movax,0
loop3:
popbx
addax,bx
looploop3
movdi,offsetobuf+5
;将ax中的二进制数转换为十进制数并以ascii的形式存于obuf
movbyteptr[di],'$'
movbx,10
loop4:
movdx,0
divbx
adddl,30h
decdi
mov[di],dl
orax,ax
jnzloop4
movdx,offsetinf2;输出提示信息
movah,09h
int21h
movdx,di
movah,09h
int21h
movax,4c00h
int21h
endstart
实验习题3源码:
;multi-segmentexecutablefiletemplate.
.modelsmall;定义程序的存储模式(small表示小型模式)
.stack;定义堆栈段
.data;定义数据段
infdb"Pleaseinputanum(0-65535):
$"
inf2db0ah,0dh,"Thenumof1:
$"
ibufdb6,0,5dup(0)
obufdb6dup(0)
.code
start:
movax,@data
movds,ax
moves,ax
movah,09h;输出提示信息Pleaseinputanum:
movdx,offsetinf
int21h
movah,0Ah;接收一个无符号十进制整数(小于65536)
movdx,offsetibuf
int21h
movax,0
movcl,ibuf+1;将屏幕输入的十进制数(存放于ibuf)转化为二进制数存储于ax中
movch,0
movsi,offsetibuf+2
loop1:
movdx,10
muldx
andbyteptr[si],0Fh
addal,[si]
adcah,0
incsi
looploop1
movbx,0
loop2:
shrax,1
adcbx,0
cmpax,0
jnzloop2
movax,bx
movdi,offsetobuf+5
;将ax中的二进制数转换为十进制数并以ascii的形式存于obuf
movbyteptr[di],'$'
movbx,10
loop3:
movdx,0
divbx
adddl,30h
decdi
mov[di],dl
orax,ax
jnzloop3
movah,09h;输出提示信息Thenumof1:
movdx,offsetinf2
int21h
movah,09h;将统计结果在屏幕上显示出来
movdx,di
int21h
movax,4c00h
int21h
endstart
实验习题4源码:
;multi-segmentexecutablefiletemplate.
.modelsmall;定义程序的存储模式(small表示小型模式)
.stack;定义堆栈段
.data;定义数据段
Nequ5
ibufdb4,0,3dup(0)
inf1db'PleaseinputNnum(0-255):
',0ah,0dh,'$'
inf2db'Sort:
',0ah,0dh,'$'
bufdbNdup(0)
obuf2db4dup(0)
obufdb0ah,0dh,'$'
.code
start:
movax,@data
movds,ax
movdx,offsetinf1;输出提示信息
movah,09h
int21h
movdi,offsetbuf
movbx,N;设置外层循环次数
loop1:
movdx,offsetibuf
movah,0Ah
int21h
movcl,ibuf+1;设置内层循环次数
movch,0
movsi,offsetibuf+2
movax,0
loop2:
movdx,10;将屏幕输入的十进制数(存放于ibuf)转化为二进制数存储于ax中
muldx
andbyteptr[si],0Fh
addal,[si]
incsi
looploop2
mov[di],al
incdi
movdx,offsetobuf;回车换行
movah,09h
int21h
decbx
cmpbx,0
jnzloop1
movbx,N-1;比较大小
movcx,bx
movdx,bx
movdi,offsetbuf
loop3:
movsi,di
moval,[di]
incsi
loop4:
cmp[si],al
jbeloop5
moval,[si]
movah,[di]
mov[si],ah
mov[di],al
loop5:
incsi
looploop4
decdx
movcx,dx
incdi
decbx
cmpbx,0
jneloop3
movdx,offsetinf2;输出提示信息
movah,09h
int21h
;结果输出
movcx,N
movsi,offsetbuf
loop6:
movdi,offsetobuf2+3
;将buf中的二进制数转换为十进制数并以ascii的形式存于obuf2,并输出
movbyteptr[di],'$'
movbx,10
moval,[si]
movah,0
loop7:
movdx,0
divbx
adddl,30h
decdi
mov[di],dl
orax,ax
jnzloop7
movdx,di
movah,09h
int21h
movdx,offsetobuf
movah,09h
int21h
incsi
looploop6
movax,4c00h
int21h
endstart
3、实验结果
(1)实验结果
(2)实验习题1
程序流程图:
(3)实验习题2
(4)实验习题3
(5)实验习题4
3、实验总结
1)通过本次实验我掌握循环程序的设计方法,掌握比较指令、转移指令和循环指令的使用方法,进一步掌握了调试工具的使用方法。
2)在实验过程中我也遇到过许多困难,我觉的最大的困难时汇编难于调试,特别是代码写的很多的时候,某处的错误很难能够查的出来。
我的办法是每写一段程序就调试一下是否是正确的,比如说本次的实验大致可分为五个功能片段,第一个是输出信息,第二个是接受屏幕上的数字串,第三个是将数字串转化为二进制数,第四是累加求和,第五是将二进制数转化为十进制数形式的数字串。
可以用分开来调试的方法,通过一条功能后在进行下一条功能的书写与调试工作。
另外书写注释也是非常重要的,只有这样才能利于后来的阅读。
3)本次实验中经常会遇到寄存器不够用的情况,因为cx用于计数,dx有时会用于存储向屏幕输出字符串的首地址,而自己又不想在数据段额外定义一个区域存储这些值。
于是在习题2中要求输入6个数时我用到了栈。
每当进行功能调用ax的值要被改变时,我将ax的值存有栈中保存。
进行求和时在将这6个数出栈即可。
4)在进行循环程序设计的过程当中,最后一个排序问题花了我很长的时间,原因是进行排序要用到2层的循环。
我的解决该问题的算法是选择排序法,内层用cx作为循环计数器,外层仿照cx,用bx作为计数器,每进行一次循环bx减一,如果bx=0后,整个循环结束。
首先将第一个数与该数组的其他数字比较大小,如果其他数字比第一个数小则指针指向下一个数字,否则将该数字与第一个数交换位置,指针后移,每进行一次内部循环,都将选出一个最大的数字置于第一个位置。
进行N-1次外层循环后,即可将这些数字排序了。
这里面我将N作为符号常量,通过改变程序里的N值可以实现对N个数排序的功能。
5)我选择的运行软件是emu8086,因为用它调试比较方便,但它不支持dup(?
)这种书写方式,所以我将dup(?
)均改为dup(0)。
6)在本实验中如果求和时的输入大于627会发生溢出的现象,因为累加求和的结果存放于ax中,存储的最大无符号数是65535,所以会发生溢出的现象。
解决的办法可以利用位扩展的方式,用两个寄存器保存结果,比如用bx保存溢出后舍去的进位。
添加adcbx,0就可以将进位标志寄存器的进位存储于bx中了。