IBM汇编实验报告.docx

上传人:b****7 文档编号:10555584 上传时间:2023-02-21 格式:DOCX 页数:27 大小:26.07KB
下载 相关 举报
IBM汇编实验报告.docx_第1页
第1页 / 共27页
IBM汇编实验报告.docx_第2页
第2页 / 共27页
IBM汇编实验报告.docx_第3页
第3页 / 共27页
IBM汇编实验报告.docx_第4页
第4页 / 共27页
IBM汇编实验报告.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

IBM汇编实验报告.docx

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

IBM汇编实验报告.docx

IBM汇编实验报告

目录

实验一汇编语言上机过程5

实验二数据传送12

实验三顺序结构程序设计13

实验四分支结构程序设计14

实验五循环结构程序设计15

实验六代码转换17

实验七中断程序设计18

实验一汇编语言上机过程

一、上机前的软件准备:

MS-DOS操作系统(如:

MSDOS6.22,MSDOS7.0等)

文本编辑器(如:

EDIT.COM,TURBO.EXE,TC.EXE,C.EXE等)

汇编程序(如:

MASM.EXE,ASM.EXE,TASM.EXE等)

连接程序(如:

LINK.EXE等)

调试程序(如:

DEBUG.EXE等)

二、汇编程序建立过程:

                                                通过

   a.建立汇编源程序────→b.编译为目标文件──┬─→d.连接为可执行文件

   ↑                     ↓            ↓

  │       c.不通过,重新修改(语句错误)  │      │

  ├──────────────────────┘           │

  ↑   f.不正确,用调试工具调试,重新修改(逻辑错误)   ↓ 

  └────────────────────────────←e运行

                                ↓正确

                             g.完成

三、现在对

(二)的每一个标有字母的过程(PROCEDURE)进行详细说明

PROCEDUREa:

建立汇编源程序(即:

建立文件名.asm)

这个过程就相当于我们在纸上编写源程序代码一样,只不过是将纸变为了计算机,这个过程也称源代码录入。

将源程序代码录入计算机的方法很多,下面将介绍具体方法。

1.通过MD-DOS自带的EDIT.EXE文本编辑器进行输入,在DOS提示符下键入:

EDIT回车,这时如果你系统内可调用时,EDIT的操作画面便会出现在屏幕上,你就可在提示下进行录入了,当录入完毕后,选择存盘并给你输入的文件起一个文件名,形式:

filename.asm;(其中filename为你起的文件名,由1-8个字符组成),asm是为汇编程序识别而必须加上去的,不可更改。

存盘后在DOS下可用DOS命令DIR来查看,如果看到了所存的文件存在,就可以进行进程b。

2.如果你的系统中没有EDIT,也可用你所熟悉的文本编辑器进行录入、编辑,如可用c语言和pascal语言的文本编辑器来编辑,最后将文件存为filename.asm的形式即可。

PROCEDUREb:

编译目标文件(即:

编译为.obj.lst.crf文件)

这个过程计算机将把你编的正确的源代码编译为机器语言、程序清单及交叉引用表的目标文件。

如果此时你的程序有语句错误,系统将报错,并指出在第几行,什么类型的错误,你可根据提示去逐一修改。

现介绍具体过程:

在DOS提示符下键入MASMfilename回车

(注:

你系统内的汇编程序为MASM.EXE,如果你系统的汇编程序为ASM.EXE时,便将命令变为ASMfilename回车。

其中filename为你刚才在PROCEDUREa中建立的文件名)

这时汇编程序的输出文件可以有三个(分别:

.obj.lst.crf),便会出现三次提问,在这可以一路回车即可。

下面显示的信息是源程序中的错误个数,如果为0则表示顺利通过,就可进行进程c。

但如果不为0就说明有错误,并指出错误出现的行,可依据这个提示去进行修改。

但如果错误太多还未等看清就显示过去了,可用如下命令形将错误信息存于一个你指定的文件,再用文本编辑器去查看。

MASMfilename>filen(filen为你起的一个没用过的文件名,用以存放出错信息)以后可查看filen来得到出错信息。

PROCEDUREc:

编译不通过,重新修改(错误类型:

源程序语句不合法)

在执行过PROCEDUREb后,如有出错信息时,就要我们自己按PROCEDUREc去做,而不能跳跃到PROCEDUREd去,如果强行执行PROCEDUREd将无任何有效结果。

现在就开现找错吧!

首先要清楚,在PROCEDUREb中检测出的错误均为每一条语句的语法或用法错误,它并不能检测出程序的逻辑设计(语句按排位置)错误,所以就要记好出错的行号。

在记录行号后,就应再次执行PROCEDUREa,这时和操作应是打开已编好的源程序(以EDIT为例:

在DOS提示符下键入:

EDITfilename.asm回车),依据行号进行修改并存盘,再次进行汇编,直至PROCEDUREb通过为止。

