汇编实验报告汇编程序的汇编及运行顺序程序设计分支循环程序设计子程序设计dos功能调用.docx

上传人:b****5 文档编号:6432661 上传时间:2023-01-06 格式:DOCX 页数:73 大小:1.20MB
下载 相关 举报
汇编实验报告汇编程序的汇编及运行顺序程序设计分支循环程序设计子程序设计dos功能调用.docx_第1页
第1页 / 共73页
汇编实验报告汇编程序的汇编及运行顺序程序设计分支循环程序设计子程序设计dos功能调用.docx_第2页
第2页 / 共73页
汇编实验报告汇编程序的汇编及运行顺序程序设计分支循环程序设计子程序设计dos功能调用.docx_第3页
第3页 / 共73页
汇编实验报告汇编程序的汇编及运行顺序程序设计分支循环程序设计子程序设计dos功能调用.docx_第4页
第4页 / 共73页
汇编实验报告汇编程序的汇编及运行顺序程序设计分支循环程序设计子程序设计dos功能调用.docx_第5页
第5页 / 共73页
点击查看更多>>
下载资源
资源描述

汇编实验报告汇编程序的汇编及运行顺序程序设计分支循环程序设计子程序设计dos功能调用.docx

《汇编实验报告汇编程序的汇编及运行顺序程序设计分支循环程序设计子程序设计dos功能调用.docx》由会员分享,可在线阅读,更多相关《汇编实验报告汇编程序的汇编及运行顺序程序设计分支循环程序设计子程序设计dos功能调用.docx(73页珍藏版)》请在冰豆网上搜索。

汇编实验报告汇编程序的汇编及运行顺序程序设计分支循环程序设计子程序设计dos功能调用.docx

汇编实验报告汇编程序的汇编及运行顺序程序设计分支循环程序设计子程序设计dos功能调用

福建农林大学东方学院

信息工程类

 

实验报告

 

课程名称:

汇编语言

姓名:

廖少兵

系:

计算机系

专业:

电子信息工程

年级:

2010

学号:

1050302103

指导教师:

职称:

 

2012年6月17日

福建农林大学东方学院信息工程类实验报告

系:

计算机系专业:

电子信息工程年级:

10

姓名:

廖少兵学号:

**********实验课程:

汇编语言

实验室号:

_______实验设备号:

实验时间:

指导教师签字:

成绩:

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

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

4.操作方法及实验步骤

编写各代码并存储为源程序asm文件,对其进行汇编、连接。

1、Dos进入masm目录

2、masm文件名(对文件进行编译)

3、link文件名(对生成OBJ目标文件进行连接)

4、由dos加载连接后生成的可执行文件来执行程序

5.实验数据处理和分析

(1)

(2)如图输入代码编译未能通过,提示出错有9处

其中2、3、9行均为符号未定义错误,其中修改ODH中O在十六进制中未定义(不存在)、而A4H以字母开头必须添上数字0)、寄存器中没有DE故而修改之。

第十行我们暂且放着,第十四行提示说操作数必须指定大小空间由代码可知,立即数ABH传给内存单元时,必须指定内存大小空间,所以可修改该句为MOVBYTEPTR0ABH。

而15行的错误提示与17行一样均不能找到段寄存器所分配的地址,15行从代码格式上看除了位数不一致外并不是如是的所提错误,而17行是错在两个立即数作为MOV指令的操作数,我们先跳过。

下面16行的错误是非法错误的操作数格式,这里两个操作数均是内存单元里的数据,可修改【BX】为BX。

由21行错误可知START未定义,之前程序入口中出现了标识符BEING,因此这里改为BEING。

同时可知刚刚第十行错误就显而易见了,标识的格式错了。

应该为BEING:

部分修改后代码如下:

重新编译得如下错误提示第2行中300超出了所分配的看空间字节大小,

这里把它改为30,比较之前的出错提示17行和15行的均改变了,这才具体指出了出错原因。

这里15行我们就修改AX为AL,匹配两操作数位数。

17行中我们为不改变原意可以用如下指令替代:

MOVCX,VAR4;MOVVAR5+4,CX;

(3)编辑源程序后编译未能通过,提示如图:

我们打开源程序看到如图所示:

我们之前定义的是DATAS而不是DATAX,修改之。

编译通过,我们link进行连接如图:

