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