便可继续向下执行PROCEDUREd。

下面给出一些常见出错信息,以便查对:

1、Registeralreadydefined汇编内部出现逻辑错误

2、Unknownsymboltype在符号语句的类型中,有些不能识别的东西

3、Symbolismulti-defined重复定义一个符号

4、Symbolnotdefined符号没有定义

5、Syntaxerror语句的语法与任何可识别的语法不匹配

6、Symbolisreservedword

企图非法使用一个汇编程序的保留字(例:

定义add为一变量)

7、Notproperalign/combinetypeSEGMENT参数不正确

8、Oneoperandmustbeconst这是加法指令的非法使用

9、Operandsmustbesameor1abs这是减法指令的非法使用

10、Alreadyhavebaseregister试图重复基地址

11、Illegalsizeforitem引用的项的长度是非法的,(如:

双字移位)

12、Illegalregistervalue指定的寄存器值不能放入“reg”字段

13、MustbeAXorAL某些指令只能用AX或AL

14、Improperuseofsegmentreg段寄存器使用不合法(如:

movds,0)

15、Divisionby0oroverflow给出一个用0作除数的表达式

16、Valueisoutofrange数值大于需要使用的

17、CSregisterillealusage试图非法使用CS寄存器

18、DUPistoolargeforlinker

DUP嵌套太长,以至于从连接程序不能得到所要的记录

PROCEDUREd:

连接为可执行文件(即:

连接为.exe或.com文件)

在这个过程中一般没有意外,如果有也就是文件名打错了。

形式:

在DOS提示符下:

LINKfilename回车

PROCEDUREe:

运行编译好的可执行文件

当PROCEDUREd通过后,会产生一个可执行文件,这时只需运行这个程序,看它是否按你所想象那样得出结果。

在试运行期间,要尽量试一些临界状态,看程序是否运行稳定、结果是否正确。

如一切正常,便可进入PROCEDUREg了。

可最怕的是不OK,程序产生一些莫名其妙的结果(你可不要以为是你的计算机不听你的指挥,其实它是在一丝不苟地按照你编的程序执行。

我以前总以为我的计算机出了毛病),如果是在考场上这时千万不要慌,稳住自己的情绪,先不要看计算机,静几分钟(反正时间多得是)。

这时就要用到最关键、最常用的一步了,进行PROCEDUREf。

PROCEDUREf:

用调试工具调试,重新修改(逻辑错误)

在这我将介绍用DOS中自带的调试程序DEBUG.EXE来进行程序调试、检查错误.

首先我们要了解DEBUG的基本用法:

1、用于调试程序时的输入格式:

DEBUGFILENAME.?

?

?

回车

其中FILENAME是主文件名,?

?

?

是扩展文件名,例如我们在此前已编译好了一个文件,它的名字为:

djx.exe要对它进行调试时就在DOS提示符下

打:

DEBUGdjx.exe回车,便可见到'-'提示符,如无任何提示说明正确,可进行调试。

2、DEBUG调试过程中用到的DEBUG命令介绍:

(注:

在指令中用[]括起来的内容可缺省)

1)D(Dump)显示指定内存单元内容(一般用来看数据数的内容,即DS段):

格式:

d[地址]从[地址]指定的内存单元显示128个字节的内容

[地址]缺省时,显示上一个DUMP命令后面的内容

d地址范围显示指定范围内的内存内容。

示例:

-d100显示从DS段100H开始的内容(以十六进制显示)

2)E(Enter)修改存储单元内容(一般在DS段)

格式:

e地址[数据]用给定的[数据]代替指定范围的存储单元内容

e地址修改一个指定内存单元的内容

示例:

-eds:

200'djx'FF00AA就可将DS段从200开始至205的内容替

换为646A78FF00AA

3)G(GO)运行命令

格式:

-g[=地址][断点地址1[断点地址2...[断点地址10]]]

从指定[地址]开始执行程序(如地址缺省从当前CS:

IP开始),运行至[断点地址1]停止,显示所有寄存器及标志位内容与下一条指令,如后面还有断点,可键入g,继续执行。

示例:

-g001a则执行从当前cs:

ip至001a的指令

注意:

地址设置必须从指令的第一字节设起。

4)T(Trace)执行一条语句

格式:

-t[=地址]从指定[地址]起执行一条语句后停下来,显示所有寄存器内容及标志位的值与下一条指令。

如[地址]缺省则从当前CS:

IP开始执行

-t[=地址][value]从指定地址起执行value条指令后停止。

5)P(proceed)执行一个循环;一个软中断或call子过程

格式:

-p[=地址][n]

示例:

movah,02h

movdl,41h

int21h

此时用:

