汇编语言 实验报告.docx
《汇编语言 实验报告.docx》由会员分享,可在线阅读,更多相关《汇编语言 实验报告.docx(13页珍藏版)》请在冰豆网上搜索。
汇编语言实验报告
大理大学
实验报告
课程名称:
微机原理与接口技术
学院:
工程学院
专业:
年级:
班级:
姓名:
羽卒兰cl学号:
指导教师:
2016年5月19日
大理学院教务处制
实验名称:
汇编语言实验
时间:
2016年5月19日
地点:
工科楼610
班组:
A组
教师评语
成绩
教师签名
实验报告
1 实验目的
熟悉汇编语言语法
熟悉8086常用指令
掌握BIOS中断调用及DOS功能调用
2 实验工具
硬件配置:
微机原理实验箱(众友)一台、计算机一台
软件环境:
TD、湖北众友
3实验内容和要求
例题4.11,习题4.32,习题4.33程序后面添加注释。
4实验方法及结果
例题4.11:
在以BLOCK开始的存储区域存放着100个字节的8位带符号数,在该存储区域内找出其中的最大数和最小数,分别放在MAX和MIN单元中,编程实现(p216页)。
分析:
100个8位带符号数,从第一个数开始逐个比较,搜索其中的大数和小数,因为其中字节长度已知,可以用个数作为循环控制的计数器。
那么,每次比较,得到一个大数和小数,循环完毕,即可找到最大数和最小数。
NAMEFOUND;模块名
DATASEGMENT;定义数据段
BUFDB-2,+5,+4,-8,-70,+45,+65,+36,-36,-89,+128,+45,+88,+21,-67,-32,+70,+34,+3;定义字节数据
COUNEQU$-BUF;数据个数
MAXDB?
;放最大值的存储单元
MINDB?
;放最大值的存储单元
DATAENDS;数据段结束
STACKSEGMENTSTACK;定义堆栈段
STRDB64HDUP(?
);堆栈段占64个单元
STACKENDS;堆栈段结束
MYCODESEGMENT;定义代码段
ASSUMECS:
MYCODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX;DS值为数据段首地址DATA,DS赋初值
MOVAX,STACK;SS值为数据段首地址STACK
MOVSS,AX;SS赋初值
MOVSP,LENGTHSTR;设堆栈段指针
MOVCX,COUN-1;实际比较次数
MOVSI,OFFSETBUF;建立地址指针
MOVAL,[SI];取第一个数放AL中,大数放AL
MOVBL,[SI];取第一个数放AL中,小数放BL
INCSI;INC加1指令,在书本p112页,目标操作数加1,取下一个数
LOP:
CMPAL,[SI];CMP比较指令,p114页,将目标操作数AL减
;源操作数[SI],其差值不送回目标操作数。
JGENEXT1;JGE大于或等于,p142页,AL>=下一个数,不交换
MOVAL,[SI];否则交换,大数在AL中
NEXT1:
CMPBL,[SI];最小数与下一个单元数比较
JLNEXT;最小值比较小,BL<=下一个数,不交换
MOVBL,[SI];否则交换,小数放BL中
NEXT:
INCSI;目标操作数加1,取下一个数
LOOPLOP;CX-1到CX,CX不等于0转LOP
MOVMAX,AL;存大数到MAX
MOVMIN,BL;存小数到MIN
MOVAH,4CH;DOS系统功能调用,p201页,
INT21H;结束本程序运行,返回DOS状态
MYCODEENDS;代码段结束
ENDSTART;整个源程序汇编结束
结果分析:
中间有两次比较判断,以便在每次循环中找到该次循环中的大数和小数,100个数比较99次,最后才找到大数放在MAX中,小数放在MIN中(p243页);
找到最大值是+128,放在MAX中,最小值是-89,放在MIN中。
习题4.32:
在键盘上输入两个字符存入A,B单元中,比较它们的大小,并在屏幕显示;A>B或A
DATASEGMENT;定义数据段
STR1DB'A>B','$';DB定义数据字节命令p185页,若字节是字符串,必须用‘’,
STR2DB'A
STR3DB'A=B','$'
DATAENDS;数据段结束
CODESEGMENT;定义代码段
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX;DS值为数据段首地址DATA,DS赋初值
MOVAH,01H;1号功能键调用(键盘输入并显示),等待标准输入设备(键盘)
;送入一个字符,并放到寄存器AL中
INT21H;AL中存放键盘输入字符的ASCII码,并在CRT屏幕上显示
MOVBL,AL;将AL寄存器中的数据放到BL寄存器中
MOVAH,01H
INT21H
CMPBL,AL;比较指令,将AL和BL寄存器中的数据进行比较
JGGOTO1;JG如大于,转移到GOTO1
JLGOTO2;JL如小于,转移到GOTO2
MOVAH,09H;9号功能键调用(屏幕显示字符串符号)
MOVDX,OFFSETSTR3;回车换行显示字符串STR3
INT21H
JMPEXIT;JMP无条件转移指令,p139页,转EXIT
GOTO1:
MOVAH,09H;9号功能键调用(屏幕显示字符串符号)
MOVDX,OFFSETSTR1;回车换行显示字符串STR1
INT21H
JMPEXIT;JMP无条件转移指令,转EXIT
GOTO2:
MOVAH,09H
MOVDX,OFFSETSTR2;回车换行显示字符串STR2
INT21H
EXIT:
MOVAH,4CH;DOS系统功能调用,p201页,
INT21H;结束本程序运行,返回DOS状态
CODEENDS;代码段结束
ENDSTART;整个源程序汇编结束
结果分析:
A输入4,B输入1,结果显示A>B;
A输入4,B输入7,结果显示A
A输入4,B输入4,结果显示A=B;
习题4.33:
将count开始存放的n个字节的字符串,统计相同字符的字符个数,找出相同字符最多的字符,存于CORE单元中(p243页)
DATASEGMENT;定义数据段
STR1DB'ABCDBBBBDFDSASNMMSWA';定义字符串
CHARDB?
;?
表示仅分配1个储存单元,并不存入如何数据
NUMDB0;定义一个变量num并初始化其内存单元,统计相同字符的字符个数
DATAENDS;数据段结束
CODESEGMENT;定义代码段
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX;DS值为数据段首地址DATA,DS赋初值
MOVSI,OFFSETSTR1;字符串STR1偏移地址
MOVAL,[SI];取第一个数放AL中,放AL
MOVCHAR,AL;返回参数AL
MOVAH,01H;1号功能键调用(键盘输入并显示)
COUNT:
MOVBX,SI;SI寄存器的个数传送到BX寄存器,计数
COUNT2:
INCBX;取BX寄存器的下一个
CMPBX,OFFSETCHAR;比较取的字符与BX中的字符是否相同
JZREPLACE;结果为零,转REPLACE
CMPAL,[BX];两个数比较
JNZCOUNT2;结果不为零,转COUNT2
INCAH;加1指令
MOVbyteptr[BX],0;取到BX里面数为0
JMPCOUNT2;无条件转移COUNT2
REPLACE:
CMPNUM,AH;比较相同字符的字符个数
JGNEXT;JG如大于,转移到NEXT
MOVNUM,AH;放相同字符的字符个数
MOVCHAR,AL;放字符
NEXT:
INCSI;指向下一个数据
CMPSI,OFFSETCHAR;比较相同字符个数是否相同
JZEXIT;结果为零,转EXIT
MOVAL,[SI];取字符串中的字符放AL中,放AL
CMPAL,0;比较AL与0
JZNEXT;结果为零,转EXIT
MOVAH,01H;1号功能键调用(键盘输入并显示)
JNZCOUNT;结果不为零,转COUNT
EXIT:
MOVAH,4CH;DOS系统功能调用,p201页
INT21H;结束本程序运行,返回DOS状态
CODEENDS;代码段结束
ENDSTART;整个源程序汇编结束
结果分析:
此题找到相同字符最多的字符B,存于CORE单元。
附加题:
例4.1(p173页)要求把3个16位数相加,其和仍为16位数。
NAMEADDHEX
STACKSEGMENTSTACK'STACK';定义堆栈段
STAPNDB100DUP(?
);定义堆栈段的100个字节的连续存储区
TOPEQULENGTHSTAPN;定义符号TOP,其数值为堆栈区长度
STACKENDS;定义堆栈段结束
DATASEGMENT;定义数据段
NUM1DW1234H;定义16位数1234H,放在变量NUM1中
NUM2DW5678H;定义16位数5678H,放在变量NUM2中
NUM3DW0ABCDH;定义16位数ABCDH,放在变量NUM3中
ANSDW?
;定义变量ANS,存放相加之和
DATAENDS;定义数据段结束
CODESEGMENT;定义代码段
ASSUMECS:
MYCODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX;DS值为数据段首地址DATA,DS赋初值
MOVAX,STACK;SS值为数据段首地址STACK
MOVSS,AX;SS赋初值
MOVSP,TOP;堆栈指针赋值
MOVAX,NUM1;取被加数
ADDAX,NUM2;第一个数和第二个数相加,和放在AX中
ADDAX,NUM3;再加上第三个数,和放在AX中
MOVANS,AX;存三个数相加之和
MOVAH,4CH;DOS系统功能调用,p201页
INT21H;结束本程序运行,返回DOS状态
CODEENDS;代码段结束
ENDSTART;整个源程序汇编结束
例4.6(p212页)编写计算Z=(X^2-3*Y)/2的程序。
设X、Y均为单字节整数,结果Z仍为1个字节。
DATASEGMENT
XDB25
YDB32
ZDW?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA;初始化DS
MOVDS,AX
MOVAL,X
MULAL;A=X^2,源操作数*AL送到AX里
MOVBX,0;把BX清零
MOVBL,Y
ADDBL,BL
ADCBH,0;处理前面BL+BL的进位
ADDBL,Y;3*Y
ADCBH,0;考虑进位
SUBAX,BX;X^2-3*Y
SHRAX,1;(X^2-3*Y)/2
MOVZ,AX;保存结果
MOVAH,4CH
INT21H;返回DOS
CODEENDS
ENDSTART;汇编结束
例4.7(p213页)在存储变量DAT1开始有两个字节的无符号加数,在存储变量DAT2开始有两个字节的无符号被加数,求两个数的和并放在DAT3单元中,设二进制数在存储单元存放的顺序为,低字节在低地址上,高字节在高地址上。
NAMEMYPROG
DATASEGMENT
DAT1DB5EH,89H
DAT2DB40H,0ABH
DAT3DW?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVSI,0;位移量初值
MOVAL,DAT1[SI];取被加数低位5EH
ADDAL,DAT2[SI];两数相加40H+5EH
MOVDAT3[SI],AL
INCSI;加1指令,调整位移量
MOVAL,DAT1[SI];取被加数高位89H
ADCAL,DAT2[SI];带进位加
MOVDAT3[SI],AL
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
大小写互换
DATASEGMENT
BEFOREDB'Beforechange:
',0DH,0AH,'$'
AFTERDB'Afterchange:
',0DH,0AH,'$'
BUFDB'CHANGEasdaAJBHBJBabA',0DH,0AH,'$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
BEGIN:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETBEFORE
MOVAH,09H
INT21H
MOVDX,OFFSETBUF
MOVAH,09H
INT21H
MOVCL,14H
MOVSI,OFFSETBUF
LOOP1:
MOVAL,[SI]
CMPAL,'A'
JBJ
CMPAL,'Z'
JABG
ADDAL,20H
JMPJ
BG:
CMPAL,'a'
JBJ
CMPAL,'z'
JAJ
SUBAL,20H
JMPJ
J:
MOV[SI],AL
INCSI
DECCL
JNZLOOP1
MOVDX,OFFSETAFTER
MOVAH,09H
INT21H
MOVDX,OFFSETBUF
MOVAH,09H
INT21H
MOVAH,01H
INT21H
EXIT:
MOVAH,4CH
INT21H
CODEENDS
ENDBEGIN
5实验总结
汇编语言是一种符号语言,用助记符表示操作码,用符号或符号地址表示操作数或操作数地址,它与机器指令是一一对应的。
1.汇编语言程序结构
基本程序结构有三种:
顺序结构、分支选择结构和循环结构。
P212页
DATASEGMENT
<数据定义伪指令序列>》源程序由若干条语句组成
DATAENDS》程序由最多4个段组成,
STACKSEGMENTSTACK数据段、堆栈段、代码段、附加段
<数据定义伪指令序列>》每个段有一名字,
STACKENDS并以符合SEGMENT表示段的开始,
CODESEGMENT以END作为段的结束符号
<程序段>
CODEENDS
ENDS
2.汇编语言上机操作步骤
(1)用编辑程序建立.ASM源文件;
(2)用宏汇编程序MASM等汇编源文件,生成.OBJ目标码文件;
(3)用连接程序LINK对目标码文件等模块进行连接,生成.EXE可执行文件;
(4)键入可执行文件名执行该文件,分析执行结果;
(5)用DEBUG等工具调试.ASM源程序,再汇编、连接、运行,直到得出正确结果。
为此,除了DOS系统软件和编辑程序外,还需要备置如下程序:
汇编程序masm.exe或asm.exe或tasm.exe等
连接程序link.exe或tlink.exe等
汇编调试程序等
交叉引用程序cref.exe符号索引文件处理程序等
3.汇编语言程序调试方法
DEBUG.COM程序是一个有效的动态调试工具,用于实现系统维护。
1、DEBUG的启动
DEBUG的启动格式如下:
DEBUG[<文件说明>][<参数>]
其中,文件说明指被调试的程序的全名,参数是该程序所涉及的参数,下面是几个启动DEBUG的例子。
C>DEBUGDISKCOPY.COMA:
B:
C>DEBUGTT.COM
C>DEBUG
第一句是启动DISKCOPY文件,执行从A:
拷贝到B:
的操作。
第二句是调试TT.COM程序。
第三句是启动DEBUG,不装入文件。
DEBUG装入内存后,接着就从磁盘上查找被调试的程序,找到后将其装入内存(对于后缀为EXE的文件,DEBUG将它装入到最低可用的区段中,并从100H开始装入),然后显示出提示符“一”。
等待用户进一步输入命令。
DEBUG命令中使用的地址格式约定如下:
[<段地址>:
]<位移量>
其中<段地址>可以是段寄存器名,或者是十六进制数,也可以默认。
例如:
CS:
0100
2212:
0100
而地址范围的格式为:
<段地址>:
<始位移量><末位移量>
或
<段地址>:
<始位移量>L<长度>
[例l]列写地址范围。
CS:
100100
2123:
100L10
2、退出DEBUG
当完成动态调试任务时,可使用Q命令。
格式如下:
Q
键入Q之后,自动退到DOS状态下。
3、DEBUG的主要命令
D,显示内存单元内容;U,反汇编命令;
R,显示与修改寄存器内容;E,修改内存单元内容;
A,汇编命令;T、P,单步执行指令;
G,连续执行指令;N,指定装入文件名或写入文件名;
L,装入N指定的文件;W,将指定内容写入N指定的文件;
Q,退出DEBUG程序,返回操作系统状态。