《汇编语言》实验讲义Word下载.docx
- 文档编号:17074111
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:23
- 大小:31.07KB
《汇编语言》实验讲义Word下载.docx
《《汇编语言》实验讲义Word下载.docx》由会员分享,可在线阅读,更多相关《《汇编语言》实验讲义Word下载.docx(23页珍藏版)》请在冰豆网上搜索。
movcx,017CLDrepmovsBret
codeendsendstart
实验步骤:
1)用文字编辑工具(记事本或EDIT)将源程序输入完整后保存在D:
\\masm50下,注意保存时将文件扩展名改为.asm(如P77.asm)。
2)打开桌面的“命令提示符”程序进入dos命令操作,先用cdmasm50命令改变路经,
接着用”masm+文件名”(如masmP77,这里文件名可以不带扩展名)对源文件进行汇编,产生.obj文件和.LST文件。
若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。
3)用”link+文件名”(如linkP77;
)将.obj文件连接成可执行的.exe文件(P77.exe)。
4)用debug调试程序,熟悉debug命令的使用:
(1)打debugP77.exe进入debug控制,显示提示符‘-‘。
(2)用命令g执行程序,可得与步骤4相同的结果,也可用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况,并注意标志位有无变化。
(3)用命令u检查键入的程序并记录,特别注意左边的机器码和指令地址。
如果一条u命令没有显示完全,可以再次输入u命令,该命令会紧接着上一个命令的输出继续显示。
(4)用命令’g+地址’设置断点,如g06,表示将断点设置在代码段的偏移地址为06h的指令前,并执行到该断点前。
其中,命令中的地址项可以从上条命令u的运行结果获得。
(5)用命令r查看各寄存器的情况。
(6)用命令d0查看数据段的情况,0表示从偏移地址0开始,也可以指定其他偏移地址值。
(7)用命令‘e+地址’的方式修改数据区的字符串,其中’地址’指需要修改的数据段内存单元偏移地址,可根据上条d0命令获得。
如e09表示从偏移地址09h开始修改数据。
(8)再次用命令g执行程序,查看执行结果。
Page2of25
(9)用命令q退出debug,如果在上述步骤中碰到异常,可以先用q命令退出后再进入调试。
四、实验报告或作业
1.分析程序,画出程序流程图
2.汇编,连接及调试时产生的错误,其原因及解决办法。
3.思考:
1)上述实验中用e修改数据段的内容,是否改变原文件P77.asm的内容?
2)用单步执行命令t运行程序,运行到movax,4c00h,int21h指令后,cs和ip寄存器内容前后有何变化,产生变化的原因是什么?
附:
DEBUG使用:
1.打DEBUG进入DEBUG,显示提示符‘-‘。
2.退出DEBUG命令:
Q
3.显示内存命令:
D起始地址结束地址
4.修改内存命令:
E起始地址,连续修改打空格键。
打回车键退出E命令。
5.检查寄存器命令:
R
标志位显示10
CFCYNCZFZRNZSFNGPLAFACNAOFOVNVPFPEPODFDNUPIFEIDI
6.修改寄存器命令:
R寄存器名
7.小汇编命令:
A起始地址,不输入指令打回车键退出A命令。
8.反汇编命令:
U起始地址结束地址9.文件命名命令:
N盘号:
文件名10.读文件命令:
L内存地址11.写文件命令:
W内存地址
10.读扇区命令:
L内存地址盘号(0--A:
1--B:
)扇区号扇区数11.写扇区命令:
W内存地址盘号扇区号扇区数12.运行命令:
G=起始地址结束(断点)地址
13.单步命令:
T=起始地址运行指令数,进入子程序内部。
14.单步命令:
P=起始地址运行指令数,不进入子程序内部。
15.内存搬家命令:
M起始地址结束地址目的地址
CFCYNCZFZRNZSFNGPL
Page3of25
AFACNAOFOVNVPFPEPODFDNUPIFEIDI
实验二顺序程序设计
1.常用工具软件MASM、LINK和DEBUG的使用2.完整程序设计方法的格式
3.汇编语言顺序结构程序的设计方法
1.继续熟悉常用工具软件MASM、LINK和DEBUG的使用2.继续熟悉完整程序设计方法的格式
3.学习与掌握汇编语言顺序结构程序的设计方法
编程实现datax双字除以字datay(用div),并且把商存入quotient字单元,把余数存入remainder字单元(具体数值可自行确定)。
并且用debug查看程序的运行结果,检查程序运行结果的正确性。
DSEGSEGMENT
dataxdd956123hdataydw123h
quotientdw?
remainderdw?
DSEGENDSCSEGSEGMENT
CSEG,ds:
DSEGstart:
movax,dseg
movds,ax
Page4of25
movax,dataxmovdx,datax[2]divdataymovquotient,axmovremainder,dxmovax,4c00hint21h
CSEGENDSendstart
1.用文字编辑工具(记事本或EDIT)将源程序输入完整后保存在D:
\\masm50下,注意保存时将文件扩展名改为.asm(如lab2.asm)。
2.用masm对源文件进行汇编,产生.obj(如lab2.obj)文件和.LST文件。
若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。
3.用link将.obj文件连接成可执行的.exe文件(lab2.exe)。
4.直接运行link产生的.exe文件。
5.用debug调试程序,单步执行程序,并记录黑体部分单步执行后ax,dx,cs,ip寄存器以及标志寄存器的值.
6.在debug状态下,用“a+偏移地址”的方式将程序的div改为idiv再单步执行黑体部分,对比步骤5的结果,查看有何变化,并记录。
7.修改源程序实现双字datax与字datay的无符号乘法。
1.分析程序,画出程序流程图。
2.汇编,连接及调试时产生的错误,其原因及解决办法。
3.步骤5的结果记录。
4.步骤6的结果记录,并分析发生变化的原因。
5.思考:
1)指令movdx,datax[2]改写成movdx,[datax+2]经过汇编后,二者是否相同,为什么?
2)如何实现双字datax与字datay的乘法,写出完整的源程序。
实验三循环程序设计
A---------------------------------------------------A实验A(必做)
一、实验目的:
1掌握循环程序的设计方法
2进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。
3学会针对不同的问题,选用不同的组织循环的方法。
Page5of25
二、实验内容
1编写一个程序,用二进制显示从键盘输入一个字符的ASCII码。
2编写一个程序,记录某个字存储单元数据中1的个数,以十进制形式显示结果。
三、实验准备
1编写实验内容要求的两个程序。
2写出调试以上程序,即修改程序参数,检查结果的操作方法。
3熟悉源程序汇编、连接命令的使用方法即要回答的内容。
四、实验步骤
1用EDIT或其它编辑软件,编写.ASM源程序,例如Binary.ASM及Statistic.ASM。
2对其进行汇编及连接,产生.EXE文件。
3对.EXE文件进行调试运行。
a.用DEBUG调试运行,学会修改AL内容的方法。
b.对DSPKEY.EXE键入不同的字符,分别进行调试。
c.在MS-DOS下运行这两个.EXE文件。
五、实验报告要求
画出两个程序的流程图,若要独立编写程序,应列出相应的程序清单。
六、参考程序段清单:
;
Binary.asm
movcx,8;
CX←8(循环次数)
again:
shlbl,1;
左移进CF,从高位开始显示movdl,0;
MOV指令不改变CFadcdl,30h;
DL←0+30H+CF;
CF若是0,则DL←’0‘;
CF若是1,则DL←’1‘movah,2
int21h;
显示loopagain
CX减1,如果CX未减至0,则循环
Statistic.ASM;
数据段
numberdw1110111111100100B;
代码段
movbx,number
xordl,dl;
循环初值:
DL←0
testbx,0ffffh;
也可以用cmpbx,0jzdone
全部是0就可以退出循环,减少循环次数shlbx,1;
用指令shrbx,1也可以adcdl,0
Page6of25
利用ADC指令加CF的特点进行计数jmpagain
done:
cmpdl,10;
判断1的个数是否小于10jbdigit;
1的个数小于10,转移pushdx
movdl,‘1’;
1的个数大于或等于10movah,2;
则要先显示一个1int21hpopdxsubdl,10
digit:
adddl,‘0’;
显示个数movah,2int21h
A---------------------------------------------------A
B——————————————————————B
实验B
1.多重循环程序和排序程序设计方法。
2.带符号数的比较转移指令:
JL,JLE,JG,JGE
1.掌握多重循环程序和排序程序设计方法。
2.掌握带符号数的比较转移指令:
建立学生名次表,以grade为首地址的数组中保存了学生的成绩,其中grade+i保存学号为i+1的学生的成绩。
要求建立一个10个字的rank数组,并根据grade中的学生成绩将学生名次填入rank数组中,其中rank+i的内容是学号为i+1学生的名次(提示:
一个学生的名次等于成绩高于该学生的人数加1)
gradedw88,75,95,63,98,78,87,78,90,60rankdw10dup(?
)DSEGENDSCSEGSEGMENT
movax,dsegmovdi,10movbx,0
loop:
①
Page7of25
movdx,1movcx,10②
next:
cmpax,[si]jgeno_countincdx
no_count:
addsi,2loopnext③addbx,2
④jneloopmovax,4c00hint21h
实验步骤:
1.输入,汇编并连接此程序。
2.在DEBUG下运行此程序,记录运行结果。
3.将转移指令JGE改为JG,JL,JLE分别运行记录排序结果,察看结果是否正确不对,并分析原因。
3.记录JGE情况下的排序结果,同时比较将转移指令JGE改为JG,JL,JLE时的排序结果,并分析结果正确与否,如果不正确,写出原因和解决办法。
4.思考:
如果想外循环也用loop实现,应该怎样修改程序?
B——————————————————————B实验四分支程序设计
实验A(必做)
1掌握分支程序的设计方法
2掌握利用DEBUG修改参数、检查结果的方法。
3掌握汇编语言源程序的编辑、汇编、连接及调试过程。
Page8of25
1编写一个程序,显示AL寄存器中的两位十六进制数
2编写一个程序,判别键盘上输入的字符;
若是1-9字符,则显示之;
若为A-Z或
a-z字符,均显示“c”;
若是回车字符(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。
1用EDIT或其它编辑软件,编写.ASM源程序,例如HEXASC.ASM及DSPKEY.ASM。
六、参考程序清单
(1)显示AL中两位十六进制数程序:
DISPHEX.ASMCODESEGMENT
ASSUMECS:
CODESTART:
MOVAL,3EHMOVBL,ALMOVDL,ALMOVCL,4SHRDL,CLCMPDL,9JBENEXT1ADDDL,7NEXT1:
ADDDL,30HMOVAH,2
INT21H;
显示高位ASCII码MOVDL,BLANDDL,0FHCMPDL,9JBENEXT2ADDDL,7
Page9of25
NEXT2:
ADDDL,30HMOVAH,2VAH,2
显示低位ASCII码MOVAH,4CHINT21H
CODEENDS;
返回DOSENDSTART
(2)显示键入字符程序;
DISPKEY.ASMCODESEGEMENT
MOVAH,1
等待键入字符,送ALCMPAL,0DH;
是否是回车符?
JZDONE;
是则转DONE退出程序CMPAL,’0’JBNEXT
CMPAL,’9’JACHARUPMOVDL,ALMOVAH,2INT21HJMPSTARTCHARUP:
CMPAL,41HJBNEXTCMPAL,5AHJACHRDN
DISPC:
MOVDL,’C’MOVAH,2INT21HNEXT:
JMPSTARTCHRDN:
CMPAL,61HJBNEXTCMPAL,7AHJANEXTJMPDISPCDONE:
MOVAH,4CHINT21HCODE:
ENDS
ENDSTART
A------------------------------------------A
Page10of25
B—————————————————————B
实验B(选做)
1.分支程序设计方法。
2.利用转移指令jl、jmp实现多岔分支的方法。
1.掌握分支程序设计方法。
2.掌握利用转移指令jl、jmp实现多岔分支的方法。
统计学生成绩result。
设有10个学生的成绩分别为56、69、84、82、73、88、99、63、100和80分。
试编制程序分别统计低于60分、60~69分、70~79分、80~89分、90~99分及100分的人数,并分别存放到s5、s6、s7、s8、s9及s10单元中
gradedw56,69,84,82,73,88,99,63,100,80
s5dw0s6dw0s7dw0s8dw0s9dw0s10dw0DSEGENDSCSEGSEGMENT
movax,dsegmovcx,10
movbx,offsetgrade
compare:
movax,[bx]cmpax,60jlfivecmpax,70jlsixcmpax,80jlsevencmpax,90jleight
Page11of25
cmpax,100jnenine
①②
nine:
incs9
jmpshortchange_addr
eight:
incs8
seven:
incs7
six:
incs6
five:
incs5
change_addr:
③④movax,4c00hint21h
CSEGENDS
endstart
1.阅读程序,将程序补充完整。
2.输入,汇编并连接此程序。
3.在DEBUG下运行此程序,记录运行结果。
4.单步运行程序,记录前五次执行转移指令后寄存器csip的值。
3.每次执行转移指令时寄存器csip的值。
4、最终运行结果,即s5、s6、s7、s8、s9及s10的值。
5、思考:
如何修改程序使源程序先统计s10,然后依次统计s9,s8,s7,s6,s5?
B———————————————————————B
实验五子程序设计
Page12of25
A---------------------------------------------------A实验A(必做)
本实验的目的在于让读者掌握同一模块调用的方法。
一、实验目的
1掌握主程序与子程序之间的调用关系及调用方法。
2掌握子程序调用过程中近程调用与远程调用的区别。
3掌握通过堆栈转送参数的方法。
1将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕
上显示出来。
要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示.
2编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计
字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数).
三、实验说明
1第一个实验程序用子程序的近程调用实现。
由于在调用HEXASC子程序时,子程序
又调用了DISP子程序,这叫子程序的嵌套调用。
实验过程中可以从堆
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 实验 讲义