汇编语言 实验报告文档格式.docx
- 文档编号:17863037
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:13
- 大小:20.88KB
汇编语言 实验报告文档格式.docx
《汇编语言 实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《汇编语言 实验报告文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
在以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>
=下一个数,不交换
否则交换,大数在AL中
NEXT1:
CMPBL,[SI];
最小数与下一个单元数比较
JLNEXT;
最小值比较小,BL<
否则交换,小数放BL中
NEXT:
目标操作数加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<
B或A=B。
STR1DB'
B'
'
$'
DB定义数据字节命令p185页,若字节是字符串,必须用‘’,
STR2DB'
A<
以$字符结束
STR3DB'
A=B'
CODESEGMENT;
CODE,DS:
DATA
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
JMPEXIT;
JMP无条件转移指令,p139页,转EXIT
GOTO1:
MOVDX,OFFSETSTR1;
回车换行显示字符串STR1
INT21H
JMPEXIT;
JMP无条件转移指令,转EXIT
GOTO2:
MOVAH,09H
MOVDX,OFFSETSTR2;
回车换行显示字符串STR2
EXIT:
MOVAH,4CH;
CODEENDS;
A输入4,B输入1,结果显示A>
B;
A输入4,B输入7,结果显示A<
A输入4,B输入4,结果显示A=B;
习题4.33:
将count开始存放的n个字节的字符串,统计相同字符的字符个数,找出相同字符最多的字符,存于CORE单元中(p243页)
ABCDBBBBDFDSASNMMSWA'
;
定义字符串
CHARDB?
?
表示仅分配1个储存单元,并不存入如何数据
NUMDB0;
定义一个变量num并初始化其内存单元,统计相同字符的字符个数
MOVSI,OFFSETSTR1;
字符串STR1偏移地址
取第一个数放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;
放相同字符的字符个数
放字符
INCSI;
指向下一个数据
CMPSI,OFFSETCHAR;
比较相同字符个数是否相同
JZEXIT;
结果为零,转EXIT
取字符串中的字符放AL中,放AL
CMPAL,0;
比较AL与0
JZNEXT;
JNZCOUNT;
结果不为零,转COUNT
DOS系统功能调用,p201页
此题找到相同字符最多的字符B,存于CORE单元。
附加题:
例4.1(p173页)要求把3个16位数相加,其和仍为16位数。
NAMEADDHEX
STACKSEGMENTSTACK'
STACK'
STAPNDB100DUP(?
定义堆栈段的100个字节的连续存储区
TOPEQULENGTHSTAPN;
定义符号TOP,其数值为堆栈区长度
定义堆栈段结束
NUM1DW1234H;
定义16位数1234H,放在变量NUM1中
NUM2DW5678H;
定义16位数5678H,放在变量NUM2中
NUM3DW0ABCDH;
定义16位数ABCDH,放在变量NUM3中
ANSDW?
定义变量ANS,存放相加之和
定义数据段结束
MOVSP,TOP;
堆栈指针赋值
MOVAX,NUM1;
取被加数
ADDAX,NUM2;
第一个数和第二个数相加,和放在AX中
ADDAX,NUM3;
再加上第三个数,和放在AX中
MOVANS,AX;
存三个数相加之和
例4.6(p212页)编写计算Z=(X^2-3*Y)/2的程序。
设X、Y均为单字节整数,结果Z仍为1个字节。
DATASEGMENT
XDB25
YDB32
ZDW?
DATAENDS
CODESEGMENT
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
考虑进位
SUBAX,BX;
X^2-3*Y
SHRAX,1;
(X^2-3*Y)/2
MOVZ,AX;
保存结果
MOVAH,4CH
返回DOS
CODEENDS
汇编结束
例4.7(p213页)在存储变量DAT1开始有两个字节的无符号加数,在存储变量DAT2开始有两个字节的无符号被加数,求两个数的和并放在DAT3单元中,设二进制数在存储单元存放的顺序为,低字节在低地址上,高字节在高地址上。
NAMEMYPROG
DAT1DB5EH,89H
DAT2DB40H,0ABH
DAT3DW?
CODE,DS:
DATA
MOVAX,DATA
MOVDS,AX
MOVSI,0;
位移量初值
MOVAL,DAT1[SI];
取被加数低位5EH
ADDAL,DAT2[SI];
两数相加40H+5EH
MOVDAT3[SI],AL
加1指令,调整位移量
MOVAL,DAT1[SI];
取被加数高位89H
ADCAL,DAT2[SI];
带进位加
MOVDAT3[SI],AL
MOVAH,4CH
ENDSTART
大小写互换
BEFOREDB'
Beforechange:
'
0DH,0AH,'
AFTERDB'
Afterchange:
BUFDB'
CHANGEasdaAJBHBJBabA'
BEGIN:
MOVDS,AX
MOVDX,OFFSETBEFORE
MOVAH,09H
INT21H
MOVDX,OFFSETBUF
MOVCL,14H
MOVSI,OFFSETBUF
LOOP1:
MOVAL,[SI]
CMPAL,'
A'
JBJ
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
MOVDX,OFFSETBUF
MOVAH,01H
INT21H
MOVAH,4CH
ENDBEGIN
5实验总结
汇编语言是一种符号语言,用助记符表示操作码,用符号或符号地址表示操作数或操作数地址,它与机器指令是一一对应的。
1.汇编语言程序结构
基本程序结构有三种:
顺序结构、分支选择结构和循环结构。
P212页
<
数据定义伪指令序列>
》源程序由若干条语句组成
DATAENDS》程序由最多4个段组成,
STACKSEGMENTSTACK数据段、堆栈段、代码段、附加段
数据定义伪指令序列>
》每个段有一名字,
STACKENDS并以符合SEGMENT表示段的开始,
CODESEGMENT以END作为段的结束符号
程序段>
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:
DEBUGTT.COM
DEBUG
第一句是启动DISKCOPY文件,执行从A:
拷贝到B:
的操作。
第二句是调试TT.COM程序。
第三句是启动DEBUG,不装入文件。
DEBUG装入内存后,接着就从磁盘上查找被调试的程序,找到后将其装入内存(对于后缀为EXE的文件,DEBUG将它装入到最低可用的区段中,并从100H开始装入),然后显示出提示符“一”。
等待用户进一步输入命令。
DEBUG命令中使用的地址格式约定如下:
[<
段地址>
:
]<
位移量>
其中<
可以是段寄存器名,或者是十六进制数,也可以默认。
例如:
CS:
0100
2212:
而地址范围的格式为:
<
始位移量>
末位移量>
或
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程序,返回操作系统状态。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 实验报告 实验 报告