微机原理与汇编语言实验3循环程序设计实验汇总.docx

上传人:b****6 文档编号:16203793 上传时间:2023-07-11 格式:DOCX 页数:20 大小:135.04KB
下载 相关 举报
微机原理与汇编语言实验3循环程序设计实验汇总.docx_第1页
第1页 / 共20页
微机原理与汇编语言实验3循环程序设计实验汇总.docx_第2页
第2页 / 共20页
微机原理与汇编语言实验3循环程序设计实验汇总.docx_第3页
第3页 / 共20页
微机原理与汇编语言实验3循环程序设计实验汇总.docx_第4页
第4页 / 共20页
微机原理与汇编语言实验3循环程序设计实验汇总.docx_第5页
第5页 / 共20页
微机原理与汇编语言实验3循环程序设计实验汇总.docx_第6页
第6页 / 共20页
微机原理与汇编语言实验3循环程序设计实验汇总.docx_第7页
第7页 / 共20页
微机原理与汇编语言实验3循环程序设计实验汇总.docx_第8页
第8页 / 共20页
微机原理与汇编语言实验3循环程序设计实验汇总.docx_第9页
第9页 / 共20页
微机原理与汇编语言实验3循环程序设计实验汇总.docx_第10页
第10页 / 共20页
微机原理与汇编语言实验3循环程序设计实验汇总.docx_第11页
第11页 / 共20页
微机原理与汇编语言实验3循环程序设计实验汇总.docx_第12页
第12页 / 共20页
微机原理与汇编语言实验3循环程序设计实验汇总.docx_第13页
第13页 / 共20页
微机原理与汇编语言实验3循环程序设计实验汇总.docx_第14页
第14页 / 共20页
微机原理与汇编语言实验3循环程序设计实验汇总.docx_第15页
第15页 / 共20页
微机原理与汇编语言实验3循环程序设计实验汇总.docx_第16页
第16页 / 共20页
微机原理与汇编语言实验3循环程序设计实验汇总.docx_第17页
第17页 / 共20页
微机原理与汇编语言实验3循环程序设计实验汇总.docx_第18页
第18页 / 共20页
微机原理与汇编语言实验3循环程序设计实验汇总.docx_第19页
第19页 / 共20页
微机原理与汇编语言实验3循环程序设计实验汇总.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

微机原理与汇编语言实验3循环程序设计实验汇总.docx

《微机原理与汇编语言实验3循环程序设计实验汇总.docx》由会员分享,可在线阅读,更多相关《微机原理与汇编语言实验3循环程序设计实验汇总.docx(20页珍藏版)》请在冰点文库上搜索。

微机原理与汇编语言实验3循环程序设计实验汇总.docx

微机原理与汇编语言实验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中了。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2