实验汇编实验报告.docx
《实验汇编实验报告.docx》由会员分享,可在线阅读,更多相关《实验汇编实验报告.docx(40页珍藏版)》请在冰点文库上搜索。
![实验汇编实验报告.docx](https://file1.bingdoc.com/fileroot1/2023-6/22/4611b846-55de-46db-985c-65740cc88894/4611b846-55de-46db-985c-65740cc888941.gif)
实验汇编实验报告
【关键字】实验
实验一汇编程序的汇编及运行
1.实验目的和要求
(1)熟悉汇编程序的汇编、连接、执行过程
(2)生成LST文件,查看LST文件
(3)生成OBJ文件,修改语法错误
(4)生成EXE文件
(5)执行
2.实验环境
IBM—PC机及其兼容机
实验的软件环境是:
操作系统:
DOS2.0以上;调试程序:
DEBUG.COM;文本编程程序:
EDIT.EXE、WPS.EXE;宏汇编程序:
MASM.EXE(或ASM.EXE);连接装配程序:
LINK.EXE;交叉引用程序:
CREF.EXE(可有可无)。
3.实验内容及实验数据记录
(1)将数据段输入,取名1.txt,保存在MASM文件夹下。
生成LST文件,(不必连接、运行)用EDIT查看1.LST文件。
试回答:
DA1,DA2的偏移量分别是多少?
COUNT的值为多少?
DATASEGMENT
ORG20H
NUM1=8
NUM2=NUM1+10H
DA1DB‘IBMPC’
DA2DB0AH,0DH
COUNTEQU$-DA1
DATAENDS
END
(2)输入有错误的文件,修改错误语句。
(MASM没有出现错误即可。
不
必连接、运行。
)
DATASEGMENT
VAR1DB0,25,ODH,300
VAR2DB12H,A4H,6BH
VAR3DB’ABCDEF’
VAR4DW1234H,5678H
VAR5DW10HDUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DE:
DATA
BEINGMOVAX,DATA
MOVDS,AX
LEASI,VAR5
MOVBX,OFFSETVAR2
MOV[SI],0ABH
MOVAX,VAR1+2
MOV[BX],[SI]
MOVVAR5+4,VAR4
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
(3)输入正确的程序,汇编、连接、运行
STACKSSEGMENTSTACK
DW128DUP(?
)
STACKSENDS
DATASSEGMENT
STRINGDB‘WELCOME!
’,13,10,‘$’
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
LEADX,STRING
MOVAH,9
INT21H
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
1.算法描述及实验步骤
1.
(1)生成1.st文件
(2)用EDIT查看文件
2.修改后正确算法:
DATASEGMENT
VAR1DB0,25,0DH,30
VAR2DB12H,0A4H,6BH
VAR3DB'ABCDEF'
VAR4DW1234H,5678H
VAR5DW10HDUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
BEING:
MOVAX,DATA
MOVDS,AX
LEASI,VAR5
MOVBX,OFFSETVAR2
MOVbyteptr[SI],0ABH
MOVAL,VAR1+2
MOVAX,[SI]
MOV[BX],AX
MOVAX,VAR4
MOVVAR5+4,AX
MOVAH,4CH
INT21H
CODEENDS
ENDBEING
5.调试过程
1.程序没有错误,结果:
2.程序运行出现错误:
问题及改正:
(1).2.asm
(2):
errorA2009:
Symbolnotdefined:
ODH表示没有定义ODH;
出错语句VAR1DB0,25,ODH,300,这里的ODH应该为16进制数的0DH。
修改后仍提示错误,因为300越界,可改为30。
(2).2.asm(3):
errorA2009:
Symbolnotdefined:
A4H没有定义A4H这个变量
出错语句“VAR2DB12H,A4H,6BH”16进制中字母开头的16进制数开头必须加上“0”,所以必须在A4H之前加0.,将其改为0A4H。
(3).2.asm(9):
errorA2009:
Symbolnotdefined:
DS是存储代码段的,所以将DE改为DS。
(4).2.ASM(10):
errorA2105:
Expected:
instructionordirective;问题:
这是符号的漏写了,语句“BEINGMOVAX,DAT”中BEING后面漏了“:
”,所以应加上“:
”。
(5).2.asm(14):
errorA2035:
Operandmusthavesize没有指明大小
出错语句“MOV[SI],0ABH”立即数存入内存中,必须指明大小;所以必须在[SI]前加入byteptr改为“MOVbyteptr[SI],0ABH”
(6).2.asm(15):
errorA2068:
Cannotaddresswithsegmentregister
出错语句“MOVAX,VAR1+2”VAR1的地址+2后只占8位空间,而AX寄存器为16位,所以位数不匹配,应该把AX改为AL或者AH这些8位的寄存器。
(7).2.asm(16):
errorA2052:
Improperoperandtype
出错语句“MOV[BX],[SI]”MOV指令不允许两个内存单元之间的直接操作,需要引入一个通用寄存器AX作为中介,修改后“MOVAX,[SI]
MOV[BX],AX”
(8).2.asm(17):
errorA2052:
Improperoperandtype这个问题与上面那个相同,修改方式也同上。
修改为:
“MOVAX,VAR4
MOVVAR5+4,AX”
(9).asm(21):
errorA2009:
Symbolnotdefined:
START没有定义START
ENDSTART这里的END应该跟上面的BEING:
对应,所以可以把“ENDSTART”改为“ENDBEING”;或者将上面的“BEING”改为“START”
6.实验结果
1.程序正常运行,用EDIT查看1.lst文件得到题目要求数据:
2.修改后无错误,达到题目要求:
3.对文件进行汇编,连接产生3.exe文件
在DOS下运行,结果如下
7.总结
通过这次的实验让我初步的熟悉汇编程序的汇编、连接、执行等过程,对于汇编指令了解了不少。
在这次实验最主要是学会了如何找错,修改,查看结果等。
在改错过程中,基础知识是必不可少的,没有认真注意一些指令的常规用法、数据的转移等就会出现错误。
我们在书写程序指令的时候就要牢记指令的用法,不能每次都依靠电脑提示去找错,增加工作量。
实验二顺序程序设计
1.实验目的和要求
1.学习使用DEBUG的命令;
2.使用DEBUG命令在数据段中查看程序运行的结果;
3.利用DEBUG运行简单的程序段。
2.实验环境
实验的硬件环境是:
IBM—PC机及其兼容机
实验的软件环境是:
操作系统:
DOS2.0以上;调试程序:
DEBUG.COM;文本编程程序:
EDIT.EXE、WPS.EXE;宏汇编程序:
MASM.EXE(或ASM.EXE);连接装配程序:
LINK.EXE;交叉引用程序:
CREF.EXE(可有可无)。
3.实验内容及实验数据记录
1)输入程序观察寄存器变化
使用DEBUG,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器的内容变化。
注意用T命令执行时,CS:
IP寄存器的内容
MOVAX,4E20
ADDAX,1416
MOVBX,2000
ADDAX,BX
MOVBX,AX
ADDAX,BX
MOVAX,001A
MOVBX,0026
ADDAL,BL
ADDAH,BL
ADDBH,AL
MOVAH,0
ADDAL,BL
ADDAL,9C
2)下列程序单步运行,注意AL,BX,CX寄存器的变化,并观察数据段字母的变化。
DSEGSEGMENT
MSG1DB‘abc’
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
LEABX,MSG1
MOVCX,3
S:
MOVAL,[BX]
ANDAL,B;将AL中的ASCII码的第5位置0,
;变成大写字母。
MOV[BX],AL
INCBX
LOOPS
MOVAL,0
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
3)程序的跟踪执行操作
在DOS下直接输入文件主名就可以执行文件了,有的程序会显示结果,可能执行后什么结果都没有,是因为程序中没有显示命令。
那么如何查看程序的运行结果呢?
程序执行过程的跟踪操作步骤如下:
(1)在DOS下输入:
DEBUG文件名.EXE
(2)在DEBUG提示符下输入U命令
(3)可以用T命令单步执行指令,执行到MOVAH,4CH时结束,也可以用G命令执行整个程序,输入:
G=B地址(如:
G=0000)
(4)用D命令查看程序执行后数据段的变化
输入:
DK地址:
0(如:
D1260:
0)
在显示的数据中,对照源程序或LST文件查看结果所在的偏移地址的内容。
4)编写调试下面的程序,用DEBUG查看数据段中的结果
(1)
,X,Y,W为字节类型变量,结果存于Z单元,写出数据段和代码段。
(2)X,Y为字节类型数,求
,写出完整的数据段和代码段,不用乘除指令。
4.算法描述及实验步骤
题目2大写变小写算法:
DSEGSEGMENT
MSG1DB‘ABC’
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
LEABX,MSG1
MOVCX,3
S:
MOVAL,[BX]
ORAL,00100000B(或者用add的指令加上00100000即加上32)
MOV[BX],AL
INCBX
LOOPS
MOVAL,0
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
题目3:
步骤:
(1)在DOS下输入:
DEBUG4.EXE
(2)在DEBUG提示符下输入U命令
(3)输入:
G=0000
(4)用D1406:
0命令查看程序执行后数据段的变化
算法:
DSEGSEGMENT
MSG1DW7856H,2038H
MSG2DW?
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVAX,MSG1
ANDAX,MSG1+2
MOVMSG2,AX
MOVAL,0
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
题目4
(1)算法:
DSEGSEGMENT
XDB2h
YDB2h
WDB3h
ZDW?
TENDB10
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVBL,X
ADDBL,Y
MOVAL,W
SUBAL,X
IMULTEN
ADDAX,5
IDIVBL
MOVZ,AX
MOVZ+1,AX
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
4.2算法:
因为不能用乘除指令,所以改用移位指令来代替
DSEGSEGMENT
XDB5H
YDB4H
ZDB?
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVAL,X
ADDAL,Y
MOVCL,3
SALAL,CL
MOVBL,X
SUBBL,Y
SALBL,1
SUBAL,BL
MOVAH,AL
ANDAH,00001111B
MOVCL,4
SARAL,CL
MOVZ,AL
MOVZ+1,AH
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
5.调试过程
4.2
在移位中,所移位数大于一时必须用CL寄存器,不能直接写为“salax3”
改为“MOVCL,3
SALAL,CL”
因为不能用乘除指令,不能直接得出余数,要另加语句“MOVAH,AL
ANDAH,00001111b”
6.实验结果
实验一:
以下为T命令执行下的一段内容变化:
CS为代码段寄存器,不变;
IP为指针寄存器;读取一条指令后,IP中的值自动增加,以使CPU可以读取下一条指令。
比如读入“bb0020“指令长度为3字节,那么IP就自动加3,读入03c3,指令长度为2字节,IP自动加2;
实验二:
逐步运行结果如下:
以下为小写变大写,大写变小写的实验结果:
实验三:
按要求实验结果如下:
实验四:
4.1
以下为实验数据为x=2,y=2,w=3的时候的结果,结果商为3,余3;与正常结果无异
4.2
以下为实验数据为x=5,y=4的时候的结果,其中商为4,余6;与正常结果无异
7.总结
这次的实验主要是熟悉了程序执行过程的跟踪执行操作。
学习使用DEBUG命令,用DEBUG指令来查看指令的数据段的运行结果。
并通过T命令来查看各种寄存器的内容的变化。
而且通过这次实验,熟悉加减法指令,乘除指令和移位指令的使用,指令间的互相代替和转换。
实验三分支循环程序设计
1.实验目的和要求
1、学习调试程序,查找逻辑错误;
2、学习分支语句的编程和调试;
3、学习循环语句的编程和调试。
2.实验环境
实验的硬件环境是:
IBM—PC机及其兼容机
实验的软件环境是:
操作系统:
DOS2.0以上;调试程序:
DEBUG.COM;文本编程程序:
EDIT.EXE、WPS.EXE;宏汇编程序:
MASM.EXE(或ASM.EXE);连接装配程序:
LINK.EXE;交叉引用程序:
CREF.EXE(可有可无)。
3.实验内容及实验数据记录
1.有10个数,统计正数的个数,存放在变量M中中。
经过汇编后,形成EXE文件。
在DEBUG中,先用G=0命令执行程序,用D命令查看M单元的内容,会发现结果不正确。
用单步执行命令T=0,单步执行程序,查找程序中的逻辑错误,注意每一次循环中AL寄存器中值的变化是否正确。
(AL寄存器中存放正数的个数)
DSEGSEGMENT
MSGDB4,-2,-6,0,5,67,8,-3,5,6
MDB?
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVCX,10
MOVAL,0
LEASI,MSG
L1:
MOVBL,[SI]
CMPBL,0
JBENEXT
INCAL
NEXT:
INCSI
LOOPL1
MOVM,AL
MOVAL,0
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
2.数据段中是一组无符号数,将最小数存放在M单元中。
按上题方法查找一处逻辑错误。
DSEGSEGMENT
MSGDB13,15,7,25,24
MDB?
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVCX,4
MOVAL,MSG
MOVSI,OFFSETMSG+1
L1:
CMPAL,[SI]
JBNEXT
MOVAL,[SI]
NEXT:
LOOPL1
MOVM,AL
MOVAL,0
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
3.编程:
在首地址为BUF开始的内存单元中存有10个字节数,求其中0的个数,并将结果存于RESULT中。
4.编程:
,Ai,Bi为字节型无符号数,分别存于NUM1和NUM2开始的连续存储单元中,结果存于REST单元中。
4.算法描述及实验步骤
⑴算法:
DSEGSEGMENT
MSGDB4,-2,-6,0,5,67,8,-3,5,6
MDB?
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVCX,10
MOVAL,0
LEASI,MSG
L1:
MOVBL,[SI]
CMPBL,0
JlENEXT
INCAL
NEXT:
INCSI
LOOPL1
MOVM,AL
MOVAL,0
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
⑵算法:
DSEGSEGMENT
MSGDB13,15,7,25,24
MDB?
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVCX,4
MOVAL,MSG
MOVSI,OFFSETMSG+1
L1:
CMPAL,[SI]
JBNEXT
MOVAL,[SI]
NEXT:
INCSI
LOOPL1
MOVM,AL
MOVAL,0
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
⑶算法:
DATASEGMENT
BUFDB0,1,2,3,-4,5,0,0,6,7
MDB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAL,0
LEASI,BUF
MOVCX,10
LOP:
CMPBYTEPTR[SI],0
JNENEXT
INCAL
NEXT:
INCSI
LOOPLOP
MOVM,AL
MOVAL,0
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
⑷算法:
DATASEGMENT
NUM1DB1,2,3,4,5,6,7,8
NUM2DB1,2,3,4,5,6,7,8
RESTDW?
DATAENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVCX,8
MOVBX,0
MOVSI,OFFSETNUM1
MOVDI,OFFSETNUM2
JISUAN:
MOVAL,[SI]
MULBYTEPTR[DI]
ADDBX,AX
INCDI
INCSI
LOOPJISUAN
MOVREST,BX
MOVAL,0
MOVAL,4CH
INT21H
CSEGENDS
ENDSTART
5.调试过程
1.运行得出结果有错,应该只有6个正数
逐步运行:
在逐步输入中发现,在数据为-2时,执行ALJBENEXT这句指令本来应该跳转到NEXT,当是指令仍然执行AL加1操作,由此发现错误,由于JBE是无符号位的比较,所以会自动将负数转为正数比较,导致结果错误。
所以将JBE改为JLE,重新调试,没有发现错误,结果正确。
2.出现错误,最小数应为7,而答案却为13
逐步运行:
在调试的过程中发现错误,我们可以很清晰的从上图发现,在逐步调试中SI的值都没有发生变化,这样就导致了比较出现了错误,循环并没有按要求执行,只是13和15的不断比较,所以最后只能出现得出13
经检查发现,在NEXT:
中少了SI加一的操作,所以在NEXT:
后面加上INCSI;
后,程序正确运行得出结果.。
SI正常变化如图:
4.实验调试都正确,不知道为什么不能执行G命令,不过可以用T命令取得结果
6.实验结果
1.修改后运行,结果正确,测试数据为:
4,-2,-6,0,5,67,8,-3,5,6。
所以最后结果为6个正数
2.修改后运行,结果正确,测试数据为:
13,15,7,25,24,所以比较后最小数为7:
3.程序运行结果正确,测试数据为0,1,2,3,-4,5,0,0,6,7,所以结果为3
4.程序运行结果正确,测试数据为NUM1DB1,2,3,4,5,6,7,8
NUM2DB1,2,3,4,5,6,7,8