实验汇编实验报告.docx

上传人:b****5 文档编号:14275617 上传时间:2023-06-22 格式:DOCX 页数:40 大小:36.49KB
下载 相关 举报
实验汇编实验报告.docx_第1页
第1页 / 共40页
实验汇编实验报告.docx_第2页
第2页 / 共40页
实验汇编实验报告.docx_第3页
第3页 / 共40页
实验汇编实验报告.docx_第4页
第4页 / 共40页
实验汇编实验报告.docx_第5页
第5页 / 共40页
实验汇编实验报告.docx_第6页
第6页 / 共40页
实验汇编实验报告.docx_第7页
第7页 / 共40页
实验汇编实验报告.docx_第8页
第8页 / 共40页
实验汇编实验报告.docx_第9页
第9页 / 共40页
实验汇编实验报告.docx_第10页
第10页 / 共40页
实验汇编实验报告.docx_第11页
第11页 / 共40页
实验汇编实验报告.docx_第12页
第12页 / 共40页
实验汇编实验报告.docx_第13页
第13页 / 共40页
实验汇编实验报告.docx_第14页
第14页 / 共40页
实验汇编实验报告.docx_第15页
第15页 / 共40页
实验汇编实验报告.docx_第16页
第16页 / 共40页
实验汇编实验报告.docx_第17页
第17页 / 共40页
实验汇编实验报告.docx_第18页
第18页 / 共40页
实验汇编实验报告.docx_第19页
第19页 / 共40页
实验汇编实验报告.docx_第20页
第20页 / 共40页
亲,该文档总共40页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

实验汇编实验报告.docx

《实验汇编实验报告.docx》由会员分享,可在线阅读,更多相关《实验汇编实验报告.docx(40页珍藏版)》请在冰点文库上搜索。

实验汇编实验报告.docx

实验汇编实验报告

【关键字】实验

实验一汇编程序的汇编及运行

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2