syz2.docx
《syz2.docx》由会员分享,可在线阅读,更多相关《syz2.docx(34页珍藏版)》请在冰豆网上搜索。
syz2
IntroductiontoAssemblyLanguageProgramDesign
汇编语言程序设计实验指导书
朱勇刘杰陈卫兵王森编著
阜阳师范学院
实验一DOS常用命令及8088/86指令使用4
实验二内存操作数及寻址方法8
实验四屏幕字符显示程序11
实验五条件转移指令14
实验六汇编语言程序上机过程18
实验八多重循环程序20
实验十音乐程序22
实验十三活动图形显示程序25
实验十八VC++与汇编语言的混合编程28
实验目的28
实验一DOS常用命令及8088/86指令使用
实验目的
通过实验掌握下列知识:
1、DOS命令:
CD,DIR,DEL,RENAME,COPY。
2、8088指令:
MOV,ADD,ADC,SUB,SBB,DAA,XCHG
3、DEBUG命令:
A,D,E,F,H,R,T,U。
4、BCD码,ASCII码及用十六进制数表示二进制码的方法。
5、8088寄存器:
AX,BX,CX,DX,F,IP。
实验类型:
验证
内容及步骤
一、DOS常用命令练习
1、开机后,切换到命令提示符窗口下,出现提示符后键入命令DIR,查看此目录下所有文件。
2、键入命令CD..进入上级目录,再查看此目录下所有文件。
3、将一张3.5寸软盘插到A驱动器中,用DIR命令查看盘上文件。
4、用命令COPYDEBUG.COMBUG复制一个文件。
5、用命令RENAMEBUGBG将BUG文件改为BG。
6、用命令DELBG将文件BG删除。
在操作时要注意提示信息,并按提示操作。
二、DEBUG命令使用
1、键入DEBUG进入DEBUG控制状态,显示提示符'-'。
2、用命令F10010F'A'将'A'的ASCII码填入内存。
3、用命令D10010F观察内存中的十六进制码及屏幕右边的ASCII字符。
4、用命令F11011F41重复上二项实验,观察结果并比较。
5、用命令E100303132……3F将30H-3FH写入地址为100开始的内存单元中,再用D命令观察结果,看键入的十六进制数是什么字符的ASCII码?
6、用H命令检查下列各组十六进制数加减结果并和你的手算结果比较:
(1)34H,22H
(2)56H,78H(3)A5,79H(4)1284H,5678H(5)A758H,347FH
7、用R命令检查各寄存器内容,特别注意AX,BX,CX,DX,IP及标志位中ZF,CF和AF的内容。
8、用R命令将AX,BX内容改写为1050H及23A8H。
三、8088常用指令练习
1、传送指令
1)用A命令在内存100H处键入下列内容:
-A0100↙
****:
0100MOVAX,1234↙
****:
0103MOVBX,5678↙
****:
0106XCHGAX,BX↙
****:
0108MOVAH,35↙
****:
010AMOVAL,48↙
****:
010DMOVDX,75AB↙
****:
010FXCHGAX,DX↙
****:
0111↙
-
注:
****为段寄存器CS的值,是由计算机随机产生的;↙为回车操作。
2)用U命令检查键入的程序并记录,特别注意左边的机器码。
-U0100↙
3)用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况。
并注意标志位有无变化。
-T=0100↙
-T↙
-T↙
┇
2、加减法指令:
1)用A命令在内存100H处键入下列内容:
MOVAH,34
MOVAL,22
ADDAL,AH
SUBAL,78
MOVCX,1284
MOVDX,5678
ADDCX,DX
SUBCX,AX
SUBCX,CX
2)用U命令检查键入的程序及对应的机器码。
3)用T命令逐条运行这些指令,检查并记录有关寄存器及ZF情况。
思考:
这次运行还是键入T,行不行?
怎么办?
用R命令检查一下IP的内容。
注意T命令与IP的关系。
3、带进位加减法:
1)用A命令在内存200H处键入下列内容,并用U命令检查:
MOVAH,12
MOVAL,84
MOVCH,56
MOVCL,78
ADDAL,CL
ADCAH,CH
MOVDH,A7
MOVDL,58
SUBDL,7F
SBBDH,34
2)用T命令逐条运行这些指令,检查并记录有寄存器及CF内容。
3)上面这段程序若改用16位操作指令达到同样结果,怎么改?
试修改并运行之。
4、BCD码加减法
1)内容:
MOVAL,58
ADDAL,25
DAA
2)要求:
用A命令键入,U命令检查,T命令逐条运行并记录有关寄存器及AF内容。
实验报告要求
1、十六进制数加减法手算结果及实验结果
2、8088常用指令练习部分的逐条运行记录,思考结果及自编程序运行记录(列出自编程序)。
附:
动态调试器DEBUG使用
1、键入DEBUG进入DEBUG,显示提示符'-'。
2、退出DEBUG命令:
Q
3、显示内存命令:
D起始地址结束地址
4、修改内存命令:
E起始地址,连续修改键入空格键,键入回车键退出E命令。
5、检查寄存器命令:
R
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起始地址结束地址目的地址
16、十六进制数加法:
H数值数值
表1标志寄存器显示内容一览表
标志位显示
1
0
CF
CY
NC
ZF
ZR
NZ
SF
NG
PL
AF
AC
NA
OF
OV
NV
PF
PE
PO
DF
DN
UP
IF
EI
DI
实验二内存操作数及寻址方法
实验目的
通过实验掌握下列知识:
1、DEBUG命令:
G,N,W,L及Q。
2、8088系统中数据在内存中的存放方式和内存操作数的几种寻址方式。
3、8088指令:
INC,DEC,LOOP,INT3,INT20H,寄存器SI,DI。
4、8088汇编语言伪操作:
BYTEPTR,WORDPTR。
5、求累加和程序和多字节加减法程序。
实验类型:
验证
实验内容和步骤
一、内存操作数及各种寻址方式使用
程序内容:
MOVAX,1234
MOV[1000],AX
MOVBX,1002
MOVBYTEPTR[BX],20
MOVDL,39
INCBX
MOV[BX],DL
DECDL
MOVSI,3
MOV[BX+SI],DL
MOV[BX+SI+1],DL
MOVWORDPTR[BX+SI+2],2846
操作步骤
1)用A命令键入上述程序,并用T命令逐条运行。
2)每运行一条有关内存操作数的指令,要用D命令检查并记录有关内存单元的内容并注明是什么寻址方式。
注意D命令显示结果中右边的ASCII字符及双字节数存放法。
思考:
有关指令中BYTEPTR及WORDPTR伪操作不加行不行?
试一试。
二、求累加和程序:
程序内容:
MOVBX,1000
MOVCX,10
SUBAX,AX
LOP:
ADDAL,[BX]
ADCAH,0
INCBX
J:
LOOPLOP
INT3
操作步骤:
1)用A命令将程序键入到100H开始的内存中,在键入时记下标号LOP和J的实际地址,在键入LOOP指令时LOP用实际地址值代替。
2)用命令NAA将此程序命名为文件AA(文件名可任取)。
3)用R命令将BX:
CX改为程序长度值(即最后一条指令后面的地址减去开始地址)。
4)用命令W100将此程序存到AA命名的磁盘文件中。
5)用命令Q退出DEBUG。
6)用命令DEBUGAA再次调入DEBUG和文件AA,可用U命令检查调入程序。
若调入DEBUG时忘了加AA文件名,可用N命令和L命令将文件调入。
7)用E命令在内存地址1000H处键入16个数字
8)用命令G=100J(J用实际地址代替),使程序运行并停在断点J上,检查AX,BX的值是否符合你的预计值。
9)用T命令运行一步,观察程序方向(IP值)和CX值是否与你的估计一样,若不一样,检查程序是否有错。
10)重复GJ与T,再检查AX是否正确。
11)用G命令使程序运行到结束,检查AX值是否正确。
三、多字节加法程序。
程序内容:
MOVDI,1000
MOVCX,8
MOVSI,2000
CLC
LOP:
MOVAL,[SI]
ADC[DI],AL
INCSI
INCDI
LOOPLOP
INT20
操作步骤:
1)用命令键入此程序。
2)用E命令在1000H开始处键入一个8字节被加数,在2000H开始处键入一个8字节加数,均为低字节在前面。
3)用G命令运行此程序,并用D命令检查其结果(存放在哪里?
),是否正确?
4)将INT20H指令改为INT3,有何区别?
若这条指令不加,行不行?
试一试。
四、自编程序
用16位减法指令编一个32位(4字节)数减法程序,两个源数及结果存放地址同上题。
调试并做记录。
实验报告要求
1、各项实验结果记录。
2、自编程序原稿及调试后修正稿,写出原稿错在那里。
实验四屏幕字符显示程序
实验目的
通过实验掌握下列知识:
1、8088指令:
JMP,ROR,XOR,HLT。
2、利用DOS功能调用INT21H的2号和9号功能进行屏幕显示的方法。
3、直接向视频RAM(VRAM)送ASCII码进行屏幕显示的方法。
4、IBM-PC机的ASCII码表及控制字符。
5、命令(.COM)文件及使用方法。
6、利用^Break(CTRL+BREAK)退出程序的方法及局限性。
实验类型:
验证
实验内容及步骤
一、利用INT2109H号功能调用显示字符串
1、用A命令在100H处键入下列程序:
MOVAH,9
MOVDX,110
INT21
INT20
2、用A命令在110H处键入下列字符串的ASCII码:
DB'Thisisasample!
$'
3、用N命令和W命令将此程序(包括数据区)存入文件名为AA.COM的磁盘文件中。
(存入前BX:
CX必须置为文件长度值)。
4、用Q命令退出DEBUG。
5、在DOS命令下键入AA,运行此程序,即在屏幕上显示'Thisisasample!
'字符串,若不出现,用DEBUG检查程序有无错误。
二、利用INT21H2号功能显示字符
1、用A命令在100H处键入下列程序:
XORDL,DL
MOVCX,100
LOP:
MOVAH,2
INT21
INCDL
PUSHCX
MOVCX,8
DELY:
PUSHCX
MOVCX,0
J:
LOOPJ
POPCX
LOOPDELY
POPCX
LOOPLOP
INT20
2、用G命令运行程序,即在屏幕上依次缓慢的显示256个ASCII字符。
仔细观察每个字符,和IBM-PCASCII码表对照,看07H-0DH处控制字符显示结果与表上有何不同?
3、按CTRL+BREAK退出此程序,若一次不行可多做几次。
三、直接向VRAM送ASCII码显示字符
1、用A命令在100H处键入下列程序:
MOVAX,B000
MOVDS,AX
XORAL,AL
XORBX,BX
MOVCX,100
LOP:
MOV[BX],AL
INCBX
INCAL
PUSHCX
MOVCX,8
DELY:
PUSHCX
MOVCX,0
J:
LOOPJ
POPCX
LOOPDELY
POPCX
LOOPLOP
INT20
2、用N命令和W命令将此程序存入BB.COM文件中。
(一定要先存入!
)
3、用G命令运行此程序,仔细观察每一个ASCII码显示结果,并和字符表及上一道程序运行情况进行对照,其控制字符区(07-0DH)显示结果和INT21H2号功能调用有何不同?
四、自编一个程序,要求显示AX的内容,即能显示AX=xxxx。
调试时AX的内容可用R命令赋值,也可用MOV指令赋值。
实验报告要求
1、各项实验记录及观察体会。
2、利用INT21H显示和直接向VRAM送ASCII码显示方法在显示结果上有什么不同?
3、自编程序草稿及调试结果。
实验五条件转移指令
实验目的
通过实验掌握下列知识:
1、8088指令:
JZ,JNZ,JC,JNC,CMP,SHR。
2、程序:
用字符搜索法确定字符串长度。
3、程序:
十六进制数化为ASCII码的一般方法。
实验类型:
验证
实验内容及步骤
一、用字符搜索法确定字符串长度
1、用A命令在100H开始的内存处键入下列程序:
JMPSTART
DB'Thisistheprogramtomeasure'
DB'thelengthofastring!
$'
START:
MOVBX,102
MOVAL,24
XORCL,CL
LOP:
CMPAL,[BX]
JZEXIT
INCBX
INCCL
JMPLOP
EXIT:
INT3
2、用G命令运行此程序,并检查CL的统计长度是否与你自己统计的实际长度是否一样?
注:
MOVAL,24中24H为$的ASCII码。
二、十六进制数转化为ASCII码的一般方法(显示内存内容)
1、用A命令在100H处键入下列程序:
MOVSI,0
MOVBL,10
LOP:
MOVDL,[SI]
MOVCL,4
SHRDL,CL
CMPDL,0A
JCJ1
ADDDL,7
J1:
ADDDL,30
MOVAH,2
INT21
MOVDL,[SI]
ANDDL,0F
CMPDL,0A
JCJ2
ADDDL,7
J2:
ADDDL,30
MOVAH,2
INT21
MOVDL,20
MOVAH,2
INT21
INCSI
DECBL
JNZLOP
INT20
2、用N,W命令将此程序用CC.COM文件名存入磁盘。
3、用Q命令退出DEBUG。
4、在DOS命令状态下直接运行CC.COM命令文件,应在屏幕上显示出内存从0000H开始的16个字节的内容,若有错误,用DEBUG检查之。
5、自编程序:
修改上面程序,使除以十六进制数形式显示内存内容外,还能在其右边显示该十六进制码所对应的ASCII字符,07-0D的控制字符用'.'代替。
三、综合程序(选做):
测量一字符串长度,并用十六进制数显示之
程序内容:
JMPSTART
DB'Thisisaprogramtomeasurethelengthofastring。
'
DB0D,0A
DB'thelengthofthestringis:
$'
START:
MOVAH,9
MOVDX,102
INT21
MOVBX,101
MOVAL,24
MOVDH,FF
LOP:
INCBX
INCDH
CMPAL,[BX]
JNZLOP
MOVCH,2
MOVCL,4
LOP1:
ROLDH,CL
MOVDL,DH
ANDDL,0F
ADDDL,30
CMPDL,3A
JCJ
ADDDL,7
J:
MOVAH,2
INT21
DECCH
JNZLOP1
INT20
键入此程序,存入DD.COM文件中并在DOS命令状态下直接运行之,若未出现预期结果,用DEBUG检查有否错误?
实验报告要求
1、自编程序草稿及调试后的正确程序。
2、实验体会。
实验六汇编语言程序上机过程
实验目的
1、掌握常用工具软件EDIT,MASM和LINK的使用。
2、伪指令:
SEGMENT,ENDS,ASSUME,END,OFFSET,DUP。
3、利用INT21H的1号功能实现键盘输入的方法。
4、了解.EXE文件和.COM文件的区别及用INT21H4C号功能返回系统的方法。
实验类型:
验证
实验内容
DATASEGMENT
MESSAGEDB'THISISASAMPLEPROGRAMOFKEYBOARDANDDISPLAY'
DB0DH,0AH,'PLEASESTRIKETHEKEY!
',0DH,0AH,'$'
DATAENDS
STACKSEGMENTPARASTACK'STACK'
DB50DUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETMESSAGE
MOVAH,9
INT21H
AGAIN:
MOVAH,1
INT21H
CMPAL,1BH
JEEXIT
CMPAL,61H
JCND
CMPAL,7AH
JAND
ANDAL,11011111B
ND:
MOVDL,AL
MOVAH,2
INT21H
JMPAGAIN
EXIT:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
实验步骤
1、用用文字编辑工具(常用EDIT或记事本)将源程序输入,其扩展名为.ASM。
2、用MASM对源文件进行汇编,产生.OBJ文件和.LST文件。
若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。
3、用TYPE命令显示产生的.LST文件。
4、用LINK将.OBJ文件连接成可执行的.EXE文件。
5、在DOS状态下运行LINK产生的.EXE文件。
即在屏幕上显示标题并提示你按键。
每按一键在屏幕上显示二个相同的字符,但小写字母被改成大写。
按ESC键可返回DOS。
若未出现预期结果,用DEBUG检查程序。
实验报告
1、汇编,连接及调试时产生的错误,其原因及解决办法。
2、思考:
1)若在源程序中把INT21H的'H'省去,会产生什么现象?
2)把INT21H4CH号功能改为INT20H,行不行?
实验八多重循环程序
实验目的
1、掌握多重循环程序和排序程序设计方法。
2、掌握带符号数的比较转移指令:
JL,JLE,JG,JGE
3、伪指令EQU及操作符'$'的使用。
4、COM文件的要求和生成过程。
实验类型:
验证
实验内容
CODESEGMENT
ORG100H
ASSUMECS:
CODE,DS:
CODE
MAIN:
JMPSTART
ARRAYDW1234H,5673H,7FFFH,8000H,0DFFH
DW0AB5H,0369H,005FH,5634H,9069H
COUNTEQU$-ARRAY
START:
MOVCX,COUNT
SHRCX,1
DECCX
MOVBL,-1
AGAIN:
MOVDX,CX
ANDBL,BL
JEEXIT
XORBL,BL
XORSI,SI
AGAIN1:
MOVAX,ARRAY[SI]
CMPAX,ARRAY[SI+2]
JLENCHG
XCHGARRAY[SI+2],AX
MOVARRAY[SI],AX
MOVBL,-1
NCHG:
INCSI
INCSI
DECDX
JNZAGAIN1
LOOPAGAIN
EXIT:
INT20H
CODEENDS
ENDMAIN
实验步骤
1、输入,汇编并连接此程序。
忽略连接时的无堆栈告警。
2、用EXE2BIN将.exe文件转换为.COM文件。
命令格式:
EXE2BIN?
?
?
.EXE?
?
?
.COM
3、在DEBUG下运行此程序,记录运行结果。
4、将转移指令JLE改为JBE,JGE和JAE,分别运行并记录排序结果。
实验十音乐程序
实验目的
1、掌握PC机发音原理及音乐程序编制方法。
2、8088指令:
IN,OUT,DIV,OR。
实验类型:
验证
实验内容
一、发音程序
1、用DEBUG输入下列程序:
MOVDX,4000H
INAL,61H
ANDAL,FCH
LOP:
XORAL,02H
OUT61H,AL
MOVCX,0140H
DEY:
LOOPLOP
DECDX
JNELOP
INT21H
INT20H
2、在DEBUG下运行此程序,改变延时时间常数,注意声音高低变化。
二、音乐程序
1、输入,汇编,连接并运行下列程序:
STACKSGSEGMENTPARASTACK
DW32DUP(?
)
STACKSGENDS
DATASGSEGMENT
TIGERDB0AH,0DH,'TWOTIGER$'
TIG_FREQDW2DUP(262,294,330,262)
DW2DUP(330,349,392)
DW2DUP(392,440,392,349,330,262)
DW2DUP(294,196,262),0FFFFH
TIG_TIMEDW10DUP(25),50,25,25,50
DW2DUP(12,12,12,12,25,25)
DW2DUP(25,25,50)
DATASGENDS
CODESGSEGMENT
ASSUMECS:
CODESG,DS:
DATASG,SS:
STACKSG
START:
MOVAX,DATASG
MOVDS,AX
LEADX,TIGER
MOVAH,9
INT21H
LEASI,TIG_FREQ
LEABP,DS:
TIG_TIME
CALLPLAY
MOVAH,4CH
INT21H
PLAYPROC
FREQ:
MOVDI,[SI]
CMPDI,0FFFFH
JEEND_PLY
MOVBX,DS:
[BP]
CALLSOUND
ADDSI,2
ADDBP,2
JMPFREQ
END_PLY:
RET
PLAYENDP
SOUNDPROC
MOVAL,0B6H
OUT43H,AL
MOVDX,14H
MOVAX,4F38H
DIVDI
OUT42H,AL
MOVAL,AH
OUT42H,AL
INAL,