正文

汇编语言上机指导及例示[转]2005-09-24 12:32:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/wukong/5207.html

分享到:

 Content: 从如何建立源文件到进行调试作下简要的介绍,并配例题说明。由于本人水平有限,在下文在如有错误及可以进一步修改的地方请大家指出 汇编语言上机过程: 一、上机前的软件准备:MS-DOS操作系统(如:MSDOS6.22 , MSDOS7.0 等)文本编辑器 (如:EDIT.COM , TURBO.EXE , TC.EXE , C.EXE 等)汇编程序 (如:MASM.EXE , ASM.EXE 等)连接程序 (如:LINK.EXE 等)调试程序 (如:DEBUG.EXE 等) 二、汇编程序建立过程:   a.建立汇编源程序─通过───→b.编译为目标文件─ ↓┬─→d.连接为可执行文件  ↑                          │  c.不通过,重新修改(语句错误)               ↓   ├──────────────────────┘        ↓  ↑   f.不正确,用调试工具调试,重新修改(逻辑错误)     ↓   └────────────────────────────←e运行                                 ↓正确                              g.完成 三、现在对(二)的每一个标有字母的过程(PROCEDURE)进行详细说明 PROCEDURE a:建立汇编源程序(即:建立 文件名.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的形式即可。 PROCEDURE b:编译目标文件(即:编译为.obj .lst .crf文件)这个过程计算机将把你编的正确的源代码编译为机器语言、程序清单及交叉引用表的目标文件。如果此时你的程序有语句错误,系统将报错,并指出在第几行,什么类型的错误,你可根据提示去逐一修改。现介绍具体过程:在DOS提示符下键入MASM filename回车(注:你系统内的汇编程序为MASM.EXE,如果你系统的汇编程序为ASM.EXE时,便将命令变为ASM filename回车。其中filename为你刚才在PROCEDURE a 中建立的文件名)这时汇编程序的输出文件可以有三个(分别:.obj .lst .crf),便会出现三次提问,在这可以一路回车即可。下面显示的信息是源程序中的错误个数,如果为0则表示顺利通过,就可进行进程c。但如果不为0就说明有错误,并指出错误出现的行,可依据这个提示去进行修改。但如果错误太多还未等看清就显示过去了,可用如下命令形将错误信息存于一个你指定的文件,再用文本编辑器去查看。 MASM filename >filen (filen为你起的一个没用过的文件名,用以存放出错信息)以后可查看filen来得到出错信息。 PROCEDURE c:编译不通过,重新修改(错误类型:源程序语句不合法)在执行过PROCEDURE b后,如有出错信息时,就要我们自己按PROCEDURE c去做,而不能跳跃到PROCEDURE d去,如果强行执行PROCEDURE d将无任何有效结果。现在就开现找错吧!首先要清楚,在PROCEDURE b中检测出的错误均为每一条语句的语法或用法错误,它并不能检测出程序的逻辑设计(语句按排位置)错误,所以就要记好出错的行号。在记录行号后,就应再次执行PROCEDURE a,这时和操作应是打开已编好的源程序(以EDIT为例:在DOS提示符下键入:EDIT filename.asm回车),依据行号进行修改并存盘,再次进行汇编,直至PROCEDURE b通过为止。便可继续向下执行PROCEDURE 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企图非法使用一个汇编程序的保留字(例:定义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、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 试图非法使用CS寄存器18、DUP is too large for linkerDUP嵌套太长,以至于从连接程序不能得到所要的记录 PROCEDURE d:连接为可执行文件(即:连接为.exe 或.com文件)在这个过程中一般没有意外,如果有也就是文件名打错了。形式:在DOS提示符下: LINK filename 回车 PROCEDURE e:运行编译好的可执行文件当PROCEDURE d通过后,会产生一个可执行文件,这时只需运行这个程序,看它是否按你所想象那样得出结果。在试运行期间,要尽量试一些临界状态,看 程序是否运行稳定、结果是否正确。如一切正常,便可进入PROCEDURE g了。可最怕的是不OK,程序产生一些莫名其妙的结果(你可不要以为是你的计算机不听你的指挥,其实它是在一丝不苟地按照你编的程序执行。我以前总以为我的计算机出了毛病),如果是在考场上这时千万不要慌,稳住自己的情绪,先不要看计算机,静几分钟(反正时间多得是)。这时就要用到最关键、最常用的一步了,进行PROCEDURE f 。 PROCEDURE f:用调试工具调试,重新修改(逻辑错误)在这我将介绍用DOS中自带的调试程序DEBUG.EXE来进行程序调试、检查错误.首先我们要了解DEBUG的基本用法: 1、用于调试程序时的输入格式:DEBUG FILENAME.??? 回车其中FILENAME是主文件名,???是扩展文件名,例如我们在此前已编译好了一个文件,它的名子为:djx.exe 要对它进行调试时就在DOS提示符下打:DEBUG djx.exe 回车,便可见到 '-' 提示符,如无任何提示说明正确,可进行调试。2、DEBUG调试过程中用到的DEBUG命令介绍:(注:在指令中用 [] 括起来的内容可缺省)1)D(Dump)显示指定内存单元内容(一般用来看数据数的内容,即DS段):格式:d[地址] 从[地址]指定的内存单元显示128个字节的内容[地址]缺省时,显示上一个DUMP命令后面的内容 d 地址范围 显示指定范围内的内存内容。示例:-d100 显示从DS段100H开始的内容(以十六进制显示) 2)E(Enter)修改存储单元内容(一般在DS段)格式:e 地址 [数据] 用给定的[数据]代替指定范围的存储单元内容e 地址 修改一个指定内存单元的内容示例:-e ds:200 'djx'FF00AA 就可将DS段从200开始至205的内容替换为64 6A 78 FF 00 AA 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]示例: mov ah,02hmov dl,41hint 21h此时用: -p 回车后系统将显示一个字符A,如果在这不用P,而改用T,那么系统将进入INT 21H的中断调用中,出不来,这时你会误以为你的程序编错了,一定注意!! 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中还有其它命令,在检查程序中不会用到,就不再介绍了。 PROCEDURE g:程序编好,那就一切OK!!!交卷过关了!大吃、大睡。 下面给出一个有病句的程序,希望大家和我一起调试、修改并通过:先执行PROCEDURE a编辑源程序实现功能:在屏幕上显示:Hello worldMy name is DJX文件名:error.asm行号: 源程序代码: 1 data segment2 out1 db 'Hello world'3 ax db 'My name is DJX'4 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 int 21h1819 lea dx,ax20 mov ah,21 int 21h22 code ends 在编辑完执行PROCEDURE b用masm进行编译:masm error回车后显示如下: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 [NUL.CRF]:End of file encountered on input fileerror.ASM(23): warning A4085: End of 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 fileerror.ASM(23): warning A4085: End of file, no END directive 51566 + 406450 Bytes symbol space free 2 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'注意刚才我们定义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第二十三行:出错信息:error.ASM(23): warning A4085: End of file, no END directive说明本程序没有结束伪操作,更正:加入:在第七、八行加入地址标志: start:原23 end start 执行PROCEDURE a将源程序修改如下: data segmentout1 db 'Hello world'out2 db 'My name is DJX'data ends code segmentassume cs:code;ds:datastart:lea dx,out1mov ah,2int 21h mov dl,0ahmov ah,2int 21hmov dl,0dhmov ah,2int 21h lea 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 [NUL.CRF]:51524 + 406492 Bytes symbol space free 0 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 stack segment 这时error.exe可执行文件已存在,可以执行PROCEDURE e来运行看一看是否正确在dos提示符下键入:error回车(小心!!!)屏幕显示:乱码,并死机。reset My computer!说明程序在逻辑上有错误,并且严重。这是就要用PROCEDURE f,用调试工具调试,查找错误。在DOS提示符下键入:debug error.exe回车屏幕出现 - 提示符,这时就可以用DEBUG的命令来找错误了,我首先用d命令来查看数据区和内容,发展所定义的两个字符串并不在数据段的段首,而在数据段内的100h位置上,这时才想起masm有一个不成文的规定,那就是在定义完数据段后,所定义的变量均向后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 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 DJX并返回DOS成功!这样一个程序就调试完成,并正确。下面是正确的源程序: data segmentout1 db 'Hello world$'out2 db 'My name is DJX$'data ends code segmentassume cs:code;ds:datastart:mov ax,datamov ds,ax lea dx,out1mov ah,9int 21h mov dl,0ahmov ah,2int 21hmov dl,0dhmov ah,2int 21h lea dx,out2mov ah,9int 21h mov ah,4chint 21hcode endsend start 以上这个程序很简单,只是为了说明实现汇编语言的上机编程及调试过程,汇编语言须多练习才能掌握它的特点,以便顺利通过考试

阅读(2894) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册