如何编写和汇编语言程序.docx
- 文档编号:24750696
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:19
- 大小:25.48KB
如何编写和汇编语言程序.docx
《如何编写和汇编语言程序.docx》由会员分享,可在线阅读,更多相关《如何编写和汇编语言程序.docx(19页珍藏版)》请在冰豆网上搜索。
如何编写和汇编语言程序
如何编写和汇编语言程序
可以用普通文本编辑器编辑汇编语言源程序。
常用的有MS-DOS下的EDIT文本编辑程序,Windows下的写字板(WORDPAD.EXE)等。
用户通过屏幕编辑程序键入源程序,检查无误,可将源程序存到汇编系统盘上,该程序的扩展名为·ASM。
软件运行基本环境
运行汇编程序必备的软件环境:
DOS操作系统;汇编系统。
汇编系统盘应包含如下文件:
MASM宏汇编程序文件
LISK连接程序文件
CRFF索引程序文件(也可不用)
汇编源程序编写
1)源程序的书写格式
当CPU访问内存时,是把存储器分成若干个段,通过4个段寄存器中存放的地址对内存储器访问,因此在编源程序时必须按段的结构来编制程序。
由于每个段的物理空间为≤64KB,所以程序中各段可以分别为一个或几个。
源程序的书写一般有如下形式:
逻辑堆栈段堆栈段名SEGMENTSTACK
用变量定义预置的堆栈空间
·
·
堆栈段名ENDS
逻辑数据段数据段名SEGMENT
用变量定义预置的数据空间
·
·
数据段名ENDS
逻辑代码段代码段名SEGMENT
ASSUME定义各段寻址关系
过程名PROC…
程序
·
·
过程名ENDP
代码段名ENDS
END过程名或起始标号
在源程序中最少要有一个代码段,数据段根据需要可有可无,也可以增设附加段。
对于堆栈段也可以根据需要可有可无,但在连接(LINK)时计算机将显示警告性的错误:
Warning:
NSTACKsegment
Therewas1errordetected.
在程序中如果没有用到堆栈时,该错误提示不影响程序的运行,如果程序中用到堆栈时必须设置堆栈段。
其中:
SEGMENT、ASSUME、PROC…ENDP为伪指令,伪指令是发给汇编程序ASM的,而不和微处理器打交道,在汇编时不产生目标代码,只是把源程序中各段的设置情况告诉汇编程序。
2)段寄存器的段地址的装入
Assume伪指令语句只是建立了当前段与段寄存器的联系,但不能把各段的段地址装入相应的段寄存器中,段寄存器的段地址的装入是在程序中完成的。
(1)DS、ES、SS的装入
由于段寄存器不能用立即数寻址方式直接传送,所以段地址装入可通过通用寄存器传送给段寄存器。
MOVAX,逻辑段名
MOV段寄存器,AX
其中逻辑段名为程序中定义各逻辑段的名字,(不包括代码段),段寄存器是指与各逻辑段相对应的各段寄存器(DS、ES、SS)。
(2)CS的装入
代码段寄存器是装当前执行目标代码的段地址,IP是提供下一条要执行的目标代码的偏移量,为了保证程序的正确执行,CS和IP装入新值时是一起完成的。
对CS和IP的装入有如下几种情况:
①根据用户程序中的伪指令END后的标号为CS和IP提供代码段的段地址和目标代码的偏移地址。
②在程序运行过程中,当执行某些指令和操作时,CPU自动修改CS和IP的值,使它们指向新的代码段。
3)程序中的数据与变量
在汇编源程序中的数据除了立即数,由指令产生的数和通过键盘输入的数以外,还胡大量的数据是通过伪指令语句进行预置和分配的,也就是在某逻辑段中(除代码段),将所需的数据以某种形式存放起来,在程序中可任意调用。
在数据定义的同时还可以定义变量,将变量与数据结合在一起。
可以为某个变量分配存储空间以便在程序执行过程中存放中间结果和最终结果,使用起来极为方便。
(1)变量与数据的定义
变量与数据的定义可以通过符号定义伪指令EQU、=和数据定义伪指令DB或DW或DD来实现。
EQU和=可以出现在程序的逻辑段内也可出现在逻辑段外。
(2)汇编程序中数据的提供方法
①用数据定义伪指令提供数据
如果程序要求原始数据为一批数据时,用数据定义伪指令DB、DW和DD来提供较为方便。
②用立即数的形式提供数据
当原始数据只有几个时,一般用立即数的方法来提供。
当然,用立即数的方法只是将一个数据传送到通用寄存器中,它只是通过通用寄存器传送数据。
③用编程的方法提供数据
假如原始数据是一组有规律的数据项,则用编程序的方法形成这一组数据,不用专门为这组数据分配存储单元,节省了存储空间。
④用键盘提供数据
当原始数据为任意数据时,一般用键盘输入方法,调用DOS21H中断。
(3)数据的输出方式
①在显示器上显示一个字符
调用02H号功能调用号,发21H号中断,将要显示的字符的ASCII码送入DL,就可在显示器上显示该字符。
②在打印机上输出一个字符
调用05H号功能调用号,发21H号中断,将要打印字符的ASCII码送入DL,就可在打印机上打印出DL中的字符。
4)返回DOS状态的方法
当执行.EXE文件时,是在DOS状态下进行的,如果希望在执行完.EXE文件后正常返回DOS状态,一般用如下两种方法:
采用DOS4CH功能调用和采用返回(RET)断点的方法。
汇编处理—执行宏汇编程序MASM.EXE
用汇编语言编写的源程序必须是一个完整的源程序。
宏汇编程序对汇编语言源程序的汇编过程包括语法检查和数据代码汇编两部分,生成目标程序和辅助信息文件。
为了完成汇编任务,汇编程序一般采用两遍扫描的方法,第一遍扫描源程序产生符号表、处理伪指令等,第二遍扫描产生机器指令代码、确定数据等。
源程序用宏汇编程序翻译(汇编)后,可以得到三个文件:
一个是扩展名为.OBJ的目标文件,在该文件中,将源程序的操作码部分变为机器码,但地址操作数是可浮动的相对地址,而不是实际地址,因此需经LINK连接文件进行连接才能形成可执行文件。
第二个文件是列表文件,扩展名为.LST,它把源程序和目标程序列表,以供检查程序用。
第三个文件是交叉索引文件,扩展名为.CRF,它是一个对源程序所用的各种符号进行前后对照的文件。
其中目标文件是必须产生的,而其它两个文件在需要时给予命令就可产生,对连接和执行汇编程序无直接的关系。
1)汇编操作过程
在DOS状态下,键入MASM↓则调入宏汇编程序,屏幕显示与操作如下:
masm↓
Microsoft(R)MacroAssembleVersion5.00
Copyright(C)MicrosoftCorp1981-1985,1987,Allrightreserved.
Sourcefilename[.ASM]:
MYFILE↓
Objectfilename[MYFILE.OBJ]:
MYFILE↓
Sourcelisting[NUL.LST]:
MYFILE↓
Cross-reference[NUL.CRF]:
MYFILE↓
50678+410090Bytessymbolspacefree
0WarningErrors
0SevereErrors
其中划线部分为用户键入部分,MYFILE为源程序名(MYFILE.ASM),方括号中是机器规定的默认文件名,如果用户认为方括号内的文件名就是要键入的文件名,则可只在划线部分键入回车符。
如果不想要列表文件和交叉索引文件,则可在[NUL.LST]和[NUL.CRF]后不键入文件名只键入回车符。
当回答完上述四个询问后,汇编程序就对源程序进行汇编。
在汇编过程中,如果发现源程序中有语法错误,则提示出错信息,指出是什么性质的错误,错误类型,最后列出错误的总数。
之后可重新进入屏幕编辑状态,调入源程序(MYFILE.ASM)进行修改,修改完毕,再进行汇编,直到汇编通过为止。
如果在汇编时不需要产生列表文件(.LST)和交叉索引文件(.CRF),调用汇编程序时可用分号结束。
如果需要产生.OBJ和.LST文件,不需要.CRF文件,则在分号前面加两个逗号即可。
如果4个文件都需要,用简便的操作方法是在分号前用了3个逗号。
2)列表文件(.LST)
列表文件(.LST)是通过汇编程序(MASM)产生的,可以在DOS状态下用TYPE命令显示或打印该文件,以便分析调试源程序。
如显示D盘上已存在的列表文件MYFILE.LST操作方法如下:
D>TYPEMYFILE.LST;↓
列表程序由三部分组成:
(1)源程序和目标程序清单
列表程序同时列出源程序和对应的机器语言清单。
列表程序的第一列给出每条指令所在行号;第二列给出从段的首地址开始的每条指令存放的偏移地址;接着是数字列,给出对应每条语句的机器码和对应于存放在栈段和数据段的值,在机器码加上“R”的指令表示:
这条指令在连接时可能产生与列出来的偏移地址不同的地址,因为这些偏移地址可能与其它模块有关;最右边就是用汇编语言编写的源程序。
(2)段信息汇总表
在段信息汇总表中列出该程序用了哪几个段,如:
代码段CODE、数据段DATA和堆栈段STACK;每个段所占存储空间的长度(字节数);每个段的定位类型,包括PAGE(页)、PARA(节)、WORD(字)和BYTE(字节),它们表示此段的起始边界要求,即起始边界地址应分别可以被256、16、2和1除尽。
该列表清单中是以PARA为CODE段、DATA段和STACK段的起始边界地址。
最后一列为段的组合类型;段的组合类型是告诉连接程序,本段与其它段的关系,组合类型有NONE、PUBLIC、COMMOM、AT表达式、STACK和MEMORY。
NONE:
表示本段与其它段不发生逻辑关系,即每段都有自己的基本地址。
是隐含组合类型。
STACK:
表明连接程序首先要把本段与同名同类别的其它段相邻地连接在一起,然后为所有定义为栈段的连接在一起的段,定义一个共同的段基地址,即连接成一个物理段。
在列表程序的源程序中只有一个栈段,在栈段定义中给出了组合类型为STACK,因此在段信息汇总表中列出了该项,在本程序中它没有任何意义,因为没有其它栈段与它连接,只是为了说明这个问题而设置的。
(3)符号汇总表
在列表程序中最后部分列出了符号汇总,是指在源程序中用户定义的符号名、类型、值和所在段。
如果在源程序中存在某些语法错误时,列表文件可提示某条语句有哪些错误,出错提示显示在出错指令行的下面,因此用户可借助列表文件很快地找到错误行,以便调试。
另外由于列表文件给出了各条指令的偏移地址,对和程序时设置断点很方便。
3)交叉索引文件(.CRF)
汇编后产生的交叉索引文件,扩展名为.CRF,它列出了源程序中定义的符号(包括:
标号、变量等)和程序中引用这些符号的情况。
如果要查看这个符号表,必须使用CREF.EXE的文件,它根据.CRF文件建立一个扩展名为.REF的文件,而后再用DOS的TYPE命令显示,就可以看到这个符号使用情况表。
具体操作方法如下:
D>CREF↓
creffilename[.CRF]:
MYFILE↓
listfilename[MYFILE.REF]:
↓
D>TYPEMYFILE.REF↓
目标代码链接程序----LINK.EXE
用汇编语言编写的源程序经过汇编程序(MASM)汇编后产生了目标程序(.OBJ),该文件是将源程序操作码部分变成了机器码,但地址是可浮动的相对地址(逻辑地址),因此必须经过连接程序LINK连接后才能运行。
连接程序LINK是把一个或多个独立的目标程序模块装配成一个可重定位的可执行文件,扩展名为.EXE文件。
此外还可以产生一个内存映象文件,扩展名为.MAP。
1)连接程序执行过程
在DOS状态下,键入LINK↓(或LINKMYFILE↓)则系统调入LINK程序,屏幕显示操作如下:
D>LINK↓
IBMPersonalComputerLinker
Version2.00(C)CopyrightIBMCorp1981,1982,1983
ObjectModules[.OBJ]:
MYFILE↓
RunFile[MYFILE.EXE]:
MYFILE↓
ListFile[NUL.MAP]:
MYFILE↓
Libraries[.LIB]:
↓
其中划线部分为用户键入部分,MYFILE为源程序名,方括号内为机器默认文件名,当用户认为方括号中的文件名就是要键入的文件名时,可在冒号后面只键入回车。
其中MAP文件是否需要建立,由用户决定,需要则键入文件名,不需要则直接送入一个回车键。
最后一个询问是问是否在连接时用到库文件,对于连接汇编语言源程序的目标文件,通常是不需要的,因此直接键入回车键。
与汇编程序一样,可以在连接时用分号结束后续询问。
例如:
D>LINKMYFILE;↓
IBMPersonalComputerLinker
Version2.00(C)CopyrightIBMCorp1981,1982,1983
连接后只产生MYFILE.EXE文件。
如果除MYFILE.EXE文件外还要产生MYFILE.MAP文件,则在分号前加两个逗号。
D>LINKMYFILE,,;↓
IBMPersonalComputerLinker
Version2.00(C)CopyrightIBMCorp1981,1982,1983
2)内存映象文件(.MAP)
由连接程序LINK产生的扩展名为.MAP文件,它实际上是连接程序的列表文件,它给出了每个段的地址分配情况及长度。
在DOS状态下,用TYPE命令显示打印出来。
例如:
D>TYPEMYFILE.MAP↓
StartStopLengthNameClass
00000H0000FH0010HDATA
00010H0004FH0040HSTACK
00050H0005FH0010HCODE
OriginGroup
Programentrypointat0005:
0000
从中可以看到,源程序MYFILE中定义了三个段:
数据段(DATA)起始地址为00000H,终止地址为0000FH,长度为0010H个字节;堆栈段(STACK)起始地址为00010H,终止地址为0004FH,长度为0040H个字节;代码段(CODE)起始地址为00050H,终止地址为0005FH,长度为0010H个字节。
应用程序执行
当用连接程序LINK将目标程序(.OBJ)连接定位后,可产生可执行的应用程序文件(.EXE),可以在DOS状态下执行该程序。
执行操作如下:
D>MYFILE↓或
D>MYFILE.EXE↓
在源程序MYFILE中如果有显示结果的指令,则在执行程序后可以看到执行结果;如需要动态调试应用程序MYFILE.EXE,则可以借助动态调试程序DEBUG.COM来进行调试、运行,DEBUG是一种支持命令行方式的汇编语言编程调试工具。
动态调试程序DEBUG.COM
在编写和运行汇编程序的过程中,会遇到一些错误和问题,需要对程序进行分析和调试,调试程序DEBUG就是专为汇编语言设计的一种调试工具。
它在调试汇编语言程序时有很强的功能,能使程序设计者接触到机器内部,能观察和修改寄存器和存储单元内容,并能监视目标程序的执行情况,使用户真正接触到CPU内部,与计算机产生最紧密的工作联系。
动态和程序DEBUG的主要特点
DEBUG的执行
DEBUG命令格式
主要DEBUG命令
动态和程序DEBUG的主要特点
1)能够在最小环境下运行汇编程序
在DOS状态下运行汇编程序,必须将程序经过MASM汇编程序,而后还要经过LINK连接程序产生可执行程序,才能最终运行,比较麻烦。
在DEBUG状态下,为用户提供了调试、控制测试的环境,可以在此环境下进行编程、调试、监督、执行用户编写的汇编程序。
因此调试周期短,为用户提供了极大的方便。
2)提供极简单的修改手段
DEBUG提供了修改命令,可以修改内存单元内容,修改寄存器的内容,为调试程序、修改程序带来了方便。
3)提供用户与计算机内部联系的窗口
DEBUG具有显示命令,它既可以使用户看到某内存单元或某一块单元内容,也可以看到CPU内部各寄存器的内容。
用单步执行命令实现跟踪执行,每执行一步都使用户看到各寄存器的内容的变化,以便分析和调整程序。
4)可装入、修改或显示任何文件
当然在DEBUG状态下运行汇编程序也具有一定局限性。
在DEBUG状态下运行的程序不能使用宏汇编程序中的宏指令,大部分伪指令也不能使用,因此只能把程序分段调试。
此外,不能调试太长的程序,只能分块进行中程序设计。
在DEBUG状态下调试好的程序不能形成可执行文件(.EXE),因此调试好的程序只能记下,到编辑环境下重新键入调试好的程序,通过汇编程序(如MASM),再通过连接程序(LINK)形成可执行文件(.EXE)。
DEBUG的执行
在操作系统(DOS或WIndows)命令行方式下,直接调入DEBUG程序,键入命令的格式如下:
D>DEBUG[d:
][Path][filename[.ext]][Parm1][Parm2]
其中[]的内容为可选项,可以有也可以缺省。
[d:
]为驱动器号,指要调入DEBUG状态的可执行文件在哪个驱动器中,如A:
、B:
、C:
等。
[Path]为路径,指要调入DEBUG状态的可执行文件是在哪个目录下或子目录下。
[filename[.ext]],指要调入DEBUG状态下的可执行文件的文件名,该文件可以是通过编辑、汇编、连接后产生的可执行文件,也可以是在DEBUG状态下汇编的程序段,通过写盘命令W写入磁盘的文件。
[Parm1][Parm2]为任选参数,是给定文件的说明参数。
在启动DEBUG时,如果输入filename(文件名),则DEBUG程序把指定文件装入内存,用户可以通过DEBUG的命令对指定文件进行修改、显示或执行。
如果没有文件名,则是以当前内存的内容工作,或者用命名命令或装入命令把需要的文件装入内存,然后再通过DEBUG命令进行修改、显示或执行。
当启动DEBUG程序后,屏幕上出现“—”,说明系统已进入DEBUG状态。
DEBUG命令格式
(1)DEBUG命令都是一个英文字母,后面跟着一个或多个有关参数。
多个操作参数之间用“,”或空格隔开。
(2)DEBUG命令必须接着按ENTER键,命令才有效。
(3)参数中不论是地址还是数据,均用十六进制数表示,但十六进制数据后面不要用“H”。
(4)可以用Ctrl和Break键来停止一个命令的执行,返回到DEBUG的提示符“—”下。
(5)用Ctrl-NumLock键中止正在上卷的输出行,再通过按任意键继续输出信息。
主要DEBUG命令
(1)汇编命令A
格式:
a.A[段寄存器名]:
[偏移地址]
b.A[段地址]:
[偏移地址]
c.A[偏移地址]
d.A
功能:
用该命令可以将汇编语言程序直接汇编进入内存。
当键入A命令后,显示段地址和偏移地址等待用户键入汇编指令,每键入一条汇编指令回车后,自动显示下一条指令的段地址和偏移地址,再键入下一条汇编指令,直到汇编语言程序全部键入,又显示下一地址时可直接键入回车返回到提示符“-”为止。
其中a的段地址在段地址寄存器中,因此在使用该命令时必须将段地址寄存器送入段地址,c的地址在CS中,d的段地址在CS中,偏移地址为100H。
(2)显示内存命令D
格式:
a.D[地址]
b.D[地址范围]
c.D
功能:
显示指定内存范围的内容。
显示的内容为两种形式:
一种为十六进制内容,一种为与十六进制相对应的ASCII码字符,对不可见字符以“·”代替。
对于a、c每次显示128个字节内容,b显示的字节数由地址范围来决定。
若命令中有地址,则显示的内容从指定地址开始,若中中无地址(如c)则从上一个D命令所显示的最后一个单元的下一个单元开始。
若以前没有使用过D命令,则以DEBUG初始化的段寄存器的内容为起始段地址,起始偏移地址为100H,即CS:
100。
对于a中的地址为偏移地址,段地址为CS的内容,对b中的地址范围,可以指定段地址和起始偏移地址和终止偏移地址。
(3)修改存储单元内容命令E
格式:
a·E[地址][内容表]
b·E[地址]
功能:
a·用命令所给定的内容表去代替指定地址范围的内存单元内容。
b·一个单元一个单元地连续修改单元内容。
其中:
内容表为一个十六进制数,也可以是用单引号括起的一串字符。
(4)填充内存命令F
格式:
F[范围][单元内容表]
功能:
将单元内容表中的内容重复装入内存的指定范围内。
(5)内存搬家命令M
格式:
M[源地址范围][目标起始地址]
其中源地址范围和目的起始地址为偏移地址,段地址为DS的内容。
功能:
把源地址范围的内容搬至以目标起始地址开始的存储单元中。
(6)比较命令C
格式:
C[源地址范围],[目标地址]
其中源地址范围是由起始地址和终止地址指出的一片连续的存储单元,目标地址为与源地址所指单元对比的目标地址起始地址。
功能:
从源地址范围是由起始的地址单元开始逐个与目标起始地址往后的单元顺序比较每个单元内容,比较到源终止地址为止。
比较结果如果一致则不显示任何信息,如果不一致,则以[源地址][源内容][目的内容][目的地址]的形式显示失败单元地址及内容。
(7)搜索指定内容命令S
格式:
S[地址范围][表]
功能:
在指定地址范围内搜索表中内容,搜索到就显示表中元素所在地址。
(8)检查和修改寄存器内容命令R
格式:
a·R
b·R[寄存器名]
功能:
a·显示CPU内部所有寄存器的内容和全部标志位的状态。
b·显示和修改一个指定寄定器的内容和标志位的状态。
其中对状态标志寄存器FLAG以位的形
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 如何 编写 汇编语言 程序