汇编语言实验报告.docx
《汇编语言实验报告.docx》由会员分享,可在线阅读,更多相关《汇编语言实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
汇编语言实验报告
汇编语言实验报告
姓名:
专业:
软件工程
班级:
093班
学号:
099074235
实验一汇编运行环境及方法、简单程序设计
一、程序说明
本程序用来比较两个字符串string1和string2所含的字符是否相同。
若相同则显示‘Match’,否则显示‘Nomatch’。
在程序的数据段先定义两个字符串string1和string2,再定义两个字符串mess1和mess2,分别代表‘Match’和‘Nomatch’。
再代码段比较字符串string1和string2,通过比较判断是否相同。
若相同则显示‘Match’,否则显示‘Nomatch’
二、试验流程图。
三、调试说明
再EDIT中建立ASM文件,再用汇编程序对源程序汇编产生目标文件Obj,
再用连接程序产生执行文件EXE。
再用Debug进行调试。
其中常用到的指令有:
用-g命令来用运行程序,用-u命令来显示程序,用-d命令来查看数据段的情况,用-e或-f命令来修改需要改正的部分,用-t指令来逐步执行程序,用-r指令来查看寄存器和修改寄存器的值,-q命令用来退出debug程序。
在这些命令的后面加上地址,可以将命令执行到相应的地方。
如用-g指令运行程序后,再用-u指令显示程序的执行借给如下:
三、源程序清单和执行结果
DATASEGMENT
STRING1DB'Movethecursorbackward.'
STRING2DB'Movethecursorbackward.'
mess1db'match.',10,13,'$'
mess2db'nomatch.',10,13,'$'
DATAENDS
codesegment
mainprocfar
assumecs:
code,ds:
DATA,es:
DATA
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
int21h
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中的内容发生了交换,最终执行结果如下:
第二部分初始时的源程序如下:
DATASSEGMENT
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
MOVBX,0300h
MOVSI,0002h
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
做完所有操作,程序的最终的执行结果如下
实验三、存储器块清零和内存块移动
一、程序说明
第一个程序用来存储块清零,先设置块起始地址,然后设置块长度,再将当前地址内容清零,地址加一,然后判断是否清完,若清完则结束,否则返回到上一步。
第二个程序用来移动内存块,先设置块的源地址,再设置块的目标地址,然后设置移动长度,安长度重复传送数据直到结束。
二、调试说明
第一个程序在进入debug后,先用-u指令查看一下程序,再将断点设置在指令Loopagain之后,通过指令-g加上指令Loopagain后的地址,将程序运行到Loopagain之后停止,然后再通过-d指令查看相关内存内容是否被清零。
第二个程序在进入到debug后,先用-u指令查看一下程序,再将断点设置在指令repmovsb之前,通过指令-g运行后,然后用-d指令查看一下内存块的相关内容,得到的结果如下:
然后在将断点设置在指令repmovsb之后,通过指令-g运行后,再用-d指令查看一下内存块的相关内容,得到的结果如下:
三、源程序清单和执行结果
第一部分的源程序为:
DATASSEGMENT
blockdb256dup(55h)
DATASENDS
STACKSSEGMENT
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
movbx,offsetblock
movcx,256
again:
mov[bx],byteptr0;字节填充0
incbx
loopagain
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
程序的最终执行结果为:
第二部分地址块加一方法移动块的源程序:
DATASSEGMENT
sourcedb256dup(055h)
targetdb256dup(0aah)
DATASENDS
STACKSSEGMENT
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,ES:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVES,AX
movsi,offsetsource
movdi,offsettarget
movcx,256
repmovsb
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
第二部分地址块减一方法移动块的源程序:
DATASSEGMENT
sourcedb256dup(055h)
targetdb256dup(0aah)
DATASENDS
STACKSSEGMENT
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,ES:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVES,AX
movsi,offsetsource
addsi,255
movdi,offsettarget
movcx,256
next:
moval,[si]
mov[di],al
decsi
incdi
loopnext
movah,0
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
第二部分的两个源程序的最终执行结果相同,最终结果如下:
实验四将键盘输入的小写字母用大写字母显示出来
一、程序说明
本程序用来将小写字母转变为大写,并在屏幕上显示出来。
先利用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,这样就避免了这种错误了。
在改正之后,整个程序就运行得到我想要的结果了。
三、源程序清单和执行结果
DATASSEGMENT
string1db'Inputerror!
Pleaseinputbetweenatoz!
',0ah,0dh,'$'
string2db'$'
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
L0:
movah,1
int21h
cmpal,0dh
jzexit
cmpal,'a'
jaeL1
jbL3
L1:
cmpal,'z'
jnaL2
jaL3
L2:
subal,20h
movcl,al
leadx,string2
movah,9
int21h
movdl,0
movdl,cl
movah,2
int21h
movdl,0ah
movah,2
int21h
movdl,0dh
movah,2
int21h
jmpL0
L3:
leadx,string1
movah,9
int21h
jmpL0
exit:
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
程序最终运行结果如下:
补充实验:
5-4:
试编写一段程序,用查表法将一位十六进制数转换成与之对应的ASCII码
datasegment
tabdb30h,31h,32h,33h,34h,35h
db36h,37h,38h,39h,40h,41h
hexdb6
ascdb?
dataends
codesegment
start:
movbx,0
moval,hex
movah,0
addax,bx
xchgax,bx
moval,tab[bx]
movasc,al
movah,4ch
int21h
codeends
endstart
5-5:
试编程求解表达式S=(23000-(X*Y+Z))/Z,其中
X=600,Y=25,Z=-2000
datasegment
tabdb30h,31h,32h,33h,34h,35h
db36h,37h,38h,39h,40h,41h
hexdb6
ascdb?
dataends
codesegment
start:
movbx,0
moval,hex
movah,0
addax,bx
xchgax,bx
moval,tab[bx]
movasc,al
movah,4ch
int21h
codeends
endstart