汇编语言课程实验报告11Word文档格式.docx

上传人:b****1 文档编号:4871004 上传时间:2023-05-04 格式:DOCX 页数:36 大小:305.99KB
下载 相关 举报
汇编语言课程实验报告11Word文档格式.docx_第1页
第1页 / 共36页
汇编语言课程实验报告11Word文档格式.docx_第2页
第2页 / 共36页
汇编语言课程实验报告11Word文档格式.docx_第3页
第3页 / 共36页
汇编语言课程实验报告11Word文档格式.docx_第4页
第4页 / 共36页
汇编语言课程实验报告11Word文档格式.docx_第5页
第5页 / 共36页
汇编语言课程实验报告11Word文档格式.docx_第6页
第6页 / 共36页
汇编语言课程实验报告11Word文档格式.docx_第7页
第7页 / 共36页
汇编语言课程实验报告11Word文档格式.docx_第8页
第8页 / 共36页
汇编语言课程实验报告11Word文档格式.docx_第9页
第9页 / 共36页
汇编语言课程实验报告11Word文档格式.docx_第10页
第10页 / 共36页
汇编语言课程实验报告11Word文档格式.docx_第11页
第11页 / 共36页
汇编语言课程实验报告11Word文档格式.docx_第12页
第12页 / 共36页
汇编语言课程实验报告11Word文档格式.docx_第13页
第13页 / 共36页
汇编语言课程实验报告11Word文档格式.docx_第14页
第14页 / 共36页
汇编语言课程实验报告11Word文档格式.docx_第15页
第15页 / 共36页
汇编语言课程实验报告11Word文档格式.docx_第16页
第16页 / 共36页
汇编语言课程实验报告11Word文档格式.docx_第17页
第17页 / 共36页
汇编语言课程实验报告11Word文档格式.docx_第18页
第18页 / 共36页
汇编语言课程实验报告11Word文档格式.docx_第19页
第19页 / 共36页
汇编语言课程实验报告11Word文档格式.docx_第20页
第20页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

汇编语言课程实验报告11Word文档格式.docx

《汇编语言课程实验报告11Word文档格式.docx》由会员分享,可在线阅读,更多相关《汇编语言课程实验报告11Word文档格式.docx(36页珍藏版)》请在冰点文库上搜索。

汇编语言课程实验报告11Word文档格式.docx

start:

movax,DATA

movds,ax

moves,ax

leasi,STRING1

leadi,STRING2

cld

movcx,25

repzcmpsb

jzmatch

leadx,mess2

jmpshortdisp

match:

leadx,mess1

disp:

movah,9

int21h

movah,4ch

ret

mainendp

codeends

endstart

在debug中通过-g命令运行程序后,结果如下:

 

实验二用DEBUG编程:

使用堆栈段将

AX和BX的内容进行交换等

一、程序说明

本实验包括两个部分,第一个部分是将AX和BX的内容进行交换,并用堆栈作为两寄存器交换内容的中间存储单元;

第二部分是用DEBUG的命令将存储器偏移地址300H~304H连续单元顺序装入0AH,0BH,0CH,0DH,0EH。

在DEBUG状态下送入给出的程序中。

第一个程序先将AX的内容进栈,然后将BX的内容赋给AX,再将出栈的内容赋给BX即可。

第二个程序是在进入debug后,用-a指令输入给出的程序,然用-e指令安要求修改内存的内容,再用-t指令逐步执行每条指令,看修改的内存内容对指令执行结果的影响。

二、调试说明

第一部分先将程序编好后,在DOS环境下用masm程序生成obj文件,再用link程序生成exe文件,然后进入debug进行调试,用-t命令逐步运行程序,查看AX和BX中内容的变化。

如果发现AX和BX中的内容进行了交换,则说明

程序运行成功。

第二部分先将基本的程序结构编好,再进入debug程序,先用-u指令查看一下程序,结果如下:

再用-a指令从13FC:

000B后面输入已给出的程序,然后用-u0指令查看程序,结果如下

这时可以先用-t指令将程序逐步执行到指令movax,bx之前,然后用-e300指令安要求修改相关的内存内容,再用-d300指令查看一下修改后的内存内容,结果如下:

然后再用-t指令逐步执行程序,观察每步指令执行后,ax中的内容,结果如下:

可以看出,在执行完指令MOVAX,BX后,ax中的内容为AX=0300,在执行完指令MOVAX,0304H后,ax中的内容为AX=0304,在执行完指令MOVAX,[0304H]后,ax中的内容为AX=580E,在执行完指令MOVAX,[BX]后,ax中的内容为AX=0B0A,在执行完指令MOVAX,0001[BX]后,ax中的内容为AX=0C0B,在执行完指令MOVAX,[BX][SI]后,ax中的内容为AX=0D0C,在执行完指令MOVAX,0001[BX][SI]后,ax中的内容为AX=0E0D,这样的结果应该和我们预期的一样。

