1、汇编语言实验指导书9汇编语言实验指导书计算机学院网络工程系201591 实验一 汇编语言上机环境及基本操作一、实验目的及要求1学习及掌握汇编语言源程序的书写格式和要求,明确程序中各段的功能和相互之间的关系。2熟练掌握在计算机上建立、汇编、连接、调试及运行程序的方法。二、实验内容 1汇编语言源程序的建立本例中给出的程序是要求编写3+5=8的程序,并把8存入AL或AX中。设定源程序的文件名为ABC.ASM 。(用任何一个种文本编辑器编写此程序,存盘) 或双击桌面的 “Masm for Windows 集成实验环境 2012.5”快捷文件图标,进入汇编语言集成开发环境DATAS SEGMENT ;此
2、处输入数据段代码 DATAS ENDSSTACKS SEGMENT ;此处输入堆栈段代码STACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART: MOV AX,DATAS MOV DS,AX ;=MOV AX ,3 ;自己写的代码Mov BX ,5 ;自己写的代码 ADD AX ,BX ;自己写的代码(只有3条);此处输入代码段代码;= MOV AH,4CH INT 21HCODES ENDS END START程序输入完毕后一定要将源程序文件存入盘中,以便进行汇编及连接,也可以再次调出源程序进行修改。2 将源程序文件汇
3、编成目标程序文件一般情况下,汇编程序MASM.exe的主要功能有以下3点:(1)检查源程序中存在的语法错误,并给出错误信息。(2)源程序经汇编后没有错误,则产生目标程序文件,扩展名为.OBJ。(3)若程序中使用了宏指令,则汇编程序将展开宏指令。3用链接程序link.exe生成可执行程序文件经汇编以后产生的目标程序文件(.OBJ文件)并不是可执行程序文件,必须经过链接以后,才能成为可执行文件(即扩展名为.EXE)。链接以后,便可以产生可执行程序文件(.EXE文件)。4程序的执行本程序当中没有编写输出部分代码,所以在屏幕上看不到程序执行的结果。我们可以采用调试程序DEBUG来进行检查,相关内容请参
4、见实验二。实验二 DEBUG调试程序的应用一、实验目的DEBUG.EXE程序是专门为分析、研制和开发汇编语言程序而设计的一种调试工具,具有跟踪程序执行、观察中间运行结果、显示和修改寄存器或存储单元内容等多种功能。它能使程序设计人员或用户触及到机器内部,因此可以说它是80X86CPU的心灵窗口,也是我们学习汇编语言必须掌握的调试工具。二、实验内容1在DEBUG环境下建立和汇编程序在DEBUG环境下用户可以直接建立汇编语言源程序,并可以进行编辑修改和调试。比如,在DEBUG下编写如下程序:MOV DL,33H ;字符3的ASCII码送DLMOV AH,2 ;使用DOS的2号功能调用INT 21H
5、;进入功能调用,输出3INT 20H ;BIOS中断服务,程序正常结束。该程序运行结果是在显示器上输出一个字符3。如果要输出其它字符,请改变程序中33H为相应字符的ASCII码。其中涉及DOS和BIOS功能调用。因为我们是在DOS的支持下运行汇编语言程序,所以一般情况下,不能轻易使用输入/输出指令直接通过端口输入输出,而必须使用DOS内部提供的子程序完成输入/输出。DOS功能调用就是为诸如此类的目的设置的。DOS功能调用要求在进入INT 21H调用前,首先将功能调用号送AH寄存器,并根据功能调用号准备初始数据。也就是说INT 21H的2号功能调用是输出DL寄存器中的字符。INT 20H是BIO
6、S中断服务,这一软中断用来正常结束程序。具体步骤如下:进入debug调试环境后,(1)输入程序并汇编_A 1000B03:0100 MOV DL,330B03:0102 MOV AH,20B03:0104 INT 2l0B03:0106 INT 200B03:0108“0B03:0100”类似这样的地址是系统自动提供的,不需用户输入。至此程序已输入完毕,并汇编成机器指令。现在用G命令运行程序如下:(2)运行程序_G3Program terminated normally如果现在想分析一下该程序的指令,可以用反汇编命令U作如下操作:(3)反汇编_U 100,1080B03:0100 B233 M
7、OV DL,330B03:0102 B402 MOV AH,020B03:0104 CD21 INT 210B03:0106 CD20 INT 200B03:0108(4)将机器指令程序送到起始地址为200H的若干单元,将输入指令复制到代码段的200单元,可进行如下操作:_E cs:200 B2,33,B4,02,CD,21,CD,20(5)执行机器指令程序_G=2003Program terminated normally三、常用DEBUG命令DEBUG命令是在命令提示符“_”下由键盘键入的。每条命令以单个字母的命令符开头,然后是命令的操作参数,操作参数与操作参数之间,用空格或逗号隔开,操作
8、参数与命令符之间用空格隔开,命令的结束符是回车键(ENTER)。命令及参数的输入可以是大小写的结合。Crtl+Break键可中止命令的执行。Crtl+NumLock键可暂停屏幕卷动,按任一键继续。所用的操作数均为十六进制数,不必写H。1汇编命令A格式: (1)A :(2)A :(3)A (4)A功能:汇编命令是将用户输入的汇编语言指令,汇编为可执行的机器指令。键人该命令后显示段地址和偏移地址并等待用户从键盘逐条键入汇编语言指令。每当输入一行语句后按“ENTER”键,输入的语句有效。若输入的语句中有错,DEBUG会显示“ Error”,要求用户重新输入,直到显示下一地址时用户直接键入回车键返回到
9、提示符“_”。其中(1)用指定段寄存器内容作段地址;(3)用CS内容作段地址;(4)以CS:100作地址。以后命令中提及的各种地址形式,均指(1)、(2)、(3)中A命令后的地址形式。2比较命令C格式:C ,其中是由指出的一片连续单元,或由 L 指定的。功能:从的起始地址单元起逐个与目标起始地址以后的单元顺序比较单元的内容,直至源终止地址为止。遇有不一致时,以的形式显示失配单元及内容。3显示内存单元命令D格式: (1)D (2)D (3)D其中(1)以CS为段寄存器;(3)显示CS:100为起始地址的一片内存单元内容。功能:该命令将显示一片内存单元的内容,左边显示行首字节的段地址:偏移地址,中
10、间是以十六进制形式显示的指定范围的内存单元内容,右边是与十六进制数相对应字节的ASCII码字符,对不可见字符以代替。4修改内存单元命令E格式: (1)E (2)E 其中是一个十六进制数,或是用引号(或”)括起来的字符串;是以逗号分隔的十六进制数,或是用或”括起来的字符串,或者是二者的组合。功能:(1)将指定内容写入指定单元后显示下一地址,以代替原来内容。可连续键入修改内容,直至新地址出现后键入回车为止;(2)将逐一写入由开始的一片单元中,该功能可以将由指定地址开始的连续内存单元中的内容,修改为单元内容表中的内容。例如:_E DS:30 F8,AB,”AB”该命令执行后,从DS:30到DS:33
11、的连续4个存储单元底内容将被修改为F8H,ABH,41H,42H。5填充内存命令F格式:F 功能:将单元内容表中的值逐个填入指定范围,单元内容表中内容用完后重复使用。例如:F 05BC:200 L 10 B2,XYZ,3C该命令将由地址05BC:200开始的10H(16)个存储单元顺序填充“B2,58,59,5A,3C,B2,58,59,5A,3C,B2,58,59,5A,3C,B2”6连续执行命令G格式: (1)G(2)G=(3)G=,其中(2)、(3)中的“=”是不可缺省的。功能:默认程序从CS:IP开始执行。程序从当前的指定偏移地址开始执行。从指定地址开始执行,到断点自动停止并显示当前所
12、有寄存器、状态标志位的内容和下一条要执行的指令。DEBUG调试程序最多允许设置10个断点。7跟踪命令T格式:T =功能:如果键入T命令后直接按“ENTER”键,则默认从CS:IP开始执行程序,且每执行一条指令后要停下来,显示所有寄存器、状态标志位的内容和下一条要执行的指令。用户也可以指定程序开始执行的起始地址。的缺省值是一条,也可以由指定执行若干条命令后停下来。例如:T该命令执行当前指令并显示所有寄存器、状态标志位的内容和下一条要执行的指令。又例如:T 10 该命令从当前指令开始执行10H条指令后停下来,所有寄存器、状态标志位的内容和下一条要执行的指令。8反汇编命令U格式: (1)U (2)U
13、 功能:反汇编命令是将机器指令翻译成符号形式的汇编语言指令。该命令将指定范围内的代码以汇编语句形式显示,同时显示地址及代码。注意,反汇编时一定确认指令的起始地址后再作,否则将得不到正确结果。地址及范围的缺省值是上次U指令后下一地址的值。这样可以连续反汇编。9执行过程命令P格式:P功能:执行一条指令或一个过程(子程序),然后显示各寄存器的状态。说明:该命令主要用于调试程序。它与跟踪命令T的作用类似,T命令是跟踪一条或多条指令,而P命令是执行一条指令(包括带重复前缀的数据串操作指令)或一个完整的过程(子程序)。例如:设有如下指令序列 : MOV AH,02H INT 21H :当要执行INT 21
14、H这条指令时,若用T命令进行跟踪,则进入INT 21H程序(DOS功能调用)后,需要数十次T命令才能返回当前程序;若采用P命令进行调试,则只执行INT 20H一条指令,执行完立即返回,给调试者的感觉好象是执行了一条普通指令一样。因此,当读者以后遇到CALL、INT n指令或带重复前缀的数据串操作指令时,若不想观察相应过程的详细执行过程,就可以用P命令。10显示命令R格式: (1)R(2)R 功能:显示当前所有寄存器内容、状态标志及将要执行的下一指令的地址(即CS:IP)、机器指令代码及汇编语句形式。其中对状态标志寄存器FLAG以状态标志位的形式显示,详见表2-1。表2-1 状态标志显示形式状态
15、标志位状态显示形式溢出标志OF有/无OV/NV方向标志DF减/增DN/UP中断标志IF开/关EI/DI符号标志SF负/正NG/PL零标志ZF零/非零ZR/NZ奇偶标志PF偶/奇PE/PO进位标志CF有/无CY/NC辅助进位标志AF有/无AC/NA键入该命令后将显示指定寄存器名及其内容,“:”后可以键入修改内容。键入修改内容后按“ENTER”键有效。若不需修改原来内容,直接按“ENTER”即可。例如:R AX11结束DEBUG返回DOS命令Q格式:Q功能:返回DOS提示符下。四、重新调试实验一的程序,看最终AX寄存器的值是多少? 实验三 简单算术运算程序设计一、实验目的1掌握数据传送和算术运算指
16、令的用法。2熟悉在PC机上建立、汇编、连接和调试程序的方法。3理解计算机中除法溢出的含义。二、实验内容1设W、X、Y、Z均为8位带符号数,要求完成计算表达式W=X+Y-Z。编程思路(仅供参考):该题目要求掌握运算中带符号数和无符号数运算的区别。本题目只考虑有符号数情况参考程序清单:ABC.ASMDATA SEGMENT X DB 1 ;x 单元存放数字1,以下类推 Y DB 4 Z DB 3 W DB ?,? ;预留2个单元,存放运算结果DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX , DATA MOV DS ,AX ;= M
17、OV AL , X ADD AL , Y ;x+y SUB AL ,Z ;x+y-z MOV W ,AL 存结果到W单元 ;=;=输出结果 MOV AH ,2 ;调用DOS中断INT 21H功能的2号子功能 ADD AL,30h ;个位数字变成数字字符, Mov dl,al INT 21H ;此3条语句输出数字的ASCII码;= MOV AH,4CH INT 21H CODE ENDS END START思考:1.如果运算结果大于等于10,显示的结果正确吗?如何解决?2.如果运算结果小于0,显示的结果正确吗?如何解决?实验四 汇编语言的输入输出一、实验目的1. 掌握数据传送和算术运算指令的用法
18、。2熟悉字符的输入输出。3理解计算机中除法溢出的含义。二、实验内容 改写实验三ABC.ASM,分以下6个问题进行编程1. 改写实验三ABC.ASM,把其中的X,Y,Z 都置空,代码如下 X DB ? Y DB ? Z DB ?2. 改为从键盘输入X,Y,Z的值,分别为1,4,3,输入单个字符的代码为:MOV AH , 1INT 21H ;调用INT 21H中的1号功能,输入单个字符,输入的字符的ASCII码值存放在AL寄存器中,分3次输入,然后再进行加、减运算,看看运算结果是否正确?如果不正确,如何解决?3.如果想让输入和输出的结果如下图所示,又该如何解决?4.如果想让输入和输出的结果如下图所
19、示,又该如何解决?5.在此基础上,把ABC.ASM程序改为下面的表达式,写出代码: W=(X+Y)*2-Z)/2 ;X,Y,Z,W均为8位数值6如果X,Y,Z,W均为16位数值,那么如何编写下面的表达式的代码?W=(X*Y)+5-Z*5)/2 实验五 分支结构程序设计一、实验目的 1掌握分支程序的结构及相关指令。 2掌握分支程序的设计,调试方法。 二、实验内容 1 在BUF和BUF+1、BUF+2单元分别放有一个无符号字节型数,编程序将其中最大数存入MAX单元,并在屏幕上显示(要求画出流程图)。 2 要求同上,只是比较的数为有符号数。 3将1000H单元开始的10个字节数,采用奇偶校验,将奇数
20、在前偶数在后仍存回原数据区。本实验要求在DEBUG调试状态下进行,包括汇编程序、运行程序、检查结果。4大写字母转换成小写字母程序算法分析:由ASCII码字符表可知,英文大、小写的26个字母的值的差为20H,因此欲将从键盘上输入的大写字母转换为相应的小写字母,只需将从键盘输入的大写字母的ASCII编码值加上20H即可。5已知两整数变量A和B,试编制完成下列功能的程序:若两数中一个是奇数,则将奇数送入ABUF单元中,偶数送入BBUF单元中。若两个数均为奇数,则两数分别加1,并存入原变量中。若两个数均为偶数,则两变量不变。算法分析:设义、B两变量预先存放在数据段的ABUF和BBUF的字节单元中,其值
21、分别为X和Y。解答这个题目的关键是如何判断一个数是奇数或是偶数,这只要判断一个数的最低位是0或是1就可以了。若是0,则为偶数,若为1,则为奇数,可以采用TEST指令和条件转移指令JZ来实现,6在内存中以BUF单元开始缓冲区中连续存放着10个学生的分数,试编制程序统计其中90一100分、80一89分、60一79分及60分以下者各有多少人,并把结果分别存放在S9、S8、S7和S6中。7试编制程序,从键盘输入学生成绩(A、B、C、D),自动汇总并显示各类分数的人数(假定各类分数的总人数在0一9之间)。若按下键,则停止输入 ;若按下A、B、C、D之外的其他键,则提示“INPUT ERR0R”信息。8应
22、用跳转表法完成下面要求的多路分支程序的设计:根据从键盘输入的参数值0一7,分别转向标号为1017的程序段中,1017程序段分别实现显示字符0一70。9统计一个有10人的班中,男、女生的人数各是多少。将统计的男生人数存入变量MANK中,女生人数存入变量WOMAN中。算法分析:男、女生的标志可用“0”、“1”字符来表示,并从键盘输入此标志。根据题意,总人数已知,在此范围下,对输入标志进行分类求和显然可用循环结构来完成。每循环一次使相应人数增1,而循环计数值减1,直至该计数值为0。可用CX作为循环计数值,用LOOP指令对循环条件进行判定。实验六 循环结构程序设计一、实验目的1掌握循环结构程序设计的方
23、法;2掌握数据块传送程序设计的方法;3掌握循环指令的应用。二、实验内容1编写程序实现将数据段STR1单元开始的20个字符移到STR2开始的存储区。假设STR1+20STR2,可以用串传送指令,也可以用MOV传送指令。 编程思路:该题目要求掌握单循环程序设计方法。为了实现指定功能,应从以下几个方面考虑:(1)数据串操作的起始位置从高地址还是从低地址开始。(2)确定使用串传送指令,还是用MOV指令。(1)确定循环程序的结构。2编制程序计算S=1+2+3+4+N直到和大于500为止,并将结果由屏幕上显示出来(N的值和最终的和的值)。其程序的逻辑框图如图3. 1所示,33000H内存单元开始的100个
24、字节存储单元全部清0。 本实验要求在DEBUG调试状态下进行,包括汇编程序、运行程序、检查结果。4编程在屏幕上显示10行相同字符串。5动态从键盘输入20个二位无符号数,找出其中最大数并显示。6动态从键盘输入20个二位无符号数,从小到大排序并显示。7设数据区有两个字节串,串1的长度为5,串2的长度为10。编程: 若串2的最后5个字符和串1相同,则置FLAG单元为“Y”,否则置为“N”。8编写打印如下图形程序01 02 1 03 2 1 04 3 2 1 05 4 3 2 1 06 5 4 3 2 1 07 6 5 4 3 2 1 08 7 6 5 4 3 2 1 09 8 7 6 5 4 3 2
25、 1 0实验七 子程序设计一、实验目的 1掌握子程序的定义和调用及参数传递的方法。 2 掌握子程序、子程序的嵌套、递归子程序的结构。 3 掌握子程序的设计、编制及调试。 二、实验内容 1对缓冲区中的一组字符的ASCII码加偶校验。要求画出流程图,编写程序。算法分析:每个字符的ASCII码为7位,占一个字节,其最高位为校验位。偶校验的含义为:校验位与7位字符位中的1的个数之和为偶数,这可用于字符正确与否的校验。例如:字符为1011011,其中1的个数为5,那么校验位填1,这样1的个数为6,即为偶校验。偶校验位的填入可作为子程序来设计,缓冲区的首址一般由主程序提供,可假设缓冲区中的字符个数由缓冲区
26、中的第一个字节给出。2用子程序调用实现在屏幕上显示10行相同的字符,要求显示字符串功能用子程序调用方法实现。3试编制计算N! (N0)的程序。N!=N*(N-1)*(N-2)*1,其递归定义如下: 0!=1, N!=N*(N-1)! (N1)4用子程序结构编写程序:从键盘输入一个二位十进制数的月份数(0112),然后显示相应的英文缩写名。5.编写一个子程序嵌套结构的程序模块,分别从键盘输入姓名及8个字符的电话号码,并以一定的格式显示出来。具体要求:主程序TELIST中包括以下功能(1)显示提示符INPUT_NAME:;(2)调用子程序INPUT_NAME输入姓名;(3)显示提示符INPUT T
27、ELEPHONE NUMBER:;(4)调用子程序Input_PHONE输入电话号码;(5)调用子程序PRINTLINE显示姓名及电话号码。子程序INPUT_NAME中包括以下功能(1)调用键盘输入子程序GETCHAR,把输入的姓名存放在INBUF缓冲区;(2)把INBUF中的姓名移入输出行OUTNAME。子程序Input_PHONE中包括以下功能(1)调用键盘输入子程序GETCHAR,把输入的8位号码存放在INBUF缓冲区;(2)把INBUF中的号码移入输出行OUTPHONE。子程序PRINTLINE中以下功能显示姓名及电话号码,格式为:NAME TEL实验八 显示程序设计一、实验目的 1
28、掌握软件延时程序的编写方法。 2 熟悉系统功能调用的方法。 3 掌握宏定义与宏调用的方法。 二、实验内容 1 编写在屏幕上每隔一秒连续显示字符09的程序。 编程提示: 为了使输出的字符之间有空格,在每一个循环中输出一个09的字符和一个空格。为了输出09,置寄存器BL初值为0,每循环一次使其增量。为了保证输出是十进制,增量后用DAA调整指令。由于输出为一位十进制数,用AND 0FH指令屏蔽高4位。 2用系统功能调用将HELLO由键盘输入,再从屏幕输出*HELLO*。3编程实现:每隔5.5S从键盘读一个字符,并将字符的ASCII码存入缓冲区,共读50个字符,利用INT 16H的0功能读取字符,返回
29、值在AL中。4利用自编中断INT 60H 实现在屏幕上显示10行相同字符。显示功能用INT 60H实现。实验九综合实验一、实验题目:显示学生名次表二、实验目的:进行汇编语言程序设计应用的综合性训练。综合运用汇编语言循环程序和子程序编程方法,巩固提高汇编语言程序设计能力应用水平。三、实验内容 实验内容: 编制一程序,要求接收从键盘输入的一个班的学生的学号、姓名、成绩,对学生的成绩进行排序,最后把学号、姓名、学生成绩、名次显示出来。 实验要求:1.必须画流程图。2.本程序涉及汇编语言的多重循环、子程序及宏,其中 成绩输入、计算学生名次、显示学生名次都分别用子程序,也可用宏处理。3.要求用菜单选择。具体
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1