-p回车后系统将显示一个字符A,如果在这不用P,而改用T,那么系统将进入INT21H的中断调用中,出不来,这时你会误以为你的程序编错了,一定注意!

!

6)R(register)显示并可修改寄存器内容

格式:

-r显示所有寄存器内容

-r寄存器名修改指定寄存器内容(可改:

AX,BX,CX,DX,SP,

BP,SI,DI,CS,DS,ES,SS,PC,IP,F)

7)U(Unassemble)反汇编

格式:

-u[地址]从指定[地址]反汇编32个字节,若[地址]缺省则从当前地址汇编32个字节。

-u地址范围对指定范围内的存储单元进行反汇编

以上是在调试程序中可能用到的DEBUG命令解释,DEBUG中还有其它命令,在检查程序中不会用到,就不再介绍了。

PROCEDUREg:

程序编好,那就一切OK!

!

!

交卷过关了!

大吃、大睡。

下面给出一个有病句的程序,希望大家和我一起调试、修改并通过:

先执行PROCEDUREa编辑源程序

实现功能:

在屏幕上显示:

Helloworld

MynameisDJX

文件名:

error.asm

行号:

源程序代码:

1datasegment

2out1db'Helloworld'

3axdb'MynameisDJX'

4dataens

5

6codesegment

7assumecs:

code;ds:

data

8leadx,out1

9movah,2

10int21h

11

12movdl,0ah

13movah,2

14int21h

15movdl,0dh

16mooah,2

17int21h

18

19leadx,ax

20movah,

21int21h

22codeends

在编辑完执行PROCEDUREb用masm进行编译:

masmerror回车后显示如下:

Microsoft(R)MacroAssemblerVersion5.00

Copyright(C)MicrosoftCorp1981-1985,1987.Allrightsreserved.

Objectfilename[error.OBJ]:

Sourcelisting[NUL.LST]:

Cross-reference[NUL.CRF]:

Endoffileencounteredoninputfile

error.ASM(23):

warningA4085:

Endoffile,noENDdirective

Opensegments:

DATA

error.ASM(3):

warningA4016:

Reservedwordusedassymbol:

AX

error.ASM(4):

errorA2105:

Expected:

instructionordirective

error.ASM(16):

errorA2105:

Expected:

instructionordirective

error.ASM(19):

errorA2049:

Illegaluseofregister

Endoffileencounteredoninputfile

error.ASM(23):

warningA4085:

Endoffile,noENDdirective

51566+406450Bytessymbolspacefree

2WarningErrors

4SevereErrors

说明这个程序有错误,并在第3,4,16,19,23行有错,

我们再执行PROCEDUREc去逐一检查

第三行:

3axdb'MynameisDJX'

它的错误在于AX不能作为变量名,更正:

3out2db'MynameisDJX'

注意刚才我们定义AX为变量时在后面的程序中用过'变量AX'在第19行

19leadx,ax

在出错报告中也报第19行错,因为不能将AX的有效地址赋给DX,更正:

19leadx,out2

这样一下就解决了两个错误

第四行:

4dataens

这行为一个段的结束,但语句漏打了字母,更正:

4dataends

第十六行:

16mooah,2

这行也是语句打错,更正:

16movah,2

第二十三行:

出错信息:

error.ASM(23):

warningA4085:

Endoffile,noENDdirective

说明本程序没有结束伪操作,更正:

加入:

在第七、八行加入地址标志:

start:

原23endstart

执行PROCEDUREa将源程序修改如下:

datasegment

out1db'Helloworld'

out2db'MynameisDJX'

dataends

codesegment

assumecs:

code;ds:

data

start:

leadx,out1

movah,2

int21h

movdl,0ah

movah,2

int21h

movdl,0dh

movah,2

int21h

leadx,out2

movah,9

int21h

codeends

endstart

再次进行PROCEDUREb进行编译,屏幕显示:

Microsoft(R)MacroAssemblerVersion5.00

Copyright(C)MicrosoftCorp1981-1985,1987.Allrightsreserved.

Objectfilename[error.OBJ]:

Sourcelisting[NUL.LST]:

Cross-reference[NUL.CRF]:

51524+406492Bytessymbolspacefree

0WarningErrors

0SevereErrors

本程序在语句上已无错误。

再执行PROCEDUREd连接为可执行文件(linkerror回车),屏幕显示:

Microsoft(R)OverlayLinkerVersion3.60

Copyright(C)MicrosoftCorp1983-1987.Allrightsreserved.

RunFile[ERROR.EXE]:

ListFile[NUL.MAP]:

Libraries[.LIB]:

LINK:

warningL4021:

nostacksegment

这时error.exe可执行文件已存在,可以执行PROCEDUREe来运行看一看是否正确

在dos提示符下键入:

error回车(小心!

!

!

屏幕显示:

乱码,并死机。

resetMycomputer!

说明程序在逻辑上有错误,并且严重。

这是就要用PROCEDUREf,用调试工具调试,查找错误。

在DOS提示符下键入:

debugerror.exe回车

屏幕出现-提示符,这时就可以用DEBUG的命令来找错误了,

我首先用d命令来查看数据区和内容,发展所定义的两个字符串并不在数据段的段首,而在数据段内的100h位置上,这时才想起masm有一个不成文的规定,那就是在定义完数据段后,所定义的变量均向后100h个单元,需要我们将ds段寄存器置位,在程序的start:

后面加上如下指令:

(执行PROCEDUREa)

movax,data

movds,ax

再执行PROCEDUREb,PROCEDUREd,PROCEDUREe来运行程序,

屏幕显示:

换行

MynameisDJX及乱码,并死机。

(又要重新启动!

再次执行PROCEDUREa检查程序,发现:

1.汇编语言有规定每个字符串应由$结尾

2.在输出第一个串的语句中的AH子功能号应为09H

将以上两点改正。

再执行PROCEDUREb,PROCEDUREd,PROCEDUREe来运行程序,

屏幕显示:

Helloworld

MynameisDJX并死机,不能返回DOS

原因分析,在程序中没有返回DOS的指令,更正:

用PROCEDUREa来进行编辑:

用DOS21H中断的4cH子功能便可返回DOS,在codeends前加:

movah,4ch

int21h

再执行PROCEDUREb,PROCEDUREd,PROCEDUREe来运行程序,

屏幕显示:

Helloword

MynameisDJX

并返回DOS

成功!

这样一个程序就调试完成,并正确。

下面是正确的源程序:

datasegment

out1db'Helloworld$'

out2db'MynameisDJX$'

dataends

codesegment

assumecs:

code;ds:

data

start:

movax,data

movds,ax

leadx,out1

movah,9

int21h

movdl,0ah

movah,2

int21h

movdl,0dh

movah,2

int21h

leadx,out2

movah,9

int21h

movah,4ch

int21h

codeends

endstart

以上这个程序很简单,只是为了说明实现汇编语言的上机编程及调试过程,汇编语言须多练习才能掌握它的特点。

实验二数据传送

一、目的

1、掌握数据传送类指令的用法

2、认识DEBUG调试程序的作用

3、熟悉DEBUG调试程序主要命令的使用方法

二、步骤

将数据段1000H和1008H两个字节存储单元的数据进行交换。

源程序:

MOVBX,1000H

MOVAL,[BX]

MOVCL,8[BX]

MOV8[BX],AL

MOV[BX],CL

HLT

1、进入DEBUG状态

2、汇编源程序

—ACS:

1000

140D:

0100MOVBX,1000

140D:

0103MOVAL,[BX]

140D:

0105MOVCL,8[BX]

140D:

0108MOV8[BX],AL

140D:

010BMOV[BX],CL

140D:

010DINT3

140D:

010E^C

3、用反汇编列出汇编指令序列

—UCS:

0100,010D

140D:

0100BB0010MOVBX,1000

140D:

01038A07MOVAL,[BX]

140D:

01058A4F08MOVCL,8[BX]

140D:

0108884708MOV8[BX],AL

140D:

010B880FMOV[BX],CL

140D:

010DCCINT3

4、给内存单元赋值

将数据段的1000H和1008H存储单元分别赋给F0H和0FH

—EDS:

1000F0,00,00,00,00,00,00,00,0F

5、单步执行程序,并逐条检查执行指令的结果。

—T=100

三、思考题

按上述步骤,完成以下实训内容。

将两个寄存器AX和BX中的数据进行交换。

MOVAX,1234H

MOVBX,5678H

XCHGAX,BX

HLT

实验三顺序结构程序设计

一、实验目的

1.熟悉汇编语言源程序的结构框架。

2.掌握顺序结构程序设计的基本方法。

3.熟练运用edit,masm,link,debug调试汇编语言的源程序。

二、实验内容

1.在屏幕上显示:

HelloBengbuCollege!

参考源程序:

DATA1SEGMENT

MESSDB0DH,0AH,“HelloBengbuCollege!

$”

DATA1ENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA1

START:

MOVAX,DATA1

MOVDS,AX

LEADX,MESS

MOVAH,09H

INT21H

MOVAH,4CH

INT21H

CODEENDS

ENDSTRAT

2.编写程序完成如下功能:

从键盘接收一个小写字母,然后找出他的前导字符和后续字符,再按顺序显示这三个字符。

参考源程序:

CODESEGMENT

ASSUMECS:

CODE

START:

MOVAH,01H

INT21H

MOVBL,AL

SUBBL,1

MOVDL,BL

MOVAH,02H

INT21H

ADDDL,1

MOVAH,02H

INT21H

ADDDL,1

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

当前位置:首页 > 高等教育 > 教育学

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

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