📄 e路阳光 - 编程专区 - 汇编语言上机指导及例示 天天好心情!.htm
字号:
<BR>汇编语言上机过程: <BR>一、上机前的软件准备:<BR>MS-DOS操作系统(如:MSDOS6.22
, MSDOS7.0 等)<BR>文本编辑器 (如:EDIT.COM , TURBO.EXE , TC.EXE
, C.EXE 等)<BR>汇编程序 (如:MASM.EXE , ASM.EXE 等)<BR>连接程序
(如:LINK.EXE 等)<BR>调试程序 (如:DEBUG.EXE
等)<BR>二、汇编程序建立过程:<BR> <BR><BR>a.建立汇编源程序─通过───→b.编译为目标文件─ ↓┬─→d.连接为可执行文件<BR> ↑
<BR> │ c.不通过,重新修改(语句错误)
↓ <BR> ├──────────────────────┘
↓<BR> ↑ f.不正确,用调试工具调试,重新修改(逻辑错误)
↓ <BR> └────────────────────────────←e运行<BR>
↓正确<BR>
g.完成<BR><BR>三、现在对(二)的每一个标有字母的过程(PROCEDURE)进行详细说明<BR>PROCEDURE
a:建立汇编源程序(即:建立
文件名.asm)<BR>这个过程就相当于我们在纸上编写源程序代码一样,只不过是将纸变为了计算机,这个过程也称源代码录入。将源程序代码录入计算机的方法很多,下面将介绍具体方法。
<BR>1.通过MD-DOS自带的EDIT.EXE文本编辑器进行输入,在DOS提示符下键入:EDIT回车,这时如果你系统内可调用时,EDIT的操作画面便会出现在屏幕上,你就可在提示下进行录入了,当录入完毕后,选择存盘并给你输入的文件起一个文件名,形式:filename.asm
;(其中filename为你起的文件名,由1-8个字符组成),asm
是为汇编程序识别而必须加上去的,不可更改。存盘后在DOS下可用DOS命令DIR来查看,如果看到了所存的文件存在,就可以进行进程b。<BR>2.如果你的系统中没有EDIT,也可用你所熟悉的文本编辑器进行录入、编辑,如可用c语言和pascal语言的文本编辑器来编辑,最后将文件存为filename.asm的形式即可。<BR>PROCEDURE
b:编译目标文件(即:编译为.obj .lst
.crf文件)<BR>这个过程计算机将把你编的正确的源代码编译为机器语言、程序清单及交叉引用表的目标文件。如果此时你的程序有语句错误,系统将报错,并指出在第几行,什么类型的错误,你可根据提示去逐一修改。现介绍具体过程:<BR>在DOS提示符下键入MASM
filename回车<BR>(注:你系统内的汇编程序为MASM.EXE,如果你系统的汇编程序为ASM.EXE时,便将命令变为ASM
filename回车。其中filename为你刚才在PROCEDURE a
中建立的文件名)<BR>这时汇编程序的输出文件可以有三个(分别:.obj .lst
.crf),便会出现三次提问,在这可以一路回车即可。下面显示的信息是源程序中的错误个数,如果为0则表示顺利通过,就可进行进程c。但如果不为0就说明有错误,并指出错误出现的行,可依据这个提示去进行修改。但如果错误太多还未等看清就显示过去了,可用如下命令形将错误信息存于一个你指定的文件,再用文本编辑器去查看。
MASM filename &gt;filen
(filen为你起的一个没用过的文件名,用以存放出错信息)以后可查看filen来得到出错信息。<BR>PROCEDURE
c:编译不通过,重新修改(错误类型:源程序语句不合法)<BR>在执行过PROCEDURE
b后,如有出错信息时,就要我们自己按PROCEDURE c去做,而不能跳跃到PROCEDURE
d去,如果强行执行PROCEDURE
d将无任何有效结果。<BR>现在就开现找错吧!首先要清楚,在PROCEDURE
b中检测出的错误均为每一条语句的语法或用法错误,它并不能检测出程序的逻辑设计(语句按排位置)错误,所以就要记好出错的行号。在记录行号后,就应再次执行PROCEDURE
a,这时和操作应是打开已编好的源程序(以EDIT为例:在DOS提示符下键入:<BR>EDIT
filename.asm回车),依据行号进行修改并存盘,再次进行汇编,直至PROCEDURE
b通过为止。便可继续向下执行PROCEDURE
d。<BR>下面给出一些常见出错信息,以便查对:<BR>1、Register already defined
汇编内部出现逻辑错误<BR>2、Unknown symbol type
在符号语句的类型中,有些不能识别的东西<BR>3、Symbol is multi-defined
重复定义一个符号<BR>4、Symbol not defined 符号没有定义<BR>5、Syntax
error 语句的语法与任何可识别的语法不匹配<BR>6、Symbol is reserved
word<BR>企图非法使用一个汇编程序的保留字(例:定义add为一变量)<BR>7、Not proper
align/combine type SEGMENT参数不正确<BR>8、One operand must be
const 这是加法指令的非法使用<BR>9、Operands must be same or 1 abs
这是减法指令的非法使用<BR>10、Already have base register
试图重复基地址<BR>11、Illegal size for item
引用的项的长度是非法的,(如:双字移位)<BR>12、Illegal register value
指定的寄存器值不能放入“reg” 字段<BR>13、Must be AX or AL
某些指令只能用AX或AL<BR>14、Improper use of segment reg
段寄存器使用不合法(如:mov ds,0)<BR>15、Division by 0 or overflow
给出一个用0作除数的表达式<BR>16、value is out of range
数值大于需要使用的<BR>17、CS register illeal usage
试图非法使用CS寄存器<BR>18、DUP is too large for
linker<BR>DUP嵌套太长,以至于从连接程序不能得到所要的记录<BR>PROCEDURE
d:连接为可执行文件(即:连接为.exe
或.com文件)<BR>在这个过程中一般没有意外,如果有也就是文件名打错了。<BR>形式:在DOS提示符下:
LINK filename 回车<BR>PROCEDURE
e:运行编译好的可执行文件<BR>当PROCEDURE
d通过后,会产生一个可执行文件,这时只需运行这个程序,看它是否按你所想象那样得出结果。在试运行期间,要尽量试一些临界状态,看
程序是否运行稳定、结果是否正确。如一切正常,便可进入PROCEDURE
g了。<BR>可最怕的是不OK,程序产生一些莫名其妙的结果(你可不要以为是你的计算机不听你的指挥,其实它是在一丝不苟地按照你编的程序执行。我以前总以为我的计算机出了毛病),如果是在考场上这时千万不要慌,稳住自己的情绪,先不要看计算机,静几分钟(反正时间多得是)。这时就要用到最关键、最常用的一步了,进行PROCEDURE
f 。<BR>PROCEDURE
f:用调试工具调试,重新修改(逻辑错误)<BR>在这我将介绍用DOS中自带的调试程序DEBUG.EXE来进行程序调试、检查错误.<BR>首先我们要了解DEBUG的基本用法:
<BR>1、用于调试程序时的输入格式:<BR>DEBUG FILENAME.???
回车<BR>其中FILENAME是主文件名,???是扩展文件名,例如我们在此前已编译好了一个文件,它的名子为:djx.exe
要对它进行调试时就在DOS提示符下<BR>打:DEBUG djx.exe 回车,便可见到 '-'
提示符,如无任何提示说明正确,可进行调试。<BR>2、DEBUG调试过程中用到的DEBUG命令介绍:<BR>(注:在指令中用
[]
括起来的内容可缺省)<BR>1)D(Dump)显示指定内存单元内容(一般用来看数据数的内容,即DS段):<BR>格式:d[地址]
从[地址]指定的内存单元显示128个字节的内容<BR>[地址]缺省时,显示上一个DUMP命令后面的内容
<BR>d 地址范围 显示指定范围内的内存内容。<BR>示例:-d100
显示从DS段100H开始的内容(以十六进制显示)<BR>2)E(Enter)修改存储单元内容(一般在DS段)<BR>格式:e
地址 [数据] 用给定的[数据]代替指定范围的存储单元内容<BR>e 地址
修改一个指定内存单元的内容<BR>示例:-e ds:200 'djx'FF00AA
就可将DS段从200开始至205的内容替<BR>换为64 6A 78 FF 00
AA<BR>3)G(GO)运行命令<BR>格式:-g [=地址][断点地址1 [断点地址2
...[断点地址10]]]<BR>从指定[地址]开始执行程序(如地址缺省从当前CS:IP开始),运行至[断点地址1]停止,显示所有寄存器及标志位内容与下一条指令,如后面还有断点,可键入g,继续执行。<BR>示例:-g001a
则执行从当前cs:ip至001a的指令<BR>注意:地址设置必须从指令的第一字节设起。<BR>4)T(Trace)执行一条语句<BR>格式:
-t [=地址]
从指定[地址]起执行一条语句后停下来,显示所有寄存器内容及标志位的值与下一条指令。如[地址]缺省则从当前CS:IP开始执行<BR>-t
[=地址][value]
从指定地址起执行value条指令后停止。<BR>5)P(proceed)执行一个循环;一个软中断或call子过程<BR>格式:-p
[=地址][n]<BR>示例: mov ah,02h<BR>mov dl,41h<BR>int
21h<BR>此时用: -p 回车后系统将显示一个字符A,如果在这不用P,而改用T,那么系统将进入INT
21H的中断调用中,出不来,这时你会误以为你的程序编错了,一定注意!!<BR>6)R(register)显示并可修改寄存器内容<BR>格式:-r
显示所有寄存器内容<BR>-r 寄存器名
修改指定寄存器内容(可改:AX,BX,CX,DX,SP,<BR>BP,SI,DI,CS,DS,ES,SS,PC,IP,F)<BR>7)U(Unassemble)反汇编<BR>格式:-u
[地址] 从指定[地址]反汇编32个字节,若[地址]缺省则从当前地址汇编32个字节。<BR>-u 地址范围
对指定范围内的存储单元进行反汇编<BR>以上是在调试程序中可能用到的DEBUG命令解释,DEBUG中还有其它命令,在检查程序中不会用到,就不再介绍了。<BR>PROCEDURE
g:程序编好,那就一切OK!!!交卷过关了!大吃、大睡。<BR>下面给出一个有病句的程序,希望大家和我一起调试、修改并通过:<BR>先执行PROCEDURE
a编辑源程序<BR>实现功能:在屏幕上显示:Hello world<BR>My name is
DJX<BR>文件名:error.asm<BR>行号: 源程序代码:<BR>1 data
segment<BR>2 out1 db 'Hello world'<BR>3 ax db 'My name
is DJX'<BR>4 data ens<BR>5<BR>6 code segment<BR>7 assume
cs:code;ds:data<BR>8 lea dx,out1<BR>9 mov ah,2<BR>10 int
21h<BR>11<BR>12 mov dl,0ah<BR>13 mov ah,2<BR>14 int
21h<BR>15 mov dl,0dh<BR>16 moo ah,2<BR>17 int
21h<BR>18<BR>19 lea dx,ax<BR>20 mov ah,<BR>21 int
21h<BR>22 code ends<BR>在编辑完执行PROCEDURE b用masm进行编译:masm
error回车后显示如下:<BR>Microsoft (R) Macro Assembler Version
5.00<BR>Copyright (C) Microsoft Corp 1981-1985, 1987.
All rights reserved.<BR>Object filename
[error.OBJ]:<BR>Source listing
[NUL.LST]:<BR>Cross-reference [NUL.CRF]:<BR>End of file
encountered on input file<BR>error.ASM(23): warning
A4085: End of file, no END directive<BR>Open segments:
DATA<BR>error.ASM(3): warning A4016: Reserved word used
as symbol: AX<BR>error.ASM(4): error A2105: Expected:
instruction or directive<BR>error.ASM(16): error A2105:
Expected: instruction or directive<BR>error.ASM(19):
error A2049: Illegal use of register<BR>End of file
encountered on input file<BR>error.ASM(23): warning
A4085: End of file, no END directive<BR>51566 + 406450
Bytes symbol space free<BR>2 Warning Errors<BR>4 Severe
Errors<BR>说明这个程序有错误,并在第3,4,16,19,23行有错,<BR>我们再执行PROCEDURE
c去逐一检查<BR>第三行:3 ax db 'My name is
DJX'<BR>它的错误在于AX不能作为变量名,更正:<BR>3 out2 db 'My name is
DJX'<BR>注意刚才我们定义AX为变量时在后面的程序中用过'变量AX'在第19行<BR>19 lea
dx,ax<BR>在出错报告中也报第19行错,因为不能将AX的有效地址赋给DX,更正:<BR>19 lea
dx,out2<BR>这样一下就解决了两个错误<BR>第四行:4 data
ens<BR>这行为一个段的结束,但语句漏打了字母,更正:<BR>4 data ends<BR>第十六行:16
moo ah,2<BR>这行也是语句打错,更正:<BR>16 mov
ah,2<BR>第二十三行:<BR>出错信息:error.ASM(23): warning A4085: End
of file, no END
directive<BR>说明本程序没有结束伪操作,更正:<BR>加入:在第七、八行加入地址标志:
start:<BR>原23 end start<BR>执行PROCEDURE
a将源程序修改如下:<BR>data segment<BR>out1 db 'Hello
world'<BR>out2 db 'My name is DJX'<BR>data ends<BR>code
segment<BR>assume cs:code;ds:data<BR>start:<BR>lea
dx,out1<BR>mov ah,2<BR>int 21h<BR>mov dl,0ah<BR>mov
ah,2<BR>int 21h<BR>mov dl,0dh<BR>mov ah,2<BR>int
21h<BR>lea dx,out2<BR>mov ah,9<BR>int 21h<BR>code
ends<BR>end start<BR>再次进行PROCEDURE
b进行编译,屏幕显示:<BR>Microsoft (R) Macro Assembler Version
5.00<BR>Copyright (C) Microsoft Corp 1981-1985, 1987.
All rights reserved.<BR>Object filename
[error.OBJ]:<BR>Source listing
[NUL.LST]:<BR>Cross-reference [NUL.CRF]:<BR>51524 +
406492 Bytes symbol space free<BR>0 Warning Errors<BR>0
Severe Errors<BR>本程序在语句上已无错误。<BR>再执行PROCEDURE
d连接为可执行文件(link error回车),屏幕显示:<BR>Microsoft (R) Overlay
Linker Version 3.60<BR>Copyright (C) Microsoft Corp
1983-1987. All rights reserved.<BR>Run File
[ERROR.EXE]:<BR>List File [NUL.MAP]:<BR>Libraries
[.LIB]:<BR>LINK : warning L4021: no stack
segment<BR>这时error.exe可执行文件已存在,可以执行PROCEDURE
e来运行看一看是否正确<BR>在dos提示符下键入:error回车(小心!!!)<BR>屏幕显示:乱码,并死机。reset
My computer!<BR>说明程序在逻辑上有错误,并且严重。<BR>这是就要用PROCEDURE
f,用调试工具调试,查找错误。<BR>在DOS提示符下键入:debug error.exe回车<BR>屏幕出现
-
提示符,这时就可以用DEBUG的命令来找错误了,<BR>我首先用d命令来查看数据区和内容,发展所定义的两个字符串并不在数据段的段首,而在数据段内的100h位置上,这时才想起masm有一个不成文的规定,那就是在定义完数据段后,所定义的变量均向后100h个单元,需要我们将ds段寄存器置位,在程序的start:后面加上如下指令:(执行PROCEDURE
a)<BR>mov ax,data<BR>mov ds,ax<BR>再执行PROCEDURE
b,PROCEDURE d,PROCEDURE e来运行程序,<BR>屏幕显示:<BR>换行<BR>My
name is DJX及乱码,并死机。(又要重新启动!)<BR>再次执行PROCEDURE
a检查程序,发现:<BR>1.汇编语言有规定每个字符串应由$结尾<BR>2.在输出第一个串的语句中的AH子功能号应为09H<BR>将以上两点改正。<BR>再执行PROCEDURE
b,PROCEDURE d,PROCEDURE e来运行程序,<BR>屏幕显示:<BR>Hello
world<BR>My name is
DJX并死机,不能返回DOS<BR>原因分析,在程序中没有返回DOS的指令,更正:<BR>用PROCEDURE
a来进行编辑:<BR>用DOS 21H中断的4cH子功能便可返回DOS,在code ends前加:<BR>mov
ah,4ch<BR>int 21h<BR>再执行PROCEDURE b,PROCEDURE
d,PROCEDURE e来运行程序,<BR>屏幕显示:<BR>Hello word<BR>My name is
DJX<BR>并返回DOS<BR>成功!<BR>这样一个程序就调试完成,并正确。<BR>下面是正确的源程序:<BR>data
segment<BR>out1 db 'Hello world$'<BR>out2 db 'My name is
DJX$'<BR>data ends<BR>code segment<BR>assume
cs:code;ds:data<BR>start:<BR>mov ax,data<BR>mov
ds,ax<BR>lea dx,out1<BR>mov ah,9<BR>int 21h<BR>mov
dl,0ah<BR>mov ah,2<BR>int 21h<BR>mov dl,0dh<BR>mov
ah,2<BR>int 21h<BR>lea dx,out2<BR>mov ah,9<BR>int
21h<BR>mov ah,4ch<BR>int 21h<BR>code ends<BR>end
start<BR>以上这个程序很简单,只是为了说明实现汇编语言的上机编程及调试过程,汇编语言须多练习才能掌握它的特点,以便顺利通过考试<BR></TD></TR>
<TR>
<TD vAlign=bottom><IMG
src="E路阳光 - 编程专区 - 汇编语言上机指导及例示 天天好心情!.files/sigline.gif"><BR>和你的年纪、差了一个音阶。
<BR>对是否能吹响它、我感到非常的不安...。 <BR>在吹着熟悉的海风的夜晚、你所弹的风琴的音色反映着月光。
<BR>就这样、分离的指尖、碎掉的四叶草、打开了弧光街道的门扉。 <BR>
<OBJECT id=RAOCX height=60 width=253
classid=clsid:CFCDAA03-8BE4-11CF-B84B-0020AFBBCCFA><PARAM NAME="_ExtentX" VALUE="6694"><PARAM NAME="_ExtentY" VALUE="1588"><PARAM NAME="AUTOSTART" VALUE="0"><PARAM NAME="SHUFFLE" VALUE="0"><PARAM NAME="PREFETCH" VALUE="0"><PARAM NAME="NOLABELS" VALUE="0"><PARAM NAME="SRC" VALUE="http://bbs.elyg.org/UploadFile/xiny.mp3"><PARAM NAME="CONTROLS" VALUE="StatusBar,ControlPanel"><PARAM NAME="LOOP" VALUE="0"><PARAM NAME="NUMLOOP" VALUE="0"><PARAM NAME="CENTER" VALUE="0"><PARAM NAME="MAINTAINASPECT" VALUE="0"><PARAM NAME="BACKGROUNDCOLOR" VALUE="#000000">
<embed src="http://bbs.elyg.org/UploadFile/xiny.mp3"
width="253" autostart="true"
height="60"></embed></OBJECT><BR><A
onclick="return eggconfirm();"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -