《汇编语言上机指导.ppt》由会员分享,可在线阅读,更多相关《汇编语言上机指导.ppt(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、汇编语言上机指导汇编语言上机指导及示例、习题及示例、习题 汇编语言上机过程汇编语言上机过程一、上机前的软件准备:一、上机前的软件准备:MS-DOS操作系统(如:操作系统(如:MSDOS6.22,MSDOS7.0 等)等)文本编辑器文本编辑器(如:(如:EDIT.COM,TURBO.EXE,TC.EXE,C.EXE 等)等)汇编程序汇编程序(如:(如:MASM.EXE,ASM.EXE 等)等)连接程序连接程序(如:(如:LINK.EXE 等)等)调试程序调试程序(如:(如:DEBUG.EXE 等)等)二、汇编程序建立过程二、汇编程序建立过程:通过通过 a.a.建立汇编源程序建立汇编源程序b.b.
2、编译为目标文件编译为目标文件d.d.连接为可执行文件连接为可执行文件 c.c.不通过,重新修改(语句错误)不通过,重新修改(语句错误)f.f.不正确,用调试工具调试,重新修改(逻辑错误)不正确,用调试工具调试,重新修改(逻辑错误)ee运行运行 正确正确 g.g.完成完成三、现在对(二)的每一个标有字母的过程三、现在对(二)的每一个标有字母的过程(PROCEDURE)进行详细说进行详细说明明PROCEDURE a:建立汇编源程序(即:建立建立汇编源程序(即:建立 文件名文件名.asm)这个过程就相当于我们在纸上编写源程序代码一样,只不过是将纸变这个过程就相当于我们在纸上编写源程序代码一样,只不过
3、是将纸变为了计算机,这个过程也称源代码录入。将源程序代码录入计算机的为了计算机,这个过程也称源代码录入。将源程序代码录入计算机的方法很多,下面将介绍具体方法。方法很多,下面将介绍具体方法。1.通过通过MD-DOS自带的自带的EDIT.EXE文本编辑器进行输入,在文本编辑器进行输入,在DOS提示提示符下键入符下键入:EDIT回车回车,这时如果你系统内可调用时,这时如果你系统内可调用时,EDIT的操作画面便的操作画面便会出现在屏幕上,你就可在提示下进行录入了,当录入完毕后,选择会出现在屏幕上,你就可在提示下进行录入了,当录入完毕后,选择存盘并给你输入的文件起一个文件名,形式:存盘并给你输入的文件起
4、一个文件名,形式:filename.asm;(其;(其中中filename为你起的文件名为你起的文件名,由由1-8个字符组成),个字符组成),asm 是为汇编程序是为汇编程序识别而必须加上去的,不可更改。存盘后在识别而必须加上去的,不可更改。存盘后在DOS下可用下可用DOS命令命令DIR来查看,如果看到了所存的文件存在,就可以进行进程来查看,如果看到了所存的文件存在,就可以进行进程b。2.如果你的系统中没有如果你的系统中没有EDIT,也可用你所熟悉的文本编辑器进行录入、,也可用你所熟悉的文本编辑器进行录入、编辑,如可用编辑,如可用c语言和语言和pascal语言的文本编辑器来编辑语言的文本编辑器
5、来编辑,最后将文件存最后将文件存为为filename.asm的形式即可。的形式即可。PROCEDURE b:编译目标文件(即:编译为编译目标文件(即:编译为.obj.lst.crf文件)文件)这个过程计算机将把你编的正确的源代码编译为机器语言、程序清单及这个过程计算机将把你编的正确的源代码编译为机器语言、程序清单及交叉引用表的目标文件。如果此时你的程序有语句错误,系统将报错,交叉引用表的目标文件。如果此时你的程序有语句错误,系统将报错,并指出在第几行,什么类型的错误,你可根据提示去逐一修改。现介绍并指出在第几行,什么类型的错误,你可根据提示去逐一修改。现介绍具体过程:具体过程:在在DOS提示符
6、下键入提示符下键入MASM filename回车回车(注:你系统内的汇编程序为(注:你系统内的汇编程序为MASM.EXE,如果你系统的汇编程序为如果你系统的汇编程序为ASM.EXE时,便将命令变为时,便将命令变为ASM filename回车。其中回车。其中filename为你刚为你刚才在才在PROCEDURE a 中建立的文件名)中建立的文件名)这时汇编程序的输出文件可以有三个(分别:这时汇编程序的输出文件可以有三个(分别:.obj.lst.crf),便会出,便会出现三次提问,在这可以一路回车即可。下面显示的信息是源程序中的错现三次提问,在这可以一路回车即可。下面显示的信息是源程序中的错误个数
7、,如果为误个数,如果为0则表示顺利通过,就可进行进程则表示顺利通过,就可进行进程c。但如果不为。但如果不为0就说明就说明有错误,并指出错误出现的行,可依据这个提示去进行修改。但如果错有错误,并指出错误出现的行,可依据这个提示去进行修改。但如果错误太多还未等看清就显示过去了,可用如下命令形将错误信息存于一个误太多还未等看清就显示过去了,可用如下命令形将错误信息存于一个你指定的文件,再用文本编辑器去查看。你指定的文件,再用文本编辑器去查看。MASM filename filen(filen为你起的一个没用过的文件名,用以存放出错信息)以后可查看为你起的一个没用过的文件名,用以存放出错信息)以后可查
8、看filen来来得到出错信息。得到出错信息。PROCEDURE c:编译不通过编译不通过,重新修改(错误类型:源程序语句重新修改(错误类型:源程序语句不合法)不合法)在执行过在执行过PROCEDURE b后,如有出错信息时,就要我们自己后,如有出错信息时,就要我们自己按按PROCEDURE c去做,而不能跳跃到去做,而不能跳跃到PROCEDURE d去,如去,如果强行执行果强行执行PROCEDURE d将无任何有效结果。将无任何有效结果。现在就开现找错吧!首先要清楚,在现在就开现找错吧!首先要清楚,在PROCEDURE b中检测出中检测出的错误均为每一条语句的语法或用法错误,它并不能检测出程序
9、的错误均为每一条语句的语法或用法错误,它并不能检测出程序的逻辑设计(语句按排位置)错误,所以就要记好出错的行号。的逻辑设计(语句按排位置)错误,所以就要记好出错的行号。在记录行号后,就应再次执行在记录行号后,就应再次执行PROCEDURE a,这时和操作应,这时和操作应是打开已编好的源程序(以是打开已编好的源程序(以EDIT为例:在为例:在DOS提示符下键入:提示符下键入:EDIT filename.asm回车),依据行号进行修改并存盘,再次进回车),依据行号进行修改并存盘,再次进行汇编,直至行汇编,直至PROCEDURE b通过为止。便可继续向下执行通过为止。便可继续向下执行PROCEDUR
10、E d。下面给出一些常见出错信息,以便查对:下面给出一些常见出错信息,以便查对:1、Register already defined 汇编内部出现逻辑错误汇编内部出现逻辑错误2、Unknown symbol type 在符号语句的类型中,有些不能识别的东西在符号语句的类型中,有些不能识别的东西3、Symbol is multi-defined 重复定义一个符号重复定义一个符号4、Symbol not defined 符号没有定义符号没有定义5、Syntax error 语句的语法与任何可识别的语法不匹配语句的语法与任何可识别的语法不匹配6、Symbol is reserved word企图非法
11、使用一个汇编程序的保留字企图非法使用一个汇编程序的保留字(例:定义例:定义add为一变量为一变量)7、Not proper align/combine type SEGMENT参数不正确参数不正确8、One operand must be const 这是加法指令的非法使用这是加法指令的非法使用9、Operands must be same or 1 abs 这是减法指令的非法使用这是减法指令的非法使用10、Already have base register 试图重复基地址试图重复基地址11、Illegal size for item 引用的项的长度是非法的,(如:双字移位)引用的项的长度是
12、非法的,(如:双字移位)12、Illegal register value 指定的寄存器值不能放入指定的寄存器值不能放入“reg”字段字段13、Must be AX or AL 某些指令只能用某些指令只能用AX或或AL14、Improper use of segment reg 段寄存器使用不合法(如:段寄存器使用不合法(如:mov ds,0)15、Division by 0 or overflow 给出一个用给出一个用0作除数的表达式作除数的表达式16、Value is out of range 数值大于需要使用的数值大于需要使用的17、CS register illeal usage 试图
13、非法使用试图非法使用CS寄存器寄存器18、DUP is too large for linkerDUP嵌套太长,以至于从连接程序不能得到所要的记录嵌套太长,以至于从连接程序不能得到所要的记录PROCEDURE d:连接为可执行文件(即:连接为连接为可执行文件(即:连接为.exe 或或.com文件)文件)在这个过程中一般没有意外,如果有也就是文件名打错了。在这个过程中一般没有意外,如果有也就是文件名打错了。形式:在形式:在DOS提示符下:提示符下:LINK filename 回车回车PROCEDURE e:运行编译好的可执行文件运行编译好的可执行文件当当PROCEDURE d通过后,会产生一个可
14、执行文件,这时只需运行通过后,会产生一个可执行文件,这时只需运行这个程序,看它是否按你所想象那样得出结果。在试运行期间,要尽这个程序,看它是否按你所想象那样得出结果。在试运行期间,要尽量试一些临界状态,看量试一些临界状态,看 程序是否运行稳定、结果是否正确。如一切程序是否运行稳定、结果是否正确。如一切正常,便可进入正常,便可进入PROCEDURE g了。了。可最怕的是不可最怕的是不OK,程序产生一些莫名其妙的结果(你可不要以为是,程序产生一些莫名其妙的结果(你可不要以为是你的计算机不听你的指挥,其实它是在一丝不苟地按照你编的程序执你的计算机不听你的指挥,其实它是在一丝不苟地按照你编的程序执行。
15、我以前总以为我的计算机出了毛病),如果是在考场上这时千万行。我以前总以为我的计算机出了毛病),如果是在考场上这时千万不要慌,稳住自己的情绪,先不要看计算机,静几分钟(反正时间多不要慌,稳住自己的情绪,先不要看计算机,静几分钟(反正时间多得是)。这时就要用到最关键、最常用的一步了,进行得是)。这时就要用到最关键、最常用的一步了,进行PROCEDURE f。PROCEDURE f:用调试工具调试,重新修改(逻辑错误)用调试工具调试,重新修改(逻辑错误)在这我将介绍用在这我将介绍用DOS中自带的调试程序中自带的调试程序DEBUG.EXE来进行程序调试、来进行程序调试、检查错误检查错误.首先我们要了解
16、首先我们要了解DEBUG的基本用法:的基本用法:1、用于调试程序时的输入格式:、用于调试程序时的输入格式:DEBUG FILENAME.?回车回车其中其中FILENAME是主文件名,是主文件名,?是扩展文件名,例如我们在此前已编译好了一个文件,它的名子为:是扩展文件名,例如我们在此前已编译好了一个文件,它的名子为:djx.exe 要对它进要对它进行调试时就在行调试时就在DOS提示符下提示符下打:打:DEBUG djx.exe 回车,便可见到回车,便可见到-提示符,如无任何提示说明正确,可进行调试。提示符,如无任何提示说明正确,可进行调试。2、DEBUG调试过程中用到的调试过程中用到的DEBUG
17、命令介绍:命令介绍:(注:在指令中用(注:在指令中用 括起来的内容可缺省)括起来的内容可缺省)1)D(Dump)显示指定内存单元内容(一般用来看数据数的内容,即显示指定内存单元内容(一般用来看数据数的内容,即DS段):段):格式:格式:d地址地址 从从地址地址指定的内存单元显示指定的内存单元显示128个字节的内容个字节的内容地址地址缺省时,显示上一个缺省时,显示上一个DUMP命令后面的内容命令后面的内容d 地址范围地址范围 显示指定范围内的内存内容。显示指定范围内的内存内容。示例:示例:-d100 显示从显示从DS段段100H开始的内容(以十六进制显示)开始的内容(以十六进制显示)2)E(En
18、ter)修改存储单元内容(一般在修改存储单元内容(一般在DS段)段)格式:格式:e 地址地址 数据数据 用给定的用给定的数据数据代替指定范围的存储单元内容代替指定范围的存储单元内容e 地址地址 修改一个指定内存单元的内容修改一个指定内存单元的内容示例:示例:-e ds:200 djxFF00AA 就可将就可将DS段从段从200开始至开始至205的内容替的内容替换为换为64 6A 78 FF 00 AA3)G(GO)运行命令运行命令格式:格式:-g=地址地址断点地址断点地址1 断点地址断点地址2.断点地址断点地址10从指定从指定地址地址开始执行程序(如地址缺省从当前开始执行程序(如地址缺省从当前
19、CS:IP开始),运行至开始),运行至断点地址断点地址1停止,显示所有寄存器及标志位内容停止,显示所有寄存器及标志位内容与下一条指令,如后面还有断点,可键入与下一条指令,如后面还有断点,可键入g,继续执行。继续执行。示例:示例:-g001a 则执行从当前则执行从当前cs:ip至至001a的指令的指令注意:地址设置必须从指令的第一字节设起。注意:地址设置必须从指令的第一字节设起。4)T(Trace)执行一条语句执行一条语句格式:格式:-t=地址地址 从指定从指定地址地址起执行一条语句后停下来起执行一条语句后停下来,显示所有寄存器内容及标志位的值与显示所有寄存器内容及标志位的值与下一条指令。如下一
20、条指令。如地址地址缺省则从当前缺省则从当前CS:IP开始执行开始执行-t=地址地址value 从指定地址起执行从指定地址起执行value条指令后停止。条指令后停止。5)P(proceed)执行一个循环执行一个循环;一个软中断或一个软中断或call子过程子过程格式:格式:-p=地址地址n示例示例:mov ah,02hmov dl,41hint 21h此时用此时用:-p 回车后系统将显示一个字符回车后系统将显示一个字符A,如果在这不用如果在这不用P,而改用而改用T,那么系统将进入那么系统将进入INT 21H的中的中断调用中,出不来,这时你会误以为你的程序编错了,一定注意断调用中,出不来,这时你会误
21、以为你的程序编错了,一定注意!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 地址范围地址范围 对指定范围内的存储单元进行反汇编对指定范围内的存储单元进行反汇编以
22、上是在调试程序中可能用到的以上是在调试程序中可能用到的DEBUG命令解释,命令解释,DEBUG中还有其它命令,在检查程序中不中还有其它命令,在检查程序中不会用到,就不再介绍了。会用到,就不再介绍了。1 data segment2 out1 db Hello world3 ax db My name is DJX4 data ens56 code segment7 assume cs:code;ds:data8 lea dx,out19 mov ah,210 int 21h1112 mov dl,0ah13 mov ah,214 int 21h15 mov dl,0dh16 moo ah,217
23、 int 21h1819 lea dx,ax20 mov ah,21 int 21h22 code endsMicrosoft(R)Macro Assembler Version 5.00Copyright(C)Microsoft Corp 1981-1985,1987.All rights reserved.Object filename error.OBJ:Source listing NUL.LST:Cross-reference NUL.CRF:End of file encountered on input fileerror.ASM(23):warning A4085:End of
24、 file,no END directiveOpen segments:DATAerror.ASM(3):warning A4016:Reserved word used as symbol:AXerror.ASM(4):error A2105:Expected:instruction or directiveerror.ASM(16):error A2105:Expected:instruction or directiveerror.ASM(19):error A2049:Illegal use of registerEnd of file encountered on input fil
25、eerror.ASM(23):warning A4085:End of file,no END directive 51566+406450 Bytes symbol space free2 Warning Errors4 Severe Errors说明这个程序有错误,并在第说明这个程序有错误,并在第3,4,16,19,23行有错,行有错,我们再执行我们再执行PROCEDURE c去逐一检查去逐一检查第三行:第三行:3 ax db My name is DJX它的错误在于它的错误在于AX不能作为变量名,更正:不能作为变量名,更正:3 out2 db My name is DJX注意刚才我们定义
26、注意刚才我们定义AX为变量时在后面的程序中用过为变量时在后面的程序中用过变量变量AX在第在第19行行19 lea dx,ax在出错报告中也报第在出错报告中也报第19行错,因为不能将行错,因为不能将AX的有效地址赋的有效地址赋给给DX,更正:更正:19 lea dx,out2这样一下就解决了两个错误这样一下就解决了两个错误第四行:第四行:4 data ens这行为一个段的结束,但语句漏打了字母,更正:这行为一个段的结束,但语句漏打了字母,更正:4 data ends第十六行:第十六行:16 moo ah,2这行也是语句打错,更正:这行也是语句打错,更正:16 mov ah,2第二十三行:第二十三
27、行:出错信息:出错信息:error.ASM(23):warning A4085:End of file,no END directive说明本程序没有结束伪操作,更正:说明本程序没有结束伪操作,更正:加入:在第七、八行加入地址标志:加入:在第七、八行加入地址标志:start:原原23 end start执行执行PROCEDURE a将源程序修改如下:将源程序修改如下:data segmentout1 db Hello worldout2 db My name is DJXdata endscode segmentassume cs:code;ds:datastart:lea dx,out1mo
28、v ah,2int 21hmov dl,0ahmov ah,2int 21hmov dl,0dhmov ah,2int 21hlea dx,out2mov ah,9int 21hcode endsend start再次进行PROCEDURE b进行编译,屏幕显示:Microsoft(R)Macro Assembler Version 5.00Copyright(C)Microsoft Corp 1981-1985,1987.All rights reserved.Object filename error.OBJ:Source listing NUL.LST:Cross-reference N
29、UL.CRF:51524+406492 Bytes symbol space free0 Warning Errors0 Severe Errors本程序在语句上已无错误。再执行PROCEDURE d连接为可执行文件(link error回车),屏幕显示:Microsoft(R)Overlay Linker Version 3.60Copyright(C)Microsoft Corp 1983-1987.All rights reserved.Run File ERROR.EXE:List File NUL.MAP:Libraries.LIB:LINK:warning L4021:no sta
30、ck segment这时error.exe可执行文件已存在,可以执行PROCEDURE e来运行看一看是否正确在dos提示符下键入:error回车(小心!)屏幕显示:乱码,并死机。reset My computer!说明程序在逻辑上有错误,并且严重。这是就要用PROCEDURE f,用调试工具调试,查找错误。在DOS提示符下键入:debug error.exe回车屏幕出现-提示符,这时就可以用DEBUG的命令来找错误了,我首先用d命令来查看数据区和内容,发展所定义的两个字符串并不在数据段的段首,而在数据段内的100h位置上,这时才想起masm有一个不成文的规定,那就是在定义完数据段后,所定义的
31、变量均向后100h个单元,需要我们将ds段寄存器置位,在程序的start:后面加上如下指令:(执行PROCEDURE a)mov ax,datamov ds,ax再执行PROCEDURE b,PROCEDURE d,PROCEDURE e来运行程序,屏幕显示:换行My name is DJX及乱码,并死机。(又要重新启动!)再次执行PROCEDURE a检查程序,发现:1.汇编语言有规定每个字符串应由$结尾2.在输出第一个串的语句中的AH子功能号应为09H将以上两点改正。再执行PROCEDURE b,PROCEDURE d,PROCEDURE e来运行程序,屏幕显示:Hello worldMy
32、 name is DJX并死机,不能返回DOS原因分析,在程序中没有返回DOS的指令,更正:用PROCEDURE a来进行编辑:用DOS 21H中断的4cH子功能便可返回DOS,在code ends前加:mov ah,4chint 21h再执行PROCEDURE b,PROCEDURE d,PROCEDURE e来运行程序,屏幕显示:Hello wordMy name is DJXdata segmentout1 db Hello world$out2 db My name is DJX$data endscode segmentassume cs:code;ds:datastart:mov ax,datamov ds,axlea dx,out1mov ah,9int 21hmov dl,0ahmov ah,2int 21hmov dl,0dhmov ah,2int 21hlea dx,out2mov ah,9int 21hmov ah,4chint 21hcode endsend start