已生成可执行文件3.exe。

6.实验结果

(1)编辑源程序后编译生成list文件提示时输入文件名得到1.list文件。

打开如图得知:

DA1、DA2的偏移量分别是0020H和0026H。

(2)通过以上调试分析,最终修正代码,如图已能通过编译。

(3)运行3.exe文件,结果如图:

7.总结,质疑,建议,问题讨论

通过此次上机实验进行从编辑源程序到最终的可执行文件的生成并运行。

加深了我对程序编译连接运行程序的整个过程的理解,而其中的编译过程让我看到了一个不显眼list文件对之后查错,核实各个指令运行的正确性应该说是程序员的理解与系统处理是否存在出入的重要性,其次让我更加懂得去读懂出错提示,根据提示定位代码的错误之处并修正,再者从实验中发现了重要的一点,要让编译器给出正确或说是更确切的指示,我们应该先保证自己编写的代码语法上的严谨与规范,如17行与15行的错误提示由于程序入口标识符的错误定义而受影响的情况。

 

实验二顺序程序设计

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,11011111B;将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)输入下面程序,按实验一和上面步骤运行一遍

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

5)编写调试下面的程序,用DEBUG查看数据段中的结果

(1)

,X,Y,W为字节类型变量,结果存于Z单元,写出数据段和代码段。

(无符号数)

(2)X,Y为字节类型数,求

,写出完整的数据段和代码段,不用乘除指令。

(无符号数)

4.操作方法及实验步骤

1)

(1)、dos进入debug环境,输入a进行程序段写入内存操作,如图:

(2)、输入t单步运行跟踪观察到各寄存器的变化如图:

(3)、在执行第一条指令MOVAX,4E20后寄存器AX内容随即变为4E20,而当执行第二条指令ADDAX,1416后AX变为了6236,运行随后的指令各寄存器的变化完全吻合程序段所实现的功能,并且不难看到IP由0103不断的增加,而CS保留为13A1不变。

2)

(1)、由文本编辑内容2中的程序段存为II2.txt文件,并masm编译link连接通过,如图:

3)&4)

(1)、文本编辑内容4中代码段保存为II4.txt,masm编译link连接通过:

(2)、d命令查看MSG2单元中存放的值,如图(执行ANDAX,MSG1+2后,未执行MOVMSG2,AX指令):

5)

(5-1)编写程序段如下:

(1)、分析题目可知数据段中有X、Y、W、Z和常数10、5,所以有:

DATADB5,10

XDB2

YDB8

ZDW?

WDB10

(2)、代码段中先执行(W-X)*10有:

MOVAL,W

SUBAL,X

CBW;之前误解为乘指令操作数需16位故而出现此错误。

MULDATA+1

之后加5结果除于X+Y有:

ADDAX,DB;DATA错输入为DB

MOVCL,X

ADDCL,Y

DIVCL

(3)、所以有最初代码如下(错误)

DSEGSEGMENT

DATADB5,10

XDB2

YDB8

ZDW?

WDB10

DSEGENDS

CSEGSEGMENT

ASSUMECS:

CSEG,DS:

DSEG

START:

MOVAX,DSEG

MOVDS,AX

MOVAL,W

SUBAL,X

CBW

MULDATA+1

ADDAX,DB

MOVCL,X

ADDCL,Y

DIVCL

CSEGENDS

ENDSTART

(5-2)编写程序段如下

(1)、分析题目可知数据段中有X、Y、Z和常数8、2、16,所以有:

DATADB8,2,16

XDB5

YDB3

ZDW?

(2)、代码段先实现(X+X)*8有如下:

MOVAL,X

ADDAL,AL;实现X+X

MOVCL,3

SHLAL,CL;逻辑左移3位实现乘8

实现(X-Y)*2有:

MOVBL,X

SUBBL,Y;实现X-Y

MOVCL,1

SHLBL,CL;逻辑左移1位实现乘2

实现分子部分(X+X)*8-(X-Y)*2:

SUBAL,BL

实现除于16并把结果送Z:

MOVCL,4

SHRAL,CL;逻辑右移4位实现除于16

MOVZ,AL

(3)、程序段通过编译并并成功链接,如图:

5.实验数据处理与分析

(1)、直接运行II2.exe文件可以看到dos窗口未显示任何信息,于是debugII2.exe文件跟踪执行,如图:

