汇编语言上机指导及例示

来源:互联网 发布:淘宝店铺装修模板350 编辑:程序博客网 时间:2024/06/05 09:29


  汇编语言上机过程:

  、上机前软件Software准备:

  MS-DOS操作系统(如:MSDOS6.22 , MSDOS7.0 等)

  文本编辑器 (如:EDIT.COM , TURBO.EXE , TC.EXE , C.EXE 等)

  汇编 (如:MASM.EXE , ASM.EXE 等)

  连接 (如:LINK.EXE 等)

  调试 (如:DEBUG.EXE 等)

   2、汇编建立过程:

a.建立汇编源─通过───→b.编译为目标文件─┬─→d.连接为可执行文件

│  c.不通过重新修改(语句)               ↓ 

├──────────────────────┘        ↓

↑   f.不正确用调试工具调试重新修改(逻辑)     ↓ 

└────────────────────────────←e运行

                                  ↓正确

                              g.完成   3、现在对( 2)每个标有字母过程

(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 中建立文件名)

  这时汇编输出文件可以有 3个(分别:.obj .lst .crf)便会出现 3次提问在这可以路回车即可下面显示信息是源

中个数如果为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 d 汇编内部出现逻辑

  2、Unknown symbol type 在符号语句类型中有些不能识别东西

  3、Symbol is multi-d 重复定义个符号

  4、Symbol not d 符号没有定义

  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或AL

  14、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 linker

  DUP嵌套太长以至于从连接不能得到所要记录

  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开始内容(以十 6进制显示)

  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,02h

  mov dl,41h

   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 world

  My name is DJX

  文件名:error.asm

  行号: 源代码:

1 data segment

2 out1 db 'Hello world'

3 ax db 'My name is DJX'

4 data ens

5

6 code segment

7 assume cs:code;ds:data

8 lea dx,out1

9 mov ah,2

10 21h

11

12 mov dl,0ah

13 mov ah,2

14 21h

15 mov dl,0dh

16 moo ah,2

17 21h

18

19 lea dx,ax

20 mov ah,

21 21h

22 code ends  在编辑完执行PROCEDURE b用masm进行编译:masm error回车后显示如下:

  Microsoft (R) Macro Assembler Version 5.00

  Copyright (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 file

  error.ASM(23): warning A4085: End of file, no END directive

  Open segments: DATA

  error.ASM(3): warning A4016: Reserved word used as symbol: AX

  error.ASM(4): error A2105: Expected: instruction or directive

  error.ASM(16): error A2105: Expected: instruction or directive

  error.ASM(19): error A2049: Illegal use of register

  End of file encountered on input file

  error.ASM(23): warning A4085: End of file, no END directive

  51566 + 406450 Bytes symbol space free

  2 Warning Errors

  4 Severe Errors

  介绍说明这个有并在第3,4,16,19,23行有错

  我们再执行PROCEDURE c去逐检查

  第 3行: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行:4 data ens

  这行为个段结束但语句漏打了字母更正:

  4 data ends

  第十 6行:16 moo ah,2

  这行也是语句打错更正:

  16 mov ah,2

  第 2十 3行:

  出错信息:error.ASM(23): warning A4085: End of file, no END directive

  介绍说明本没有结束伪操作更正:

  加入:在第 7、 8行加入地址标志: start:

  原23 end start

  执行PROCEDURE a将源修改如下:

data segment

out1 db 'Hello world'

out2 db 'My name is DJX'

data ends

code segment

assume cs:code;ds:data

start:

lea dx,out1

mov ah,2

21h

mov dl,0ah

mov ah,2

21h

mov dl,0dh

mov ah,2

21h

lea dx,out2

mov ah,9

21h

code ends

end start  再次进行PROCEDURE b进行编译屏幕显示:

  Microsoft (R) Macro Assembler Version 5.00

  Copyright (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 Errors

  0 Severe Errors

  本在语句上已无

  再执行PROCEDURE d连接为可执行文件(link error回车),屏幕显示:

  Microsoft (R) Overlay Linker Version 3.60

  Copyright (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回车(小心!!!)

  屏幕显示:乱码并死机re My computer!

  介绍说明在逻辑上有并且严重

  这是就要用PROCEDURE f,用调试工具调试查找

  在DOS提示符下键入:debug error.exe回车

  屏幕出现 - 提示符这时就可以用DEBUG命令来找了

  我首先用d命令来查看数据区和内容发展所定义两个串并不在数据段段首而在数据段内100h位置上这时才

想起masm有个不成文规定那就是在定义完数据段后所定义变量均向后100h个单元需要我们将ds段寄存器置位

在start:后面加上如下指令:(执行PROCEDURE a)

  mov ax,data

  mov 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 world

  My name is DJX并死机不能返回DOS

  原因分析在中没有返回DOS指令更正:

  用PROCEDURE a来进行编辑:

  用DOS 21H中断4cH子功能便可返回DOS在code ends前加:

  mov ah,4ch

   21h

  再执行PROCEDURE b,PROCEDURE d,PROCEDURE e来运行

  屏幕显示:

  Hello word

  My name is DJX

  并返回DOS

  成功!

  这样个就调试完成并正确

  下面是正确源:  data segment

out1 db 'Hello world$'

out2 db 'My name is DJX$'

data ends

code segment

assume cs:code;ds:data

start:

mov ax,data

mov ds,ax

lea dx,out1

mov ah,9

21h

mov dl,0ah

mov ah,2

21h

mov dl,0dh

mov ah,2

21h

lea dx,out2

mov ah,9

21h

mov ah,4ch

21h

code ends

end start

  以上这个很简单只是为了介绍说明实现汇编语言上机编程及调试过程汇编语言须多练习才能掌握它特点以