汇编实验报告.docx
《汇编实验报告.docx》由会员分享,可在线阅读,更多相关《汇编实验报告.docx(31页珍藏版)》请在冰豆网上搜索。
汇编实验报告
实验一汇编语言运行环境及方法、简单程序设计
一、程序说明
本程序用来比较两个字符串string1和string2所含的字符是否相同。
若相同则显示‘Match’,否则显示‘Nomatch’。
二、调试说明
1.在DOS提示符下,进入MASM目录。
2.在MASM目录下启动EDIT编辑程序,输入源程序。
3.用汇编程序MASM对源文件汇编产生目标文件OBJ。
4.用连接程序产生执行文件EXE。
5.用Debug进行调试。
用-g命令来用运行程序,用-u命令来显示程序,用-d命令来查看数据段的情况,用-e或-f命令来修改需要改正的部分,用-t指令来逐步执行程序,用-r指令来查看寄存器和修改寄存器的值,-q命令用来退出debug程序。
在这些命令的后面加上地址,可以将命令执行到相应的地方。
在debug中用-g来运行程序:
用-u来显示程序:
-g将端点设置在程序的主要部分以前:
-d根据其中指示的ds寄存器内容查看数据段情况:
-e命令修改数据区的字符串:
-q命令退出:
3、源程序
DSEGSEGMENT
STRING1DB'movethecursorbackword'
STRING2DB'movethecursorbackword'
MESS1DB'MATCH!
',0DH,0AH,'$'
MESS2DB'NOMatch!
',13,10,'$'
DSEGENDS
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:
CSEG,DS:
DSEG,ES:
DSEG
START:
PUSHDS
SUBAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX
MOVES,AX
LEASI,STRING1
LEADI,STRING2
CLD
MOVCX,24
REPZCMPSB
JZMATCH
LEADX,MESS2
JMPSHORTDISP
MATCH:
LEADX,MESS1
DISP:
MOVAH,9
INT21H
RET
MAINENDP
CSEGENDS
ENDSTART
实验二用DEBUG编程:
使用堆栈段将AX和BX的内容进行交换等
一、程序说明
1、设堆栈指针SP=2000H,AX=3000H,BX=5000H;请编一程序段将AX和BX的内容进行交换。
请用堆栈作为两寄存器交换内容的中间存储单元,用DEBUG调试程序进行汇编与调试。
2、设DS=当前段地址,BX=0300H,SI=0002H;请用DEBUG的命令将存储器偏移地址300H~304H连续单元顺序装入0AH,0BH,0CH,0DH,0EH。
在DEBUG状态下送入下面程序,并用单步执行的方法,分析每条指令源地址的形成过程,当数据传送完毕时,AX中的内容是什么。
程序清单如下:
MOVAX,BX
MOVAX,0304H
MOVAX,[0304H]
MOVAX,[BX]
MOVAX,0001[BX]
MOVAX,[BX][SI]
MOVAX,0001[BX][SI]
HLT
二、调试说明
第一部分先将程序编好后,在DOS环境下用masm程序生成obj文件,再用link程序生成exe文件,然后进入debug进行调试,-t单步执行,查看AX和BX中内容的变化。
如果发现AX和BX中的内容进行了交换,则说明程序运行成功。
第二部分先将基本的程序结构编好,
进入debug程序,用-u指令查看一下程序:
再用-a指令从145C:
000B后面输入已给出的程序,然后用-u0指令查看程序:
这时可以先用-t指令将程序逐步执行到指令movax,bx之前,然后用-e300指令安要求修改相关的内存内容,再用-d300指令查看一下修改后的内存内容,结果如下:
然后再用-t指令逐步执行程序,观察每步指令执行后,ax中的内容,结果如下:
可以看出,在执行完指令MOVAX,[0304H]后,ax中的内容为AX=610E,在执行完指令MOVAX,[BX]后,ax中的内容为AX=0B0A,在执行完指令MOVAX,0001[BX]后,ax中的内容为AX=0C0B,在执行完指令MOVAX,[BX][SI]后,ax中的内容为AX=0D0C,在执行完指令MOVAX,0001[BX][SI]后,ax中的内容为AX=0E0D。
做完所有操作后,程序最终执行结果:
最后AX的内容是0E0DH。
三、源程序
第一部分:
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
第二部分:
DATASSEGMENT
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
MOVBX,0300H
MOVSI,0002H
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
实验三存储器块清零和内存块移动
1、程序说明
第一个程序是存储块清零。
首先设置起始地址,然后设置块长度,然后将当前地址内容清零,地址加1,然后查看是否清除完全,若没有则回到当前地址清零,然后再查看,直到地址内容清除完,结束程序。
第二个程序是内存块移动。
首先设置块的源地址,然后设置筷的目的地址,然后再设置移动长度,最后按长度重复传送数据直到结束。
2、调试说明
第一个程序先将程序编好后,在DOS环境下用masm程序生成obj文件,再用link程序生成exe文件,然后进入debug进行调试。
在进入debug后,先用-u指令查看一下程序:
根据ds寄存器内容,用-d指令查看数据段的情况:
用-g执行程序,再用-d指令查看数据段内容是否清零:
第二个程序先将程序编好后,在DOS环境下用masm程序生成obj文件,再用link程序生成exe文件,然后进入debug进行调试。
进入debug后先用-u查看程序:
–d查看内存的内容:
然后-g运行到指令repmovsb之前再用,–d查看内存的内容:
3、源程序
1、存储器快清零
DATASEGMENT
BLOCKDB256DUP(55H)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
STARTPROCNEAR
MOVAX,DATA
MOVDS,AX
MOVBX,OFFSETBLOCK
MOVCX,256
AGAIN:
MOV[BX],BYTEPTR0
INCBX
LOOPAGAIN
JMP$
CODEENDS
ENDSTART
2、内存块移动
datasegment
sourcedb256dup(055h)
targetdb256dup(0aah)
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
moves,ax
movsi,offsetsource
movdi,offsettarget
movcx,256
repmovsb
jmp$
codeends
endstart
实验四将键盘输入的小写字母用大写字母显示出来
一、程序说明
本程序用来将小写字母转变为大写,并在屏幕上显示出来。
先利用DOS功能调用INT21H的1号功能从键盘输入字符,然后判断输入的是否是小写字母,若不是小写字母,则显示输入出错,重新输入。
若输入的是小写字母,则通过将其减去20h,从而变为大写字母。
在通过DOS功能调用INT21H的2号功能显示出来。
若输入的是Enter键,则结束程序。
二、调试说明
将程序编好后,在DOS环境下用masm程序生成obj文件,再用link程序生成exe文件,最后运行程序:
3、源程序
DATASSEGMENT
string1db'inputerror!
',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
实验五循环程序实验
1、程序说明
编写一个程序,显示AL寄存器中的两位十六进位制数,通过DOS功能调用int21h的2号功能显示出来。
2、调试说明
先将程序编好后,在DOS环境下用masm程序生成obj文件,再用link程序生成exe文件,然后进入debug进行调试。
3、源程序
codesegment
assumecs:
code
start:
moval,3Eh
pushax
movdl,al
movcl,4
shrdl,cl
cmpdl,9
jbenext1
adddl,7
next1:
adddl,30h
movah,2
int21h
popax
movdl,al
anddl,0Fh
cmpdl,9
jbenext2
adddl,7
next2:
adddl,30H
movah,2
int21H
movah,4CH
int21H
codeends
endstart
实验六分支程序实验
1、程序说明
判别键盘上输入的字符:
若是0-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符,则结束程序,若为其他字符则不显示,继续等待新的字符输入。
首先输入一个字符,将其和回车字符比较,若是回车字符,则结束程序。
若是0-9字符,则显示之。
若是小于0,则重新等待输入。
若大于9,则再和A,Z比较,若小于’A’,则重新等待输入,若大于’Z’,则再和a,z比较,若小于a或大于z,则重新等待输入,否则输出‘c’。
2、调试说明
先将程序编好后,在DOS环境下用masm程序生成obj文件,再用link程序生成exe文件,然后运行程序。
3、源程序
codesegment
assumecs:
code
start:
movah,1
int21h
cmpal,0DH
jzdone
cmpal,'0'
jbnext
cmpal,'9'
jacharup
movdl,al
movah,2
int21H
jmpstart
charup:
cmpal,41H
jbnext
cmpal,5AH
jachrdn
dispc:
movdl,'c'
movah,2
int21H
next:
jmpstart
chrdn:
cmpal,61h
jbnext
cmpal,7AH
janext
jmpdispc
done:
movah,4ch
int21h
codeends
endstart
实验七统计不同成绩段学生的人数
1、程序说明
设有十个学生成绩分别是76,69,84,90,73,88,99,63,100和80分。
试编制一个子程序,统计低于60分,60~69分,70~79分,80~89分,90~99分和100分的人数,并输出显示统计结果。
2、调试说明
3、源程序
datasegment
gradedb76,69,84,90,73,88,99,63,100,80
string1db'<60num:
','$'
string2db0ah,'60~70num:
','$'
string3db0ah,'70~80num:
','$'
string4db0ah,'80~90num:
','$'
string5db0ah,'90~100num:
','$'
string6db0ah,'100num:
','$'
countdb10
dataends
codesegment
assumecs:
code,ds:
data,ss:
stack
mainprocfar
start:
movax,data
movds,ax
xorax,ax
xorbx,bx
xorcx,cx
xordh,dh
calldivide
calloutput
movah,4ch
int21h
mainendp
divideprocnear
movdi,0
compare:
cmpgrade[di],60
jbcase1
cmpgrade[di],70
jbcase2
cmpgrade[di],80
jbcase3
cmpgrade[di],90
jbcase4
cmpgrade[di],100
jbcase5
inccl
jmpcontinue
case1:
incah
jmpcontinue
case2:
incal
jmpcontinue
case3:
incbh
jmpcontinue
case4:
incbl
jmpcontinue
case5:
incch
jmpcontinue
continue:
incdi
deccount
jnzcompare
ret
divideendp
outputprocnear
pushcx
pushbx
pushax
leadx,string1
movah,09h
int21h
popbx
movdl,bh
adddl,30h
movah,02h
int21h
leadx,string2
movah,09h
int21h
movdl,bl
adddl,30h
movah,02h
int21h
leadx,string3
movah,09h
int21h
popbx
movdl,bh
adddl,30h
movah,02h
int21h
leadx,string4
movah,09h
int21h
movdl,bl
adddl,30h
movah,02h
int21h
leadx,string5
movah,09h
int21h
popbx
movdl,bh
adddl,30h
movah,02h
int21h
leadx,string6
movah,09h
int21h
movdl,bl
adddl,30h
movah,02h
int21h
movah,4ch
int21h
outputendp
codeends
endstart