汇编语言实验.docx
《汇编语言实验.docx》由会员分享,可在线阅读,更多相关《汇编语言实验.docx(28页珍藏版)》请在冰豆网上搜索。
汇编语言实验
一、实验项目名称
汇编语言程序上机过程
二、实验目的
熟练掌握汇编语言程序的编辑、调试和运行的过程和方法。
了解汇编语言程序的汇编、运行环境。
三、实验基本原理
1.掌握常用的编辑工具软件(如WORD、EDIT)、MASM和LINK的使用;
2.伪指令:
SEGMENT,ENDS,ASSUME,END,OFFSET,DUP;
3.利用的INT21H的1号功能实现键盘输入的方法;
四、主要仪器设备及耗材
PC微机
DOS操作系统或Windows操作系统
MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境
五、实验步骤
1.用用文字编辑工具(记事本或EDIT)将源程序输入,其扩展名为.ASM。
2.用MASM对源文件进行汇编,产生.OBJ文件和.LST文件。
若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。
3.用TYPE命令显示1产生的.LST文件。
4.用LINK将.OBJ文件连接成可执行的.EXE文件。
5.在DOS状态下运行LINK产生的.EXE文件。
即在屏幕上显示标题并提示你按键。
每按一键在屏幕上显示二个相同的字符,但小写字母被改成大写。
按ESC键可返回DOS。
若未出现预期结果,用DEBUG检查程序。
实验源程序:
datasegment
messagedb'Thisisasampleprogramofkeyboardanddisply'
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)程序运行结果:
(2)在DEBUG下调试:
反汇编操作:
分步调试:
七、实验总结
通过这次实验我在电脑上的实际操作和观看,以及问老师同学我了解汇编语言程序的编辑、调试和运行的过程方法和汇编语言程序的汇编、运行环境,掌握了简单的汇编语言程序编写与调试,以及在DOS状态下通过D命令、E命令、R命令、T命令、A命令、G命令,U命令、观察记个通用寄存器和标志寄存器具体结果和有关内存单元的内容。
这也是我明白了应该多上机实践,才能熟练的掌握个指令的作用,通过观察各寄存器的变化,了解程序的运行情况,这样才能很好的掌握书上的知识,不会有纸上谈兵的感觉。
一、实验项目名称
分支程序实验
二、实验目的
1、掌握分支程序的设计方法;
2、掌握利用DEBUG修改参数、检查结果的方法;
3、熟悉汇编语言源程序的编辑、汇编、连接及调试过程。
三.实验要求
1.编写一个程序,显示AL寄存器中的两位十六进制数
2.编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。
四、主要仪器设备及耗材
PC微机
DOS操作系统或Windows操作系统
MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境
五、实验步骤
1.用EDIT或其它编辑软件,编写.ASM源程序,例如HEXASC.ASM及DSPKEY.ASM。
2.对其进行汇编及连接,产生.EXE文件。
3.对.EXE文件进行调试运行。
(1)用DEBUG调试运行,学会修改AL内容的方法;
(2)对DSPKEY.EXE键入不同的字符,分别进行调试;
(3)在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
INT21H;显示低位ASCII码
MOVAH,4CH
INT21H
CODEENDS;返回DOS
ENDSTART
2、判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“C”;若是回车字符(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入:
;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
程序1的流程图:
程序2流程图:
六、实验数据及处理结果
程序1的运行结果:
程序2的运行结果:
程序1在DEBUG下的反汇编:
程序2在DEBUG下的反汇编:
七、实验总结
通过这次实验我了解了分支程序的设计方法,以及他的各种特点和作用,我下面总结一下他的特点如下:
1)顺序执行的程序称为顺序程序,其特点是每一条指令在执行过程中只被执行一次,可以在DOC中利用DEBUG修改参数、检查结果的方法;
2)分支程序的特点是运行方向是向前的,在某一种确定条件下,只能执行多个分支中的一个分支程序设计方法:
3)程序的分支一般用条件转移指令来实现,实现分支程序的设计方法是分析题意,确定算法,根据算法,画出程序框图。
根据框图编写程序。
上机调试程序。
4)分支程序设计中经常会遇到判断“相等”和“不相等”、“负”和“正”、“大于”和“小于”、“满足条件”和“不满足条件”等等。
这种判断使程序的流程不再是一条顺序执行的直线,而变为由两个或多个分支所组成的倒树型结构,其中每一个分支只有在满足条件时才被执行。
这次试验也加深了对汇编语言源程序的编辑、汇编、连接及调试过程的了解。
在以后的试验中我会更加的注重实际的操作。
一、实验项目名称
循环程序实验
二、实验目的
1.掌握循环程序的设计方法;
2.学会针对不同的问题,选用不同的组织循环的方法;
3.进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。
三.实验要求:
1.编写实验内容要求的两个程序;
2.写出调试以上程序,即修改程序参数,检查结果的操作方法;
3.熟悉源程序汇编、连接命令的使用方法即要回答的内容。
1.编写一个程序,显示BX寄存器中的两位十六进制数;
2.编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入。
四、主要仪器设备及耗材
PC微机
DOS操作系统或Windows操作系统
MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境
五、实验步骤
1.用EDIT或其它编辑软件,编写.ASM源程序,例如HEXASC.ASM及DSPKEY.ASM;
2.对其进行汇编及连接,产生.EXE文件;
3.对.EXE文件进行调试运行。
(1)用DEBUG调试运行,学会修改AL内容的方法;
(2)对DSPKEY.EXE键入不同的字符,分别进行调试;
(3)在MS-DOS下运行这两个.EXE文件。
程序1源程序:
编写一个程序,显示BX寄存器中的四位十六进制数:
;DISPHEX.ASM
CODESEGMENT
ASSUMECS:
CODE
START:
MOVBX,2B3EH
MOVCX,2
TO:
MOVAL,BH
MOVDL,BH
PUSHCX
MOVCL,4
SHRDL,CL
POPCX
CMPDL,9
JBENEXT1
ADDDL,7
NEXT1:
ADDDL,30H
pushax
MOVAH,2
INT21h;显示高位ASCII码
popax
MOVDL,AL
ANDDL,0FH
CMPDl,9
JBENEXT2
ADDDL,7
NEXT2:
ADDDL,30H
pushax
MOVAH,2
INT21H;显示低位ASCII码
popax
PUSHCX
movcl,8
SHLBX,CL
POPCX
LOOPTO
MOVAH,4CH
INT21H
CODEENDS;返回DOS
ENDSTART
程序2源程序:
判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“C”;若是回车字符(其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入:
;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
程序1流程图:
程序2流程图:
六、实验数据及处理结果
程序1运行结果:
程序2运行结果:
程序1在DEBUG下的反汇编:
程序2在DEBUG下的反汇编:
七、实验总结
通过这次试验使我了解了什么是循环程序,从而也更加了解汇编语言的编程原理,我对循环结构有了以下的特点。
1)循环程序是由循环初始部分,循环体,环结束部分组成,其中循环初始部分是为进入循环做必要的准备工作,循环体是程序中重复执行的程序段,由两部分组成:
2)循环工作部分:
用于执行程序的实际任务;循环参数修改及循环控制部分,控制循环次数的方法有计数控制循环,用条件控制循环和用逻辑变量控制循环,为进入下一次循环,修改地址指针、计数器内容等项参数;
3)检测循环是否已执行了规定的次数,从而确定继续循环还是结束循环。
循环结束部分是进行循环之后的处理。
从实验中可以了解根据循环的类型的不同,选用不同的组织循环的方法;循环体的结构依照问题的不同,可以选择 是先判断后处理还是先处理后判断,通过实验进一步熟悉利用DEBUG程序修改参数的方法,通过doc能检查和验证结果的正确性,
这次的实验是我更发现自己的不足也更加发现了汇编语言的难学,不过在以后的学习中我会更加努力学习的。
一、实验项目名称
子程序实验
二、实验目的
1.掌握主程序与子程序之间的调用关系及调用方法;
2.掌握子程序调用过程中近程调用与远程调用的区别;
3.掌握通过堆栈转送参数的方法。
三.实验要求:
1.第一个实验程序用子程序的近程调用实现。
由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。
实验过程中可以从堆栈的内容看到两个子程序的返回地址值。
由于是近调用,地址值只包括返回地址的段内偏移量。
在每个子程序的执行中,检查CS值是不变的。
2.第二个程序是利用远调用的方法调用子程序的。
在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。
子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。
3.第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。
一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。
有关该方法的原理此处不再介绍。
4.预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图;熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。
1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。
要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。
2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。
四、主要仪器设备及耗材
PC微机
DOS操作系统或Windows操作系统
MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境
五、实验步骤
1.编辑、汇编两个源程序,生成相应的可执行文件(.EXE)
2.用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。
特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。
3.检查程序执行的结果是否正确。
实验要求:
1.第一个实验程序用子程序的近程调用实现。
由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。
实验过程中可以从堆栈的内容看到两个子程序的返回地址值。
由于是近调用,地址值只包括返回地址的段内偏移量。
在每个子程序的执行中,检查CS值是不变的。
2.第二个程序是利用远调用的方法调用子程序的。
在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。
子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。
3.第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。
一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。
有关该方法的原理此处不再介绍。
4.预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图;熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。
程序1源程序:
;CONV.ASN
DATASEGMENT
BUFDB0ABH,0CDH,0DEH,01H,02H,03H
DB3AH,4BH,5CH,6FH
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVCX,10
LEABX,BUF
AGAIN:
MOVAL,[BX]
CALLHEXASC
INCBX
LOOPAGAIN
MOVAH,4CH
INT21H
HEXASCPROCNEAR
MOVDL,AL
PUSHCX
MOVCL,4
SHRDL,CL
POPCX
ALLDISP;显示高位HEX数
MOVDL,AL
ANDDL,0FH
CALLDISP
RET
HEXASCENDP
DISPPROC
PUSHAX
CMPDL,9
JBENEXT
ADDDL,7
NEXT:
ADDDL,30H
MOVAH,2
INT21H;显示
POPAX
RET
DISPENDP
CODEENDS
ENDSTART
程序2源程序:
;COUNTER.ASM
DATASEGMENT
chardb'b'
CHADB0dh,0ah,'b','$'
BUFDB50H,?
50HDUP(?
)
DATAENDS
STACKSEGMENTSTACK
DB200DUP(?
)
STACKENDS
MCODESEGMENT
ASSUMECS:
MCODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
LEADX,BUF
MOVAH,0AH
INT21H
LEASI,BUF
MOVCL,[SI+1]
MOVCH,0;CX中为字符串长度
INCSI
INCSI;SI指向串首址TABLE
MOVAl,CHAR
MOVAH,0;AX中为待查字符
PUSHSI
PUSHCX
PUSHAX;参数送堆栈
CALLCHECK
POPAX;统计个数在AL中
MOVDx,offsetCHA
pushax
MOVAH,9
INT21H
popax
MOVDL,AL
ANDDL,0FH
CMPDL,9
JBENEXT
ADDDL,7
NEXT:
ADDDL,30H
MOVAH,2
INT21H;显示统计个数
MOVAH,4CH
INT21H
MCODEENDS
SCODESEGMENT
ASSUMECS:
SCODE
CHECKPROCFAR
PUSHBP
MOVBP,SP
MOVSI,[BP+10]
MOVCX,[BP+8]
MOVAX,[BP+6]
XORAH,AH
AGAIN:
CMPAL,[SI]
JNENEXT1
INCAH
NEXT1:
INCSI
LOOPAGAIN
MOVAL,AH
MOV[BP+10],AX
POPBP
RET4
CHECKENDP
SCODEENDS
ENDSTART
六、实验数据及处理结果
程序1运行结果:
程序2运行结果:
七、实验总结
通过实验中我主要了解了子程序的作用用法以及怎样编写程序。
以下是对它的总结:
1)子程序是在实际编程中,常常回遇到功能完全相同的程序段,不在同一程序模块,或虽在同一模块而需重复执行,但又不是连续重复执行。
2)子程序是为了避免重复编制同一段程序,节省存储空间,把程序段独立开来,附加少量额外语句,将其编制成公用子程序,供程序其他地方需要时调用,子程序是由保护现场(一些将在子程序运行时将要被破坏的寄存器的内容)依入口参数从指定位置取要加工处理的信息,加工处理,依出口参数向指定位置送经加工处理后的结果信息,返回调用程序。
3)调用子程序时一般应增加如下功能语句,想指定位置送要加工处理的信息;调用子程序。
通过实验了解主程序与子程序之间的调用关系及调用方法和子程序调用过程中近程调用与远程调用的区别和通过堆栈转送参数的方法。
一、实验项目名称
排序程序设计
二、实验目的
掌握数据排序的一些常用算法,了解数列的有序、无序、升序和降序的概念。
三.实验要求:
1.复习排序的几个基本算法;
2.准备数据,按选择好的算法编写源程序。
数据以DW定义和键盘输入两种方法提供。
使用“冒泡排序”法,将内存中10个数据由小到大排序(每个数为16位二进制);
四、主要仪器设备及耗材
PC微机
DOS操作系统或Windows操作系统
MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境
五、实验步骤
内容:
使用“冒泡排序”法,将内存中10个数据由小到大排序(每个数为16位二进制)
1.将编写好的源程序输入,建立源程序文件且存盘;
2.汇编、连接和运行此程序;
3.运行成功后,将程序的数据区建立方式改为键盘输入,由小到大排序改为由大到小排序,修改后重新调试、运行;
4.记录并分析排序的效率。
实验源程序:
codesegment
org100h
assumecs:
code,ds:
code
main:
jmpstart
entdb0dh,0ah,'$'
arraydw1234h,5673h,7fffh,8000h,0dffh
dw0ab5h,0369h,005fh,5634h,9069h,'$'
countequ$-array
start:
movax,code
movds,ax
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:
movah,1
int21h