《汇编语言》实验讲义.docx
《《汇编语言》实验讲义.docx》由会员分享,可在线阅读,更多相关《《汇编语言》实验讲义.docx(35页珍藏版)》请在冰豆网上搜索。
《汇编语言》实验讲义
《汇编语言程序设计》实验指导书
《汇编语言》实验学时分配表
序号
实验项目名称
实验学时
实验报告或作业
课内
课外
1
汇编语言程序上机过程以及调试
2
2
1
2
顺序程序设计
2
2
1
3
循环程序设计
2
2
1
4
分支程序设计
2
2
1
5
子程序设计
2
2
1
6
I/O程序设计
2
2
1
7
实验七综合程序设计
程序设计
2
2
1
合计
14
14
7
实验一汇编语言程序上机过程以及调试
一、预习内容
1. 工具软件MASM、LINK的使用
2. 常用DEBUG命令的使用:
G,D,R,T,U,Q
3. 完整程序设计方法的格式。
二、目的要求
1. 掌握常用工具软件MASM、LINK的使用
2. 掌握常用DEBUG命令:
G,D,R,T,U,Q能灵活使用这些命令调试程序
3. 掌握完整程序设计方法的格式,能正确书写数据段,代码段等。
三、实验内容
比较两个字符串string1和string2所含的字符是否相同,如果相同则显示’Match'否则显示’Nomatch’.请读程序,并将程序补充完整。
DSEGSEGMENT
string1db'Movethecursorbackward.'
string2db'Movethecursorbackward.'
mess1db'Match.',13,10,'$'
mess2db'Nomatch.',13,10,'$'
DSEGENDS
CSEGSEGMENT
assumecs:
CSEG,ds:
DSEG,es:
DSEG,
MAINPROCFAR
start:
movax,dseg
movds,ax
moves,ax
leasi,string1
①
cld
②
repzcmpsb
jzmatch
leadx,mess2
jmpshortdisp
match:
leadx,mess1
disp:
movah,09h
int21h
movax,4c00h
int21h
MAINENDP
CSEGENDS
endstart
实验步骤:
1)用文字编辑工具(记事本或EDIT)将源程序输入完整后保存在D:
\masm50下,注意保存时将文件扩展名改为.asm(如lab1.asm)。
2)打开桌面的“命令提示符”程序进入dos命令操作,先用cdmasm50命令改变路经,接着用”masm+文件名”(如masmlab1,这里文件名可以不带扩展名)对源文件进行汇编,产生.obj文件和.LST文件。
若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。
3)用”link+文件名”(如linklab1)将.obj文件连接成可执行的.exe文件(lab1.exe)。
4)在DOS状态下直接运行link产生的.exe文件(如lab1),即在屏幕上显示Match.
5)用debug调试程序,熟悉debug命令的使用:
(1)打debuglab1.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命令获得。
如e29表示从偏移地址29h开始修改数据。
试用此命令将数据段变量string1的内容修改为’Movethecursorforward.’
(8)再次用命令g执行程序,查看执行结果。
(9)用命令q退出debug,如果在上述步骤中碰到异常,可以先用q命令退出后再进入调试。
四、实验报告或作业
1.分析程序,画出程序流程图
2.汇编,连接及调试时产生的错误,其原因及解决办法。
3.思考:
1)上述实验中用e修改数据段的内容,是否改变原文件lab1.asm的内容?
2)用单步执行命令t运行程序,运行到movax,4c00h,int21h指令后,cs和ip寄存器内容前后有何变化,产生变化的原因是什么?
附:
DEBUG使用:
1.打DEBUG进入DEBUG,显示提示符‘-‘。
2.退出DEBUG命令:
Q
3.显示内存命令:
D起始地址结束地址
4.修改内存命令:
E起始地址,连续修改打空格键。
打回车键退出E命令。
5.检查寄存器命令:
R
标志位显示10
CFCYNC
ZFZRNZ
SFNGPL
AFACNA
OFOVNV
PFPEPO
DFDNUP
IFEIDI
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起始地址结束地址目的地址
标志位显示10
CFCYNC
ZFZRNZ
SFNGPL
AFACNA
OFOVNV
PFPEPO
DFDNUP
IFEIDI
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起始地址结束地址目的地址
实验二顺序程序设计
一、预习内容
1.常用工具软件MASM、LINK和DEBUG的使用
2.完整程序设计方法的格式
3.汇编语言顺序结构程序的设计方法
二、目的要求
1.继续熟悉常用工具软件MASM、LINK和DEBUG的使用
2.继续熟悉完整程序设计方法的格式
3.学习与掌握汇编语言顺序结构程序的设计方法
三、实验内容
编程实现datax双字除以字datay(用div),并且把商存入quotient字单元,把余数存入remainder字单元(具体数值可自行确定)。
并且用debug查看程序的运行结果,检查程序运行结果的正确性。
DSEGSEGMENT
dataxdd956123h
dataydw123h
quotientdw?
remainderdw?
DSEGENDS
CSEGSEGMENT
assumecs:
CSEG,ds:
DSEG
start:
movax,dseg
movds,ax
movax,datax
movdx,datax[2]
divdatay
movquotient,ax
movremainder,dx
movax,4c00h
int21h
CSEGENDS
endstart
实验步骤:
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 学会针对不同的问题,选用不同的组织循环的方法。
二、 实验内容
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指令不改变CF
adcdl,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
again:
testbx,0ffffh;也可以用cmpbx,0
jzdone
;全部是0就可以退出循环,减少循环次数
shlbx,1;用指令shrbx,1也可以
adcdl,0
;利用ADC指令加CF的特点进行计数
jmpagain
done:
cmpdl,10;判断1的个数是否小于10
jbdigit;1的个数小于10,转移
pushdx
movdl,‘1’;1的个数大于或等于10
movah,2;则要先显示一个1
int21h
popdx
subdl,10
digit:
adddl,‘0’;显示个数
movah,2
int21h
A---------------------------------------------------A
B——————————————————————B
实验B
一、预习内容
1.多重循环程序和排序程序设计方法。
2.带符号数的比较转移指令:
JL,JLE,JG,JGE
二、目的要求
1.掌握多重循环程序和排序程序设计方法。
2.掌握带符号数的比较转移指令:
JL,JLE,JG,JGE
三、实验内容
建立学生名次表,以grade为首地址的数组中保存了学生的成绩,其中grade+i保存学号为i+1的学生的成绩。
要求建立一个10个字的rank数组,并根据grade中的学生成绩将学生名次填入rank数组中,其中rank+i的内容是学号为i+1学生的名次(提示:
一个学生的名次等于成绩高于该学生的人数加1)
DSEGSEGMENT
gradedw88,75,95,63,98,78,87,78,90,60
rankdw10dup(?
)
DSEGENDS
CSEGSEGMENT
assumecs:
CSEG,ds:
DSEG
start:
movax,dseg
movds,ax
movdi,10
movbx,0
loop:
①
movdx,1
movcx,10
②
next:
cmpax,[si]
jgeno_count
incdx
no_count:
addsi,2
loopnext
③
addbx,2
④
jneloop
movax,4c00h
int21h
CSEGENDS
endstart
实验步骤:
1.输入,汇编并连接此程序。
2.在DEBUG下运行此程序,记录运行结果。
3.将转移指令JGE改为JG,JL,JLE分别运行记录排序结果,察看结果是否正确不对,并分析原因。
四、实验报告或作业
1.分析程序,画出程序流程图
2.汇编,连接及调试时产生的错误,其原因及解决办法。
3.记录JGE情况下的排序结果,同时比较将转移指令JGE改为JG,JL,JLE时的排序结果,并分析结果正确与否,如果不正确,写出原因和解决办法。
4.思考:
如果想外循环也用loop实现,应该怎样修改程序?
B——————————————————————B
实验四分支程序设计
A---------------------------------------------------A
实验A(必做)
一、实验目的:
1 掌握分支程序的设计方法
2 掌握利用DEBUG修改参数、检查结果的方法。
3 掌握汇编语言源程序的编辑、汇编、连接及调试过程。
二、 实验内容
1 编写一个程序,显示AL寄存器中的两位十六进制数
2 编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。
三、 实验准备
1 编写实验内容要求的两个程序。
2 写出调试以上程序,即修改程序参数,检查结果的操作方法。
3 熟悉源程序汇编、连接命令的使用方法即要回答的内容。
四、 实验步骤
1 用EDIT或其它编辑软件,编写.ASM源程序,例如HEXASC.ASM及DSPKEY.ASM。
2 对其进行汇编及连接,产生.EXE文件。
3 对.EXE文件进行调试运行。
a. 用DEBUG调试运行,学会修改AL内容的方法。
b. 对DSPKEY.EXE键入不同的字符,分别进行调试。
c. 在MS-DOS下运行这两个.EXE文件。
五、 实验报告要求
画出两个程序的流程图,若要独立编写程序,应列出相应的程序清单。
六、 参考程序清单
(1) 显示AL中两位十六进制数程序:
;DISPHEX.ASM
CODESEGMENT
ASSUMECS:
CODE
START:
MOVAL,3EH
MOVBL,AL
MOVDL,AL
MOVCL,4
SHRDL,CL
CMPDL,9
JBENEXT1
ADDDL,7
NEXT1:
ADDDL,30H
MOVAH,2
INT21H;显示高位ASCII码
MOVDL,BL
ANDDL,0FH
CMPDL,9
JBENEXT2
ADDDL,7
NEXT2:
ADDDL,30H
MOVAH,2
VAH,2
INT21H;显示低位ASCII码
MOVAH,4CH
INT21H
CODEENDS;返回DOS
ENDSTART
(2) 显示键入字符程序
;DISPKEY.ASM
CODESEGEMENT
ASSUMECS:
CODE
START:
MOVAH,1
INT21H;等待键入字符,送AL
CMPAL,0DH;是否是回车符?
JZDONE;是则转DONE退出程序
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
CODE:
ENDS
ENDSTART
A------------------------------------------A
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单元中
DSEGSEGMENT
gradedw56,69,84,82,73,88,99,63,100,80
s5dw0
s6dw0
s7dw0
s8dw0
s9dw0
s10dw0
DSEGENDS
CSEGSEGMENT
assumecs:
CSEG,ds:
DSEG
start:
movax,dseg
movds,ax
movcx,10
movbx,offsetgrade
compare:
movax,[bx]
cmpax,60
jlfive
cmpax,70
jlsix
cmpax,80
jlseven
cmpax,90
jleight
cmpax,100
jnenine
①
②
nine:
incs9
jmpshortchange_addr
eight:
incs8
jmpshortchange_addr
seven:
incs7
jmpshortchange_addr
six:
incs6
jmpshortchange_addr
five:
incs5
change_addr:
③
④
movax,4c00h
int21h
CSEGENDS
endstart
实验步骤:
1.阅读程序,将程序补充完整。
2.输入,汇编并连接此程序。
3.在DEBUG下运行此程序,记录运行结果。
4.单步运行程序,记录前五次执行转移指令后寄存器csip的值。
四、实验报告或作业
1.分析程序,画出程序流程图。
2.汇编,连接及调试时产生的错误,其原因及解决办法。
3.每次执行转移指令时寄存器csip的值。
4、最终运行结果,即s5、s6、s7、s8、s9及s10的值。
5、思考:
如何修改程序使源程序先统计s10,然后依次统计s9,s8,s7,s6,s5?
B———————————————————————B
实验五子程序设计
A---------------------------------------------------A
实验A(必做)
本实验的目的在于让读者掌握同一模块调用的方法。
一、 实验目的
1 掌握主程序与子程序之间的调用关系及调用方法。
2 掌握子程序调用过程中近程调用与远程调用的区别。
3 掌握通过堆栈转送参数的方法。
二、实验内容
1 将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。
要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示.
2 编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数).
三、实验说明
1 第一个实验程序用子程序的近程调用实现。
由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。
实验过程