三、源程序清单和执行结果

第一部分的源程序:

DATASSEGMENT

DATASENDS

STACKSSEGMENT

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

START:

MOVAX,DATAS

MOVDS,AX

MOVAX,3000H

MOVBX,5000H

PUSHAX

movAX,BX

POPBX

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

在debug程序中,用-t指令可以逐步执行指令,可以看到在每条指令执行完后,ax和bx中的内容的变化,通过比较可以看出,ax和bx中的内容从开始时的

AX=3000,BX=5000变为AX=5000,BX=3000,说明AX和BX中的内容发生了交换,最终执行结果如下:

第二部分初始时的源程序如下:

DATAS

MOVBX,0300h

MOVSI,0002h

INT21H

做完所有操作,程序的最终的执行结果如下:

实验三、存储器块清零和内存块移动

第一个程序用来存储块清零,先设置块起始地址,然后设置块长度,再将当前地址内容清零,地址加一,然后判断是否清完,若清完则结束,否则返回到上一步。

第二个程序用来移动内存块,先设置块的源地址,再设置块的目标地址,然后设置移动长度,安长度重复传送数据直到结束。

第一个程序在进入debug后,先用-u指令查看一下程序,再将断点设置在指令Loopagain之后,通过指令-g加上指令Loopagain后的地址,将程序运行到Loopagain之后停止,然后再通过-d指令查看相关内存内容是否被清零。

第二个程序在进入到debug后,先用-u指令查看一下程序,再将断点设置在指令repmovsb之前,通过指令-g运行后,然后用-d指令查看一下内存块的相关内容,得到的结果如下:

然后在将断点设置在指令repmovsb之后,通过指令-g运行后,再用-d指令查看一下内存块的相关内容,得到的结果如下:

三、源程序清单和执行结果

第一部分的源程序为:

DATASSEGMENT

blockdb256dup(55h)

STACKSSEGMENT

ASSUMECS:

START:

movbx,offsetblock

movcx,256

again:

mov[bx],byteptr0;

字节填充0

incbx

loopagain

ENDSTART

程序的最终执行结果为:

第二部分地址块加一方法移动块的源程序:

sourcedb256dup(055h)

targetdb256dup(0aah)

DATAS,ES:

MOVES,AX

movsi,offsetsource

movdi,offsettarget

repmovsb

第二部分地址块减一方法移动块的源程序:

movsi,offsetsource

addsi,255

next:

moval,[si]

mov[di],al

decsi

incdi

loopnext

movah,0

第二部分的两个源程序的最终执行结果相同,最终结果如下:

实验四将键盘输入的小写字母用大写字母显示出来

本程序用来将小写字母转变为大写,并在屏幕上显示出来。

先利用DOS功能调用INT21H的1号功能从键盘输入字符,然后判断输入的是否是小写字母,若不是小写字母,则显示输入出错,重新输入。

若输入的是小写字母,则通过将其减去20h,从而变为大写字母。

在通过DOS功能调用INT21H的2号功能显示出来。

若输入的是Enter键,则结束程序。

开始时,我设计的程序没有设计出退出的代码,整个程序处于无限运行状态,当时我没有意识到这种情况,在给来时检查时,老师提出了这个问题,于是我在程序中,字符输入之后的代码出加了将字符与回车字符比较的代码,如果输入的字符在与回车键相等,则整个程序结束。

调试程序可以在debug中进行,基本步骤和前面的实验大致相同,在软件Masm集成实验环境2008.4中编辑程序,则可以直接点击程序上的调试按钮,即可进行调试。

调试时可通过-t指令来逐步运行程序,观察相关内容变化,来调试程序。

在开始编好程序的时候,我发现输出的并不是我想要的结果,后来在调试程序中我用-t指令进行逐步运行程序,我才发现我的错误之处。

原来我在程序的第二十七行将al的值直接赋给dl了,表面上看这是没有问题的,但在调试程序中逐步调试就会发现这样做是错误的,因为在这之前调用了DOS功能调用INT21H的9号功能,这样会改变al中的值,从而使我赋给dl的值并不是我真正想要赋给dl的值,所以导致最终结果出现错误。

我通过在调用INT21H的9号功能之前,先将al的值赋给cl,再通过cl将我想要的值赋给dl,这样就避免了这种错误了。

在改正之后,整个程序就运行得到我想要的结果了。

string1db'

Inputerror!

Pleaseinputbetweenatoz!

'

0ah,0dh,'

string2db'

$'

L0:

movah,1

int21h

cmpal,0dh

jzexit

cmpal,'

a'

jaeL1

jbL3

L1:

z'

jnaL2

jaL3

L2:

subal,20h

