汇编语言实验报告.docx
- 文档编号:7775938
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:40
- 大小:1,010.03KB
汇编语言实验报告.docx
《汇编语言实验报告.docx》由会员分享,可在线阅读,更多相关《汇编语言实验报告.docx(40页珍藏版)》请在冰豆网上搜索。
汇编语言实验报告
汇编语言实验报告
一、实验目的
(1)熟悉汇编程序的汇编、连接、执行过程;
(2)生成LST文件,查看LST文件;
(3)生成OBJ文件,修改语法错误;
(4)生成EXE文件;
(5)执行程序。
二、实验涉及知识
汇编程序从编写到执行的过程
编程?
.ASM?
编译?
.OBJ?
连接?
.EXE?
加载?
内存中的程序?
执行
1)编写源程序
用EDIT或记事本输入各段,并存储成源程序(保存在MASM目录下),扩展名为ASM。
2)对源程序进行汇编、连接
操作如下:
(1)在DOS状态下,进入MASM目录;
(2)输入命令:
MASM文件名(连同扩展名);
(3)在系统出现的提示中输入:
objectfilename[.obj]:
按回车键。
Sourcelistling[nul.lst]:
输入:
文件主名,生成lst文件,也可以不生成,直接按回车键。
Lst文件用于查看编译为目标文件的过程中产生的中间结果。
Cross-reference[nul.crf]:
按回车键。
(4)如果系统没有提示出错,那么编译过程就完成了。
如果提示错误则应
用edit打开源文件进行修改,然后再重复2和3步骤。
(5)输入:
link文件主名(不要输扩展名,也可以输入扩展名.obj)
runfile[.exe]:
按回车键。
Listfile[nul.map]:
按回车键。
Libraries[.lib]:
按回车键。
(6)没有提示错误,汇编过程就结束了,产生了exe可执行文件。
如果出
现‘nostracksegment’的错误警告,不用理会。
3)执行程序(由DOS中的COMMAND命令将文件加载入内存)
在DOS提示符下直接输入文件主名就可以执行文件了。
程序执行后,有的
会显示结果,有的可能执行后什么结果都没有,是因为程序中没有显示命令。
三、实验内容
1)将下面的数据段输入,取名1.ASM,保存在MASM文件夹下。
生成LST
文件,(不必连接、运行)用EDIT查看1.LST文件。
试回答:
DA1,DA2的偏
移量分别是多少?
COUNT的值为多少?
DATASEGMENT
ORG20H
NUM1=8
NUM2=NUM1+10H
DA1DB‘IBMPC’
DB0AH,0DH
COUNTEQU$-DA1
DATAENDS
END
2)输入下面错误的文件,修改错误语句。
(MASM没有出现错误即可。
不
必连接、运行。
)
DATASEGMENT
VAR1DB0,25,ODH,300
VAR2DB12H,A4H,6BH
VAR3DB’ABCDEF’
VAR4DW1234H,5678H
VAR5DW10HDUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DE:
DATA
BEINGMOVAX,DATA
MOVDS,AX
LEASI,VAR5
MOVBX,OFFSETVAR2
MOV[SI],0ABH
MOVAX,VAR1+2
MOV[BX],[SI]
MOVVAR5+4,VAR4
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
3)输入下面程序并运行
STACKSSEGMENTSTACK
DW128DUP(?
)
STACKSENDS
DATASSEGMENT
STRINGDB‘WELCOME!
’,13,10,‘$’
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
LEADX,STRING
MOVAH,9
INT21H
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
四、实验步骤及运行结果1)事先先将数据段输入在一个“1-1.ASM”的文本文档中,并保存在D盘MASM
文件夹下。
打开命令提示符,输入:
按下回车键,在跳出的界面上输入列表文件的名字:
输入:
EDIT1-1.lst查看DA1,DA2,COUNT的值:
可以看出DA1的值为0020,无DA2的值,COUNT的值0008。
2)运行错误代码,结果如下:
修改后,正确代码如下:
DATASEGMENT
VAR1DB0,25,0DH,255
VAR2DB12H,04H,6BH
VAR3DB'ABCDEF'
VAR4DW1234H,5678H
VAR5DW10HDUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEASI,VAR5
MOVBX,OFFSETVAR2
MOVAX,0ABH
MOV[SI],AX
MOVAL,VAR1+2
MOVAX,[SI]
MOV[BX],AX
MOVAX,VAR4
MOVVAR5+4,AX
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
结果如下:
3)输入程序并运行,编译结果无误。
输出结果如下:
五、实验总结
经过本次实验,我了解了命令提示符的一些命令,熟悉了汇编程序的汇编、
连接、执行过程,了解怎么生成LST文件、查看LST文件,以及如何生成可执
行文件,并懂得了怎样修改程序中的一些语法错误。
通过实践,使我更加了解了
课本知识,收获很大。
DEBUG
一、实验目的
(1)学习使用DEBUG的命令;
(2)使用DEBUG命令在数据段中查看程序运行的结果;
(3)利用DEBUG运行简单的程序段。
二、实验内容
1)输入程序观察寄存器变化
使用DEBUG命令,将下面的程序段写入内存,逐条执行,观察每条指令执
行后,CPU中相关寄存器的内容变化。
注意用T命令执行时,CS:
IP寄存器的
内容。
MOVAX,4E20
ADDAX,1416
MOVBX,2000
ADDAX,BX
MOVBX,AX
ADDAX,BX
MOVAX,001A
MOVBX,0026
ADDAL,BL
ADDAH,BL
ADDBH,AL
MOVAH,0
ADDAL,BL
ADDAL,9C
2)输入下面的程序,这是一个两个数相与的程序。
结果存放在MSG2单元中,
偏移地址为?
值为多少?
DSEGSEGMENT
MSG1DW7856H,2038H
MSG2DW?
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVAX,MSG1
ANDAX,MSG1+2
MOVMSG2,AX
MOVAL,0
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
程序的跟踪执行操作
在DOS下直接输入文件主名就可以执行文件了,有的程序会显示结果,可
能执行后什么结果都没有,是因为程序中没有显示命令。
那么如何查看程序的运
行结果呢?
程序执行过程的跟踪操作步骤如下:
(1)在DOS下输入:
DEBUG文件名.EXE
(2)在DEBUG提示符下输入U命令
如果程序中有数据段,可以看到反汇编后第一句可执行语句为:
A地址:
B地址MOVAX,K地址如:
1261:
0000MOV
AX,1260
其中:
K地址就是数据段的段寄存器内容,A地址为代码段段寄存器地址,B地址为程序第一条指令的偏移地址。
(3)可以用T命令单步执行指令,执行到MOVAH,4CH时结束,也可以用G命令执行整个程序,输入:
G=B地址(如:
G=0000)
(4)用D命令查看程序执行后数据段的变化
输入:
DK地址:
0(如:
D1260:
0)
在显示的数据中,对照源程序或LST文件查看结果所在的偏移地址的内容。
三、实验步骤及运行结果
(1)事先先将数据段输入在一个“2-1.txt”的文本文档中,并保存在D盘
MASM文件夹下。
打开命令提示符,输入:
执行后,输入第一小题的代码,结果如下:
单步执行t,查看实验结果:
从实验结果中可以看出,CS和IP寄存器的内容。
CS的内容一直不变,而IP的内容一直前一步多2。
(2)将第2小题的代码输入到2-2.txt文档中,将文档置于D盘中的MASM文件中。
之后运行该文档。
实验过程如下:
创建exe文件,执行结果如下:
执行后,生成2-2.exe文件。
再用debug2-2.exe查看每步执行后,寄存器中的内
容:
用T命令单步执行指令,执行到MOVAH,4CH时结束,结果如下:
用D命令查看程序执行后数据段的变化:
MSG2的偏移地址为0002,值为2038。
四、总结
通过这次实验,我懂得了如何使用Debug的命令,并在数据段中查看程序的运行结果,学会了用Debug命令运行简单的程序段,对Debug命令也有了进一步的了解,收获很大。
一、实验目的
(1)熟练使用DEBUG命令。
(2)学习使用简单的汇编指令编写程序。
(3)了解循环语句的执行过程。
二、实验内容
1)下列程序单步运行,注意AL,BX,CX寄存器的变化,并观察数据段字母的变化。
如果是将小写字母改成大写字母带注释的语句该如何修改?
DSEGSEGMENT
MSG1DB‘abc’
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
LEABX,MSG1
MOVCX,3
S:
MOVAL,[BX]
ANDAL,11011111B;将AL中的ASCII码的第5位置0,
;变成大写字母。
MOV[BX],AL
INCBX
LOOPS
MOVAL,0
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
2)编写调试下面的程序,用DEBUG查看数据段中的结果:
Z=((W-X)*10+5)/(X+Y),X,Y,W为字节类型变量,结果存于Z单元,
写出数据段和代码段。
3)编写程序。
X,Y为字节类型数,求Z=((W-X)*8-(X+Y)*2)/16,写出
完整的数据段和代码段,不用乘除指令。
三、实验步骤及运行结果
(1)将第1小题的代码输入到3-1.txt文档中,将文档置于D盘中的MASM文件中。
之后运行该文档,用Debug命令,单步运行。
实验过程如下:
进行编译:
执行debug命令:
实验开始的状态如下:
执行进行单步运行,结果如下:
运行结束,结果如下:
(2)将第2小题的代码输入到3-2.txt文档中,将文档置于D盘中的MASM文
件夹中。
之后运行该文档,用debug命令,单步运行。
实验开始的状态如下:
执行进行单步运行,结果如下:
运行结束,结果如下:
(3)将第3小题的代码输入到3-3.txt文档中,将文档置于D盘中的MASM文
件夹中。
之后运行该文档,用debug命令,单步运行。
实验开始的状态如下:
执行进行单步运行,结果如下:
运行结束,结果如下:
四、总结
通过上次的实验,已经能够熟练使用DEBUG命令。
同时也学会使用简单的
汇编指令编写程序,也了解了循环语句的执行过程。
对课本知识进一步理解,收
获很大。
五、附录
第二题代码:
DSegSegment
xdb38h
ydb20h
wdb30h
zdw?
tendb10
DSegends
CSegSegmentparapublic'CODE'
Assumecs:
CSeg,ds:
DSegStart:
movax,DSeg
movds,ax
movbl,x
addbl,y
moval,w
subal,x
imulten
addax,5
idivbl
movz,ax
moval,0
movah,4ch
int21h
CSegends
endStart
第三题代码:
DSegSegment
xdb38h
ydb20h
zdb?
DSegends
CSegSegment
Assumecs:
CSeg,ds:
DSegStart:
movax,DSeg
movds,ax
moval,x
addal,y
cbw
movcl,3
salax,cl;(x+y)*8
Movbx,ax
moval,x
subal,y
cbw
Salax,1;(x-y)*2
subbx,ax
movcl,4
sarax,cl;((x+y)*8-(x-y)*2)/16
movz,al
moval,0
movah,4ch
int21h
CSegends
endStart
一、实验目的
(1)学习调试程序,查找逻辑错误;
(2)学习分支语句的编程和调试;
(3)学习循环语句的编程和调试。
二、实验内容
1)有10个数,统计正数的个数,存放在变量M中中。
经过汇编后,形成
EXE文件。
在DEBUG中,先用G=0命令执行程序,用D命令查看M单元的
内容,会发现结果不正确。
用单步执行命令T=0,单步执行程序,查找程序中
的逻辑错误,注意每一次循环中AL寄存器中值的变化是否正确?
(AL寄存器中
存放正数的个数)
DSEGSEGMENT
MSGDB4,-2,-6,0,5,67,8,-3,5,6
MDB?
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVCX,10
MOVAL,0
LEASI,MSG
L1:
MOVBL,[SI]
CMPBL,0
JBENEXT
INCAL
NEXT:
INCSI
LOOPL1
MOVM,AL
MOVAL,0
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
2)数据段中是一组无符号数,将最小数存放在M单元中。
按上题方法查找
一处逻辑错误。
DSEGSEGMENT
MSGDB13,15,7,25,24
MDB?
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVCX,4
MOVAL,MSG
MOVSI,OFFSETMSG+1
L1:
CMPAL,[SI]
JBNEXT
MOVAL,[SI]
NEXT:
LOOPL1
MOVM,AL
MOVAL,0
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
3)编程:
在首地址为BUF开始的内存单元中存有10个字节数,求其中0
的个数,并将结果存于RESULT中。
4)编程:
Y=?
Ai*Bi,Ai,Bi为字节型无符号数,分别存于NUM1和NUM2
开始的连续存储单元中,结果存于REST单元中。
三、实验步骤及运行结果
1)运行程序,发现结果错误:
发现结果错误,单步执行,查找错误:
在执行“JBENEXT”命令时,到-2时,为有符号数,但是JBE为无符号数的比较,所以出现了结果错误,应把“JBE”改为“JLE”。
2)进行编译链接、运行程序,结果如下:
发现结果不正确。
单步执行,查找错误,结果如下:
发现一直都是0D和0F两个数在比较,直至退出循环。
指针没有往下跳转,所
以得出错误答案。
在NEXT语句开始部分加上incSI语句,再执行LOOPL1
语句。
(3)程序编写如下:
DSEGSEGMENT
MSGDB0,-2,-6,0,5,0,8,-3,0,6
RESULTDB?
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVCX,10
MOVAL,0
LEASI,MSG
L1:
MOVBL,[SI]
CMPBL,0
JLENEXT
INCAL
NEXT:
INCSI
LOOPL1
MOVRESULT,AL
MOVAL,0
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
运行该程序,结果如下:
4)程序编写如下:
DSegSegment
num1db12,34,56,78,65,02,39,8num2db98,65,32,74,78,12,03,56resultdw?
DSegends
CSegSegmentparapublic'CODE'Assumecs:
CSeg,ds:
DSeg
Start:
movax,DSeg
movds,ax
movcx,8
movbx,0
movsi,offsetnum1
movdi,offsetnum2again:
moval,[si]
mulbyteptr[di]
addbx,ax
incdi
incsi
loopagain
movresult,bx
moval,0
movah,4ch
int21h
CSegends
endStart
编译无误:
运行该程序,结果如下:
四、总结
通过这次实验,我学会了调试程序,查找逻辑错误;学习使用分支语句的编
程和调试以及循环语句的编程和调试。
通过实践,对知识进行了巩固,加深了理
解,收获很大。
DOS
一、实验目的
(1)学会DOS中关于显示功能调用指令的用法;
(2)领会修改显存方法显示字符。
二、实验内容
1)输入一个字符,显示出来。
2)输入一个字符串,显示出来。
3)BUF开始的3个16位二进制数用十六进制数的形式显示出来。
(1)理解程序
(2)输入程序,汇编,运行(在DOS状态下输入:
文件名.EXE),观察结
果。
(3)如果要分行显示,程序要如何修改?
DATASEGMENT
BUFDW4F59H,56A8H,0FF90H
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVSI,0
P:
MOVBX,BUF[SI]
MOVCH,4
L:
MOVCL,4
ROLBX,CL
MOVDL,BL
ANDDL,0FH
CMPDL,10
JBNEXT
ADDDL,7
NEXT:
ADDDL,30H
MOVAH,2
INT21H
DECCH
JNZL
INCSI
INCSI
CMPSI,4
JNAP
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
4)直接改变显存内容显示。
(1)显存空间分配:
内存地址空间中,B8000H-BFFFFH共32KB的空间,为80×25彩色字符模
式显示缓冲区。
向这个地址空间写入数据,写入的内容将立即出现在显示器上。
80×25=2000个字符,每个字符在缓冲区中占2个字节,一个字节存放ASCII
码,一个字节存放字符属性(字符颜色、字符背景颜色、闪烁、高亮度)
(2)偏移地址计算:
如第2行,第40列:
(2-1)×160+40×2这个偏移地址中存放字符的ASCII
码,(2-1)×160+40×2+1这个偏移地址中存放字符的属性。
第M行,第N列
的一般计算公式为:
(M-1)×160+N*2存放ASCII码
(M-1)×160+N*2+1存放属性
(3)运行下列程序,在屏幕的第1行,会显示一个字符X。
根据上面
(1)、
(2)点理解程序段。
STACKSEGMENT
DB128DUP(0)
STACKENDS
CSEGSEGMENT
ASSUMECS:
CSEG,SS:
STACK
START:
MOVAX,STACK
MOVSS,AX
MOVSP,128
MOVAX,0B800H
MOVES,AX
MOVAH,‘X’
S:
MOVES:
[160*1+40*2],AH
MOVAL,0
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
5)编程显示以下图案。
*********
*******
*****
***
*
6)编写程序,统计字缓冲区中的20个数据的正数、负数、0的个数,并将
统计结果以16进制形式显示出来。
三、实验步骤及运行结果
1)编写程序:
DATASEGMENT
BUFDB?
DATAENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DATA
START:
MOVAX,CSEG
MOVDS,AX
MOVAH,1
INT21H
MOVAL,0
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
编译:
输出结果:
2)编写程序如下:
DATASEGMENT
BUFDB20
DB?
DB20DUP(?
)
DATAENDS
CSEGSE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 实验 报告