汇编语言上机指导及例示
来源:互联网 发布:淘宝店铺装修模板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
以上这个很简单只是为了介绍说明实现汇编语言上机编程及调试过程汇编语言须多练习才能掌握它特点以
- 汇编语言上机指导及例示
- 汇编语言上机指导及例示
- 汇编语言上机指导及例示
- 汇编语言上机指导及例示[转]
- 汇编语言上机指导及例示(7)
- 汇编语言实验指导教程及例示
- 《汇编语言程序设计》(双语)上机指导
- 第二次上机指导报告
- 第二次上机指导
- 第二次上机指导
- 第二次上机指导
- 第二次上机指导
- 第二次上机指导
- 第三次上机指导
- 题解与上机指导
- 数据结构上机指导
- 第一次程序上机指导(1)
- 第三次C语言上机指导
- 让 JSF 支持 multipart/form-data 编码类型的 POST 请求
- Ubuntu 10.10 :g++: Command not found
- css 悬浮div效果(兼容ie6)
- Facebook messages实现解读
- Necessitas–让你在 Android 上享受 Qt 的乐趣!
- 汇编语言上机指导及例示
- C语言趣味程序百例精解之JAVA实现(56)区分旅客国籍
- Oracle 中的Userenv()
- nginx做proxy对用户header的处理
- CFormView简介
- Struts2 ognl调用action有参数的方法
- 分析Ext.DataView结合Ext.Panel是怎么样输出数据
- shell读取文件方法大全
- Sql养成一个好习惯是一笔财富