movcl,al

leadx,string2

movah,9

int21h

movdl,0

movdl,cl

movah,2

movdl,0ah

movdl,0dh

movah,2

jmpL0

L3:

leadx,string1

jmpL0

exit:

程序最终运行结果如下:

实验报告

系班级学号姓名

同组者指导教师

实验五:

循环程序设计

第一个程序是用来显示AL寄存器中的两位十六进位制数,通过DOS功能调用INT21H的2号功能显示出来。

第二个程序是用来判别键盘上输入的字符:

若是1-9字符,则显示之;

若为A-Z或a-z字符,均显示“c”;

若是回车字符<

CR>

z则结束程序,若为其他字符则不显示,继续等待新的字符输入。

首先输入一个字符,将其和回车字符比较,若是回车字符,则结束程序。

1-9字符,则显示之。

若是若小于0,则重新等待输入。

若大于9,则跳转到和‘A’、Z’比较,若小于’A’,则重新等待输入,若大于’Z’,则跳转到和’a’、’z’比较处,若小于a或大于z,则重新等待输入,否则输出‘c’。

调试时可通过-t指令来逐步运行程序,观察程序是如何进行循环的。

修改AL中的内容,可以通过-r指令来实现,如修改ax中的内容,通过指令-rax来实现,如下图所示:

从图中可看出,修改后,ax中的内容从开始的003E变为231A。

四、源程序清单和执行结果

第一个程序的源程序:

CODES

moval,3eh

pushax

movdl,al

movcl,4

shrdl,cl

cmpdl,9

jbenext1

adddl,7

next1:

adddl,30h

popax

anddl,0fh

jbenext2

next2:

程序的最终运行结果如下所示:

第二个程序的源程序:

movah,1

jzdone

0'

jbnext

9'

jacharup

jmpSTART

charup:

cmpal,41h

cmpal,5ah

jachrdn

dispc:

movdl,'

c'

next:

jmpSTART

chrdn:

cmpal,61h

jbnext

jmpdispc

done:

MOVAH,4CH

程序的最终运行结果如下:

实验报告

实验六:

分支程序设计

三、调试说明

调试时可通过-t指令来逐步运行程序,观察程序是如何进行分支的。

第一个程序的源程序:

第二程序的源程序为:

jachrdn

cmpal,7ah

janext

jmpdispc

程序的最终运行结果为:

实验七:

统计不同成绩段学生的人数

本程序用来统计在不同分数段的学生人数并显示出来。

有三个子程序,分别用来统计各分数段的学生人数、输出相关内容、换行回车。

子程序一中,先将每个学生的分数从100、90、80、70、60逐个比较,在哪一分数段,则将其个数加一。

直到所有分数都完成比较。

子程序二则利用DOS功能调用INT21H的9号功能在显示器上显示一个字符串和2号功能在显示器上显示一个字符来实现输出相关内容。

子程序三通过DOS功能调用INT21H的2号功能在显示器上显示一个字符实现换行和回车的。

刚将程序设计出来的时候,我发现输出的结果并不是我想要的。

而且我始终找不到错误,后来我在调试程序中用-t指令逐步调试,我发现了我的错误原因,原来没有回车换行的指令,在加入相关指令后,我的程序中还有一个错误,在每个数输出前没有指令将其加上30H,这样运行出来的结果是各种奇怪的字符,二不是我想要的结果。

后来请教了其他同学才发现了这个问题。

于是在每个分数段的学生人数输出之前需将其加上30H。

这样整个程序就运行正常了。

在调试程序若没有换行指令,则运行结果只有最后一个低于六十分的人数,若没有回车指令,则运行结果很乱。

之所以要在每个数输出前将其加上30H,是因为30H是0的ASCII码,只有加上30H之后,才得到需要输出数的ASCII码,这样输出的才是我想要的学生人数个数。

三、程序框图

程序的大致框图如下一页所示:

否是

DATASSEGMENT

arraydb76,69,84,90,73,88,99,63,100,80

Thenumberof100:

Thenumberof90-99:

string3db'

Thenumberof80-89:

string4db'

Thenumberof70-79:

string5db'

Thenumberof60-69:

string6db'

thenumberoflow60:

moval,0

movbx,0

movcx,0

movdh,0

movdl,10

callcount

calloutput

MOVAH,4CH

countprocnear;

子程序一,用来统计各分数段的人数

movsi,0

cmparray[si],100

jzL1

jlnext1

next1:

cmparray[si],90

jaeL2

jlnext2

cmparray[si],80

jaeL3

jlnext3

next3:

cmparray[si],70

jaeL4

jlnext4

next4:

cmparray[si],60

jaeL5

incdh

incsi

decdl

jnznext

jmpexit

incal

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

当前位置:首页 > 人文社科 > 法律资料

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

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