(2)、t命令单步运行观察到IP在不断得递增指向下一条指令:

执行第一和第二次时CX递减,可以看到CX=0002,CX=0001,'a'变为了大写'A,'b'变为了大写'B':

同理之后可以看到CX=0000时执行循环结束完成字符串大小写转换。

5-1)

(1)、编译未能通过如图:

(2)、修改未定义标识符DB为DATA,编译仍然出错:

(3)、操作数位数不一致,分析可知在执行(W-X)*10后结果存放在AX中为能满足除法指令要求被除数为字节时,默认隐含除数为(AX),于是修改代码段如下:

START:

MOVAX,DSEG

MOVDS,AX

MOVAL,W

SUBAL,X

MULDATA+1

MOVBX,AX;注1

MOVAL,DATA;注2

CBW;注3

ADDAX,BX;实际上注释的指令完全可以用ADDAL,DATA代替,之前是在多此一举,自己在给自己添麻烦。

MOVCL,X

ADDCL,Y

DIVCL

CSEGENDS

ENDSTART

(4)、最终编译连接成功如下:

(1)、debugII5b.exe跟踪程序,u反汇编可以看到数据段段地址为076A;再从lise文件中查看得Z得偏移量为0002,如图:

(2)、因此执行完程序段后可以看到AX=0704为即是AL=04,结果正确;

6.实验结果

1)对比之前我们程序段录入时前段显示的正是13A1且“:

”之后的数字和IP的变化一致,可知cpu在执行指令时是通过CS代码寄存器定位代码段所处内存单元和改变IP指令寄存器中的地址(偏移量)来具体指定所要执行的指令。

2)&3)程序段实现了转输入字符串转小写为大写的功能:

通过d命令跟踪到数据段的变化对比程序段可知通过该指令ANDAL,11011111B可知在原字符的ASCII码中的第五位逻辑与上‘0’其他为不变,其值相当于减小了25=32实现了小写到大写的转换,同理若要将大写转换为小写只需将该句改写成ORAL,00100000(加上25=32)即可。

4)查看list文件不难得知MSG2偏移地址为0004,如图:

执行MOVMSG2,AX指令后d查看1415:

0004即是MSG2单元内容为2010:

5-1)DEBUG查看到AX结果为0508即商为8余数为5如图:

由list可查看到z的偏移量为0004:

D076A:

0004命令查看到如图Z中为空,遗忘了将AX数据传送给了Z;

代码段中补充指令MOVZ,AX

执行d076A:

0004最终得到Z中结果0805即是商8余5,如图:

5-2)由之前操作后可执行d076A:

0002即可查看Z单元数据为04即是所求商如图:

7.质疑,建议,问题讨论,总结

实验中我掌握了编写简单的程序,并且高效得运用debug进行调试,有效地跟踪指令观察各指令所实现得功能,并熟练运用其查看数据段的内容。

在编写并调试程序得环节中,由于对指令得不熟悉导致了一些不必要得麻烦,如第五题1中得设计,由于对部分隐含寄存器操作的不确定使得在符号扩展方面上出现问题最后竟绕了个圈。

程序最终虽能通过编译并连接运行得到正确得结果,但总认为缺少些什么,如在对DS装入时AX的改变有可能对后面得指令造成影响,因而就必须对其装入后其他指令使用其前进行清零操作XORAX,AX。

而至于DOS的功能调用方面由于在这里对程序影响不大,同时略去

MOVAH,4CH;INT21H;的一个好处就是让我更好了解到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.实验内容及实验数据记录

6、有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

数据段中是一组无符号数,将最小数存放在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

 

7、编程:

在首地址为BUF开始的内存单元中存有10个字节数,求其中0的个数,并将结果存于RESULT中。

8、编程:

,Ai,Bi为字节型无符号数,分别存于NUM1和NUM2开始的连续存储单元中,结果存于REST单元中。

4.操作方法及实验步骤

1)编辑代码,编译连接均可通过,亦能正常运行。

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

查看list文件得知M单元偏移量为000A,如图:

g命令运行后,d命令查看(d1415:

000A)得知M中值为09即是正数有9个,显然是不正确的如图

2)同一编辑如下代码进行编译连接运行均正常;

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

IN

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

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1