汇编实验报告资料.docx
- 文档编号:14802102
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:42
- 大小:1.61MB
汇编实验报告资料.docx
《汇编实验报告资料.docx》由会员分享,可在线阅读,更多相关《汇编实验报告资料.docx(42页珍藏版)》请在冰点文库上搜索。
汇编实验报告资料
汇编语言
实验报告
学号:
专业:
姓名:
实验一汇编运行环境及方法、简单程序设计
一、程序说明
本程序用来比较两个字符串string1和string2所含的字符是否相同。
若相同则显示‘Match’,否则显示‘Nomatch’。
在程序的数据段先定义两个字符串string1和string2,再定义两个字符串mess1和mess2,分别代表‘Match’和‘Nomatch’。
再代码段比较字符串string1和string2,通过比较判断是否相同。
若相同则显示‘Match’,否则显示‘Nomatch’
2、试验程序流程图。
三、调试说明
再EDIT中建立ASM文件,再用汇编程序对源程序汇编产生目标文件Obj,
再用连接程序产生执行文件EXE。
再用Debug进行调试。
其中常用到的指令有:
用-g命令来用运行程序,用-u命令来显示程序,用-d命令来查看数据段的情况,用-e或-f命令来修改需要改正的部分,用-t指令来逐步执行程序,用-r指令来查看寄存器和修改寄存器的值,-q命令用来退出debug程序。
如用-u指令运行程序后,再用-g指令显示程序的执行结果如下:
实验一的原汇编程序如下:
datareasegment
string1db'Movethecursorbackward.'
string2db'MovethecursorBackward.'
mess1db'Math.',13,10,'$';回车换行
mess2db'NoMath!
',13,10,'$'
datareaends
prognamsegment
mainprocfar
assumecs:
prognam,ds:
datarea,es:
datarea
start:
pushds
subax,ax
pushax
movax,datarea
movds,ax
moves,ax
leasi,string1
leadi,string2
cld
movcx,25;循环次数
repzcmpsb;串比较[ES:
DI]-[DS:
SI]
jzMatch
leadx,mess2
jmpshortdisp
Match:
leadx,mess1
disp:
movah,09
int21h
ret
mainendp
prognamends
endstart
实验二用DEBUG编程:
使用堆栈段将
AX和BX的内容进行交换等
一、实验目的:
1、熟练掌握DEBUG的常用命令,学会用DEBUG调试程序。
2、掌握数据在内存中的存放方式和内存操作数的几种寻址方式。
3、掌握简单指令的执行过程。
二、实验内容:
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
三、实验要求:
1、实验前要做好充分准备,包括汇编程序清单、调试步骤、调试方法,以及对程序结果的分析等。
2、本实验只要求在DEBUG调试程序状态下进行,包括汇编程序、调试程序和执行程序。
四、实验报告:
1、内容1的程序
2、整理用到的debug命令的用法
内容1的程序为:
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下
-r修改寄存器的初始值
-a输入操作指令
-t单步执行指令
-d加地址查看数据
结果显示ax和bx的值已交换
内容2:
初始化bx,si,并将存储器偏移地址300H~304H连续单元顺序装入0AH,0BH,0CH,0DH,0EH
所以最终ax=0E0D.
实验三:
存储器块清零和内存块移动
要求:
1、使用串处理指令写出完成实验任务1、2的完整程序(注意:
要求从高地址开始,用地址减一的方式操作;不要使用过程写法;任务完成后要能返回操作系统)
2、调试中遇到的问题及解决方法
一、程序说明
第一个程序用来存储块清零,先设置块起始地址,然后设置块长度,再将当前地址内容清零,地址加一,然后判断是否清完,若清完则结束,否则返回到上一步。
第二个程序用来移动内存块,先设置块的源地址,再设置块的目标地址,然后设置移动长度,安长度重复传送数据直到结束。
第一部分程序块的清零的源程序:
datasegment
blockdb256dup(55h)
dataends
codesegment
assumecs:
code,ds:
data,es:
data
start:
movax,data
movds,ax
moves,ax
std
movdi,offsetblock
adddi,255
moval,0h
repstosb
movah,4ch
int21h
codeends
endstart
开始前,存储块都为55H:
存储块从高位清零后:
第二部分内存块转移的源程序:
datasegment
sourcedb256dup(55h)
targetdb256dup(0aah)
dataends
codesegment
assumecs:
code,ds:
data,es:
data
start:
movax,data
movds,ax
moves,ax
movsi,offsetsource
movdi,offsettarget
movcx,256
repmovsb;[ES:
DI]<-----[DS:
SI]
movah,4ch
int21h
codeends
endstart
内存块转移前数据:
转移后数据:
实验四将键盘输入的小写字母用大写字母显示出来
一、实验目的:
1、掌握接受键盘数据的方法,并了解将键盘数据显示时,须转为ASCII码的原理。
2、掌握DOS功能调用的编程方法。
二、实验内容:
试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。
三、编程提示:
利用DOS功能调用INT21H的1号功能从键盘输入字符和2号功能在显示器上显示一个字符。
四、实验要求:
实验前要做好充分准备,包括汇编程序清单、调试步骤、调试方法,以及对程序结果的分析等。
五、实验报告:
1、写出源程序清单。
2、调试中遇到的问题及解决方法
源程序清单:
datasegment
string1db100,?
100dup('');最大长度为100,实际长不确定,初始值为空格
CRdb0Dh,0Ah,'$';换行
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movdi,offsetstring1
movah,0ah;输入字符串(ds:
dx)
movdx,di
int21h
xorcx,cx
movcl,[di+1];字符串长度
movbx,cx;保存长度
leasi,[di+2];字符串首地址
next:
cmpbyteptr[si],'a'
jbskip
cmpbyteptr[si],'z'
jaskip
xorbyteptr[si],20h;异或改变大小写
skip:
incsi
loopnext
movdx,offsetCR
movah,09
int21h;输出回车换行符
movstring1[bx+2],'$';在字符串结尾加上’$’用于9号功能输出
leadx,[di+2];输出字符串
movah,09
int21h
movah,4ch
int21h
codeends
endstart
结果输出:
附加实验:
练习题
3.编写程序,将DATA_NUM起的一个压缩BCD码转换成十六进制数,并存放在DATA_NUM下面的相邻字节中。
DATASEGMENT
DATA_NUMDB59h
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVBX,OFFSETDATA_NUM
XORAX,AX
MOVAL,[BX];将原数保存到AL中
MOVCL,10H
MOVCH,0AH
DIVCL;除16,商为AL,余数为AH
MOVDL,AH
XORAH,AH;将AH保存到DL,并清零AH
MULCH
ADDAL,DL;将AL乘10,再加上个位
MOV[DATA_NUM+1],AL
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
结果如下图:
4.试着编写一程序,用查表法将一位十六进制数转换成与之对应的ASCII码,程序的数据段如下:
DATASEGMENT
TABDB30H,31H,32H,33H,34H,35H,36H,37H
DB38H,39H,41H,42H,43H,44H,45H,46H
HEXDB6;0BH
ASCDB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVBX,OFFSETTAB
XORAH,AH
MOVAL,HEX;DECAL
ADDBX,AX
MOVAL,[BX];查表得到结果保存到AL
MOVASC,AL
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
结果如下图:
查找到6的ASCII码为36,保存到AX以及ASC中。
5.试编程求解表达式S=(2300-(X*Y+Z))/Z,其中X=600,Y=25,Z=-2000.
datasegment
Xdw600
Ydw25
Zdw-2000
Sdw?
;S=(2300-(X*Y+Z))/Z
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax;初始化ds
movax,X
mulY;ax<-X*Y
addax,Z;ax<-X*Y+Z
movbx,23000d
subbx,ax;bx<-23000-(X*Y+Z)
movax,bx
idivZ;ax=(23000-(X*Y+Z))/Z
movS,ax
movah,4ch
int21h
codeends
endstart
结果如下图:
最终结果ax=-5(FFFB),保存到S中
实验五循环程序实验
1.实验目的
1.掌握循环程序的设计方法。
2.进一步熟悉利用debug程序修改参数的方法,并检查和验证结果的正确性。
3.学会针对不同的问题,选用不同的组织循环的方法。
二.实验内容
1.编写一个程序,显示AL寄存器中的两位十六进制数。
2.编写一个程序,判断键盘上输入的字符;若是1-9的字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符
三.实验准备
1.编写实验内容要求的两个程序。
2.写出调试以上程序,即修改程序的参数,检查结果的操作方法。
3.熟悉源程序汇编、连接命令的使用方法。
1.源程序代码:
codesegment
assumecs:
code
start:
moval,3BH
movcx,2;循环右移两次
look:
pushcx
movcl,4
roral,cl
pushax;保护ax
movdl,al
anddl,0fh
cmpdl,09
jbenext1
adddl,07
next1:
adddl,30h
movah,2
int21h;显示dl中的ascii字符,同时al<--dl
popax
popcx
looplook
movah,4ch
int21h
codeends
endstart
程序运行结果如下:
修改寄存器的值:
2.源程序代码:
datasegment
CRdb0Dh,0Ah,'$';换行
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movah,1
int21h;输入送AL
cmpal,0DH
jzdone;回车
cmpal,'0'
jbnext
cmpal,'9'
jacharup
pushax;执行call后会改变al值,故要提前保护
callCRCR
popax
xordx,dx
movdl,al
movah,02
int21h
callCRCR
jmpstart;正常输出重新输入
charup:
cmpal,'A'
jbnext
cmpal,'Z'
jachardn
dispc:
;输出‘c’
callCRCR
movdl,'c'
movah,2
int21h
callCRCR
next:
;其他字符重新输入
jmpstart
chardn:
cmpal,'a'
jbnext
cmpal,'z'
janext
jmpdispc
done:
movah,4ch
int21h
CRCRproc
movdx,offsetCR
movah,09
int21h;输出回车换行符
ret
CRCRendp
codeends
endstart
程序运行结果如下:
实验六统计不同成绩段学生的人数
一、实验目的:
1、掌握分支、循环、子程序调用、DOS功能调用等基本的程序结构。
2、掌握综合程序的编制及调试方法。
二、实验内容:
设有十个学生成绩分别是76,69,84,90,73,88,99,63,100和80分。
试编制一个子程序,统计低于60分,60~69分,70~79分,80~89分,90~99分和100分的人数,并输出显示统计结果。
三、编程提示:
1、成绩分等部分采用分支结构,统计所有成绩则用循环结构完成,显示统计结果采用DOS功能调用。
2、统计学生成绩和显示统计结果两部分内容用子程序结构来完成。
四、实验报告:
1、画出程序框图。
2、写出源程序清单。
3、调试中遇到的问题及解决方法。
程序源代码如下:
;disp.asm输出子程序,参数为al,以十六进制输出
publicdisp
codesegment;入口参数为al,输出al中的数
assumecs:
code
dispprocfar
movcx,2
look:
pushcx
movcl,4
roral,cl
pushax
movdl,al
anddl,0fh
cmpdl,09
jbenext1
adddl,07
next1:
adddl,30h
movah,2
int21h;显示dl中的ascii字符,同时al<--dl
popax
popcx
looplook
ret
dispendp
codeends
end
;主程序,numbers.asm
extrndisp:
far
datasegment
bufdb76,69,84,90,73,88,99,63,100,80
numdb0,0,0,0,0,0;低于60分,60~69分,70~79分,80~89分,90~99分和100分的人数
string1db0ah,0dh,'<60num:
','$'
string2db0ah,0dh,'60<=<70num:
','$'
string3db0ah,0dh,'70<=<80num:
','$'
string4db0ah,0dh,'80<=<90num:
','$'
string5db0ah,0dh,'90<=<100num:
','$'
string6db0ah,0dh,'100num:
','$'
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movcx,num-buf
leabx,buf
again:
lab0:
cmpbyteptr[bx],100
jblab1
incnum+5
jmplab6
lab1:
cmpbyteptr[bx],90
jblab2
incnum+4
jmplab6
lab2:
cmpbyteptr[bx],80
jblab3
incnum+3
jmplab6
lab3:
cmpbyteptr[bx],70
jblab4
incnum+2
jmplab6
lab4:
cmpbyteptr[bx],60
jblab5
incnum+1
jmplab6
lab5:
incnum
lab6:
incbx
loopagain
leadx,string1
movah,09h
int21h
moval,num
calldisp
leadx,string2
movah,09h
int21h
moval,num+1
calldisp
leadx,string3
movah,09h
int21h
moval,num+2
calldisp
leadx,string4
movah,09h
int21h
moval,num+3
calldisp
leadx,string5
movah,09h
int21h
moval,num+4
calldisp
leadx,string6
movah,09h
int21h
moval,num+5
calldisp
movah,4ch
int21h
codeends
endstart
masm汇编中:
把子程序中要被其它程序调用的过程,变量等声明为public,把子程序编译成obj文件.
在调用子程序的程序中,用extrn子程序名:
类型的方式声明要调用的子程序.然后在程序中直接调用单独文件中的子程序就行了.
连接的时候,把调用程序和子程序的obj文件一起编译.
补充实验:
1.试编制一程序,要求从键盘上接收一个4位的16进制数,并在屏幕上显示与它等值的二进制数。
源程序代码如下:
datasegment
CRdb0ah,0dh,'$'
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
xorbx,bx
movch,4
lab1:
;循环输入四次,字符放在AL中
movah,1
int21h
cmpal,'0'
jblab1
cmpah,'9'
jbelab3;小于等于9,直接取出
cmpal,'A'
jblab1
cmpal,'F'
jbelab22
cmpal,'a'
jblab1
cmpal,'f'
jalab1
lab2:
subal,20h
lab22:
subal,37h;转换为10--15
jmplab4
lab3:
;取al低四位,正好为一位十六进制数
andal,0fh
lab4:
movcl,4
shlbx,cl
addbl,al;将低四位移到高位,加上低四位
decch
jnzlab1;循环输入
leadx,CR;换行
movah,9
int21h
movcx,16
lab5:
xordl,dl
rolbx,1;循环左移,将高位放入cf
rcldl,1;带进位循环左移,取cf到dl中
adddl,30h;转换为0或1的ASCII码
movah,2
int21h
looplab5
movah,4ch
int21h
codeends
endstart
程序运行结果如下:
2.从键盘上输入一系列字符串(以回车符结束),按字母、数字和其他字符分类计数,最后显示这三类的计数结果。
源程序代码如下:
(只
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 实验 报告 资料