汇编语言试验指导.docx
《汇编语言试验指导.docx》由会员分享,可在线阅读,更多相关《汇编语言试验指导.docx(17页珍藏版)》请在冰豆网上搜索。
汇编语言试验指导
实验指导
一.上机实验的一般步骤和要求:
1.上机前对选定的实验题应有所了解,并写好程序。
2.上机过程中对重要方法和步骤、问题和结果应有记录。
3.所有程序原则上都要通过调试手段运行。
4.实验后进行分析和总结,给出实验报告。
二.实验报告的内容一般有:
1.实验题的内容及要求。
2.思路和方法、算法描述及有注释和说明的程序清单。
3.程序调试和运行的重要步骤、问题和结果。
4.分析和总结。
三.实验环境的建立
参看第二章第一节。
通常在WINDOWSXP系统下。
如果其他操作系统(如WIN7),不支持汇编程序工作,可安装MasmforWindows集成实验环境asm20125(支持Win2000、WinXP、WinVISTA、WIN7等操作系统)。
实验1上机过程及程序调试
实验目的:
1.通过第二章两个简单实例认识汇编语言程序,初步了解程序格式;段定义;标号;DOS系统功能;操作数;指令;说明语句等作用。
2.掌握汇编语言程序从设计到形成可执行程序文件的方法和步骤。
即编辑、汇编、连接。
了解汇编语言的系统工作文件和工作环境。
理解汇编程序和连接程序的作用。
理解列表文件内容。
3.初步了解程序的运行和调试方法。
学会使用DEBUG主要命令和常用的DOS命令。
实验内容:
【1】编辑第二章两个简单实例,通过汇编、连接。
【2】用DEBUG对hello程序进行调试。
问题:
(1)该程序在内存中的起始地址是多少?
结束地址是多少?
共占几个字节?
(2)0B63:
0008表示什么意思?
(3)程序中定义的串‘HELLO,WORLD!
$’在内存中的起始地址是多少?
请用DEBUG命令显示该串。
(4)如果用带有断点的G命令运行该程序,写出命令。
(5)用P命令单步执行程序。
(6)用T命令跟踪程序,在跟踪执行INT21时出现什么问题?
(7)用A命令在偏移地址100H处建立该段程序,并运行。
(8)用W命令把该段程序写成文件,再调入。
实验2算术及位串处理程序
实验目的:
掌握多数位的算术运算、移位操作、字符串操作等程序的设计,学习使用分支与循环等基本编程方法,熟练使用DEBUG。
实验内容:
【1】在数据段预先存放16个十六进制数的ASCII码,首地址为ASC。
从键盘输入一位十六进制数到BX,用ASC[BX]寻址方式找到对应数位的ASCII码,并取出显示。
【指导提示】
(1)16个十六进制数的ASCII码的定义:
ASCDB30H,31H,32H,33H,34,35H,36H,37H,38H,39H
DB41H,42H,43H,44H,45H,46H
(2)把从键盘输入的一位十六进制数(例如大写的D减37H),得到序号13,用该值去定位ASC表,即用ASC[BX]寻址可得到D的ASCII码44H,取出显示。
【2】用16位指令编制程序,处理32位的加减乘除算术四则运算题。
要求:
(1)所有变量均定义成字类型,其中应有负数。
部分变量也可以使用寄存器,在DEBUG下临时给出。
程序必须在DEBUG下执行,以便验证结果。
(2)跟踪程序,记录每条指令执行后的ZF,SF,CF,OF标志。
回答每条指令执行后ZF,SF,CF,OF标志设置的理由。
【指导提示】
(1)XDW-6;定义16位的负数,在DEBUG下注意观察其值,用R命令设置某寄存器值。
【3】用字符串处理指令编制程序,处理字符串的比较和查找,显示结果。
要求:
(1)字符串的比较程序中,一个字符串在数据段定义,另一个字符串在程序执行时从键盘输入,必须定义键盘缓冲区。
并指出不相等的位置。
(2)在字符串中查找某个字符,字符串在数据段定义,要查找的字符在程序执行时从键盘输入。
并指出找到的位置。
【指导提示】
datasegment
mess1DB9,?
,9DUP(?
);定义键盘缓冲区
dataends
extsegment
mess2db‘computersoftware$’
extends
codesegment
assumecs:
code,ds:
data,es:
ext
start:
movax,data
movds,ax
movax,ext
moves,ax
leadx,mess1;输入串到键盘缓冲区
movah,10
int21h
movcx,mess+1;实际输入字符的个数
leasi,mess1+2;输入串的实际首地址
leadi,mess2
cld
repecmpsb
。
。
。
。
。
。
【4】AL字节内容反向排序。
【指导提示】循环移位指令即可。
实验3分支程序设计
实验目的:
掌握分支与循环程序等基本编程方法。
熟悉数制转换。
用LOOP指令、条件转移指令和向量地址法实现程序转移。
实验内容:
【1】把BX寄存器中的二进制数用十六进制数格式显示输出。
在DEBUG下设置BX寄存器的值。
十六进制数用大写表示。
【指导提示】参看例6.4
【2】分离字数组ARRAY中的正、负数,把其中的正数复制到PDATA数组;负数复制到NDATA数组,并分别统计正、负数个数。
【指导提示】
datasegment
arraydw2,-2,3,-3,4,5,0;定义3个等长的数组
org10h
pdatadw7dup(?
)
org20h
ndatadw7dup(?
)
org30h
pdb0;2个变量统计正负数个数
ndb0
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
leabx,array
leasi,pdata
leadi,ndata
movcx,7
kk:
movax,[bx]
testax,8000h;测试正负数
jzzs;转正数处理
。
。
。
。
。
。
jmpnext
zs:
。
。
。
。
。
。
next:
addbx,2
loopkk
movdl,p;显示正数个数
adddl,30h
movah,2
int21h
movdl,n
adddl,30h
movah,2
int21h
movah,4ch
int21h
codeends
endstart
【3】在数据段定义分支地址表,通过键盘输入数字1~8,实现转移。
要求:
(1)分支表定义如下:
PTABLEDWP1,P2,P3,P4,P5,P6,P7,P8
(2)P1~P8为标号,如果键盘输入数字3,则从分支地址表PTABLE中取出P3的地址,实现间接转移,标号处的指令只是显示一个信息。
【指导提示】参看例6.3
实验4循环程序设计
实验目的:
1.掌握和提高循环程序编程技巧,熟悉键盘输入、显示输出等基本人机交互。
2.利用循环程序延时,测算机器的速度。
实验内容:
【1】从键盘输入一个单个字符,显示该字符的ASCII码(十六进制),回车键退出循环,终止程序。
【指导提示】参看例6.7
【2】从键盘输入7位二进制数,显示对应的字符,回车键退出循环,终止程序。
【指导提示】
codesegment
assumecs:
code
start:
movcx,7
movdl,0
next:
shldl,1
movah,1
int21h
。
。
。
。
。
。
loopnext
movah,2
int21h
movah,4ch
int21h
codeends
endstart
【3】如果MOV指令占1个时钟周期,INCreg16指令占1个时钟周期,JXX指令占1个时钟周期,LOOP指令占5个时钟周期。
利用上面的指令,设计一个二重循环程序(目的是为了扩大延时),执行程序,计算出每秒指令条数,评估该台机器的速度。
例如:
;这里是显示程序运行的开始时间
movdi,100
p2:
movcx,10000
p1:
incax
loopp1
decdi
jnzp2
;这里是显示程序运行的结束时间
要求:
(1)二重循环的计数初值在DEBUG下给出。
(2程序运行的开始时间和结束时间由DOS功能调用INT21H(AH=2CH)测出。
【指导提示】
用(AH=2CH)INT21H取系统时间看循环耗时,参附录4说明。
在DEBUG下运行程序,通过直接看时间,不需用程序显示时间。
movah,2ch;取系统时间
int21h
movsi,dx;dx中的系统时间转送si
movdi,100
p2:
movcx,10000
p1:
incax
loopp1
decdi
jnzp2
movah,2ch;取系统时间
int21h
;这里的dx是结束时间
实验5子程序设计
实验目的:
掌握通用子程序的设计方法,学会子程序的功能划分和正确进行子程序的参数传递。
实验内容:
【1】采用通过地址表传递参数地址的方法,求数组元素累加和的通用子程序。
【指导提示】
datasegment
arrydb16dup(?
)
numbdb?
sumdb?
tabledw3dup(?
);地址表
dataends
codesegment
assumecs:
code,ds:
data
mainprocfar
pushds
subax,ax
pushax
movax,data
movds,ax
movtable,offsetarry
movtable+2,offsetnumb
movtable+4,offsetsum
movbx,offsettable;地址表首地址送bx
callsumarry;调子程序求和
ret
mainendp
sumarryprocnear
movsi,[bx];arry的地址送si
movdi,[bx+2];取元素个数的地址
movcx,[di];元素个数送cx
movdi,[bx+4];存放和的地址送di
xorax,ax
next:
addax,[si]
addsi,2
loopnext
mov[di],ax
ret
prosumendp
codeends
endmain
【2】从键盘输入一个十六进制数(不超过四位),显示输出该数的十进制形式。
【指导提示】参看例7.12
【3】从键盘输入一个十进制数(小于65536的正数),显示输出该数的十六进制形式。
【指导提示】参看例7.3
实验6模块化程序设计
实验目的:
熟悉使用结构变量,掌握多模块程序设计方法,正确使用PUBLIC、EXTRN实现参数传递。
实验内容:
【1】设计一个简单计算器程序,实现整数的加减乘除运算。
要求:
(1)以下两种算式结构可供参考:
算式分离结构:
操作数和操作符独立定义为:
OPER1DW?
;操作数1
OPERATORDB?
;操作符
OPER2DW?
;操作数2
算式整体结构:
操作数和操作符放在键盘缓冲区,缓冲区可定义为:
MAXDB10;缓冲区大小
REALDB?
;实际输入的字节数
BUFFDB10DUP(?
);算式
(2)从键盘输入算式,只接受不超过4位的十进制正整数。
运算结果为不超过65535的整数。
(3)不接受复合算式,如3+5*6。
(4)计算器使用运算符‘+-*/’、回车键和‘=’键、清除键‘C’。
回车键或‘=’键给出计算结果,清除键‘C’为清0。
按清除键后,可接受下一算式。
(5)程序分算式输入模块、计算模块、输出显示模块。
输入模块和计算模块在同一程序文件中,输出显示模块为另一程序文件。
【指导提示】
extrnBTOD:
far
datasegment
xDW?
;操作数1
yDW?
;操作数2
ysfDB?
;运算符
dataends
codesegment
assumecs:
code,ds:
data
mainprocfar
pushds
xorax,ax
pushax
movax,data
movds,ax
callDTOB;输入一个数,DTOB子程序参看例7.3
movsi,bx;第一个数转移到si
callgetysf;getysf子程序是接收键入的运算符
callDTOB
;完成2个数的运算,结果放BX
。
。
。
。
。
。
callBTOD;调外部子程序输出结果,BTOD子程序参看例7.12
ret
mainendp
DTOBprocnear
......
DTOBendp
getysfprocnear
……
getysfendp
codeends
endmain
【2】学生成绩表由姓名、A成绩、B成绩、合计总分四项组成,其中合计总分=A成绩+B成绩。
从键盘输入6个人的成绩记录后,输出学生成绩表。
要求:
成绩表用结构类型;输入、计算、输出分为3个子程序;成绩为百分制无符号数;合计总分由程序计算;用以下两种方法分别实现。
(1)成绩从键盘输入后转为压缩BCD码格式存放。
(2)成绩从键盘输入后转为二进制数格式存放。
【指导提示】
;结构类型定义和变量定义
Scorstruc
namdb‘aaaaaa’;name是系统敏感的关键字,不能用。
adw0
bdw0
sumdw0
Scorends
Std1scor6dup(<>)
……
;输入成绩(2位数)以BCD码格式存放
Movah,1
Int21h
Movsi,ax
Andsi,0fh
Movcl,4
Shlsi,cl
movah,1
Int21h
andax,0fh
addsi,ax
leabx,std1
mov[bx].a,si
……
;输入成绩以二进制数格式存放,可参例7.3(从键盘输入十进制数)
;显示输出,可参例7.12(显示十进制数)
;对于以BCD码格式存放的数据,可以方便地输出。
实验7宏汇编程序设计
实验目的:
结合计算器程序掌握宏汇编技术,利用建立的宏库文件进行文件访问,通过和子程序技术的比较,加深对宏汇编技术的理解,提高编程技巧。
实验内容:
【1】用宏指令实现一个简单计算器程序,要求同实验6【1】
【指导提示】参实验6
【2】建立一个宏库文件,其中包含以文件代号方式对文本文件的建立、打开、读、写文件(或设备)等功能的宏定义,参数不限,但文件名必须为参数。
编制程序实现对指定文件的建立、打开、读、写文件(或设备)操作。
【指导提示】
(1)以下为关于文件访问的宏库文件内容
;file.h(文件访问宏库文件)
;用rwmode方式打开fname文件
openhmacrofname,rwmode
movdx,segfname
movds,dx
movdx,offsetfname
moval,rwmode
movah,3dh
int21h
endm
;用atr属性修改(k=1)/校验(k=0)fname文件
modihmacrofname,atr,k
movdx,segfname
movds,dx
movdx,offsetfname
moval,k
movcl,atr
movch,0
movah,43h
int21h
endm
;从handle文件读bytes字节到buf
readhmacrobuf,bytes,handle
movdx,segfname
movds,dx
movdx,offsetbuf
movcx,bytes
movbx,handle
movah,3fh
int21h
endm
;以pmode方式移文件指针,字节数由bytes_h和bytes双字长数据联合指定。
movphmacrobytes_h,bytes,pmode,handle
movcx,bytes_h
movdx,bytes
movbx,handle
moval,pmode
movah,42h
int21h
endm
;用atr属性建立fname文件
createhmacrofname,atr
movdx,segfname
movds,dx
movdx,offsetfname
movcl,atr
movch,0
movah,3ch
int21h
endm
;buf的bytes字节写到handle文件
writehmacrobuf,bytes,handle
movdx,segfname
movds,dx
movdx,offsetbuf
movcx,bytes
movbx,handle
movah,40h
int21h
endm
;关闭handle文件
closehmacrohandle
movbx,handle
movah,3eh
int21h
endm
(2)文件读写的一般流程:
(2.1)读文件的一般流程是:
.ASCII串=文件名(带路径),00H
.打开文件(ASCII串的地址作为调用参数)
.如果成功,获得一个文件代号handle
.根据文件代号handle读出文件的指定字节数到内存缓冲区
.关闭文件
(2.2)写文件的一般流程是:
.ASCII串=文件名(带路径),00H
.建立文件(ASCII串的地址作为调用参数)
.如果成功,获得一个文件代号handle
.根据文件代号handle,把指定的内存缓冲区字节数写到文件
.关闭文件
(3)参看例10.15和例10.16。
实验8中断程序设计
实验目的:
1.利用系统定时器设计中断处理程序,结合具体机器实现定时显示。
2.监视61H(第4位)端口,以便统计61H端口变化的时间间隔规律。
实验内容:
【1】在系统定时器(中断类型号=8)中断处理程序中,有一条INT1CH指令,时钟每发生一次中断(约每秒中断18次),都要执行一次中断类型为1CH的处理程序。
写一个中断类型为1CH的处理程序,利用时钟中断实现每隔4秒显示系统时间。
回车键终止程序。
【指导提示】
参看例9.4,为每隔4秒,程序中设countdw72,和MOVcount,72
显示系统时间可参实验四。
【2】用一个循环程序,目的是监视61H(第4位)端口有无变化,在发生变化时,读取系统时间,以便统计61H端口变化的时间间隔规律。
回车键终止循环程序。
【指导提示】
wait015procnear
begin:
movah,1
int21h
cmpal,13
jeexit
movcx,0
wait15:
inal,61h
andal,00010000b;61H端口的PB4对应1
cmpal,bl
jewait15
movbl,al
movah,2ch;读系统时间到DX
int21h
movdx
loopwait15
jmpbegin
exit:
ret
wait015endp
实验9输入输出程序设计
实验目的:
1.理解键盘硬件中断和键盘缓冲区。
2.熟悉显示器的字符显示方式和图形显示方式,并利用直接写屏方式或BIOS调用编程。
实验内容:
【1】从键盘缓冲区读出键值,并显示该键的字符和ASCII码,如果是‘Esc’键则退出。
程序中不含键盘输入部分,键盘输入通过系统硬件中断送入键盘缓冲区。
【指导提示】
参例10.6
【2】用直接写屏方式实现字符串的水平循环左移,从左边移出,再从右边移入。
【指导提示】
参例10.10,例10.11
【3】图形方式(AL=13H)下从键盘输入一个八位二进制数,在屏幕上画出对应的绿色矩形波。
二进制数1为高电平,高度为40个像素,宽度为20个像素。
【指导提示】
参10.4.2和10.4.3节