汇编语言程序设计实习指导书
编者 田晶
西北农林科技大学信息工程学院
2015年11月
汇编语言程序设计 实习指导书
前 言
《汇编语言程序设计》是高校计算机专业的一门重要的必修课,而且是非计算机专业学生学习《微机原理与应用》的必要先修课,它是计算机能提供给用户的执行速度最快而又最有效的编程语言,也是能够利用计算机所有硬件特性并能直接控制硬件设备的唯一语言,是进入硬件领域进行计算机控制的一块铺路石。在《汇编语言》的教学实践中,学生普遍感到该课比较难学,主要与该课程的下列特点有关:
①《汇编语言》与计算机硬件有关(主要是CPU中寄存器和存储器)。 ②汇编指令系统指令较多,语法规则多且严格,难学难记。 ③汇编语言输入/输出功能弱,不直观,程序难以调试。 ④汇编指令中操作数来源广(寄存器、内存、I/O端口),且不好理解。 因此,要学好汇编语言,必须注意一下几点:
⑴掌握《汇编语言》中与计算机硬件有关的部分内容(主要是CPU中的寄存器和I/O端口寄存器),特别注意“状态标志寄存器”各个状态位的设置与应用。 ⑵掌握好CPU的内存管理方法(主要是内存物理地址的形成方法)。 ⑶掌握好寻址方式(寻找指令中操作数的方法)。 ⑷掌握汇编程序的结构组成(分段结构) ⑸熟练掌握DEBUG调试程序的应用。 ⑹加强上机实习。
《汇编语言》与其它高级语言一样,实践性很强,只有通过上机实习,才能理解这门课的内容,掌握好这门课程序设计方法和技术,为了配合这们课的学习,我们编写了这本实习指导书,希望通过这门课的实践,对掌握汇编语言程序设计方法,提高实验技能,起到抛砖引玉的作用。
编者 2015年10月
共20页 第 1 页
汇编语言程序设计 实习指导书
目 录
实验一 汇编语言程序设计上机步骤---------------------------3 实验二 DOS子功能调用-------------------------------------14 实验三 实验四 实验五 实验六 实验七 实验八 附录
共20页 顺序程序设计---------------------------------------15 分支程序设计---------------------------------------16 循环程序设计---------------------------------------17 子程序设计-----------------------------------------18 中断处理子程序设计---------------------------------19 综合程序设计---------------------------------------20 动态调试程序DEBUG---------------------------------21
第 2 页
汇编语言程序设计 实习指导书
实验一、汇编语言程序设计上机步骤
一、 实习目的
⑴ 熟悉汇编程序的上机实习过程。 ⑵ 了解汇编程序的基本构成。
二、实验环境
⑴硬件环境 ⑵软件环境
①Windows98/2000/xp操作系统
②任一种文本编辑器(EDIT、NOTEPAD(记事本)、写字版、WORD等) ③宏汇编程序(MASM.EXE) ④连接程序(LINK.EXE)
⑤调试程序(DEBUG.EXE或TD.EXE)
微型计算机(Intel x86系列CPU)1台。
三、实习内容
在计算机上运行汇编语言程序的步骤是:
(1) 用编辑程序建立汇编语言源程序(.ASM源文件)
首先用编辑程序(可用任一种文本编辑程序,如EDIT等)产生汇编语言的源程序(类型为.ASM的源文件)。
(2) 用MASM程序把汇编语言源程序( .ASM文件)转汇编成汇编目标文件( .OBJ文件)
源程序就是用汇编语言的语句编写的程序,它是不能为机器直接识别的,所以要经过汇编程序(MASM)进行翻译。汇编程序的作用就是把源文件转换成二进制代码形式的目标文件(.OBJ文件)。在转换的过程中,汇编程序将对源程序进行扫描,如果源程序中有语法错误,则汇编结束后,汇编程序将指出源程序中的错误,要求用户再次使用编辑程序来修改源程序中的错误后继续汇编,直至得到无语法错误的汇编目标文件( .OBJ文件),表示汇编通过。
汇编程序的主要功能是:
① 检查源程序语法是否正确。
② 测出源程序中的语法错误,并给出出错信息。
③ 产生源程序的目标程序,并可给出列表文件(同时列出汇编语言和机器语言的文件,称为 .LST文件)。
④ 展开宏指令。
(3) 用LINK程序把汇编目标文件( .OBJ文件)转连接成可执行文件( .EXE文件)
经过汇编产生的汇编目标文件(.OBJ文件)虽然已经是二进制文件,但它还不能直接上机运行,必须经过连接程序LINK把目标文件与库文件或其他目标文件连接在一起形成可执行文件(.EXE文件),才能在计算机上直接执行。
(4) 用DOS命令直接键入文件名就可执行该程序
经过连接产生的可执行文件(.EXE文件)已经是可以直接上机运行的二进制文件,运行这个文件可以由DOS装入存储器,并在机器上运行。
共20页 第 3 页
汇编语言程序设计 实习指导书
(5) 用DEBUG调试该程序
运行后如果发现运行结果不对,则程序有逻辑错误,这时候可用动态调试程序DEBUG调试该可执行程序(.EXE文件),找出程序的错误之处,再重新进行源程序的编辑、汇编和连接等工作。具体Debug调试命令见附录(动态调试程序Debug)。
四、上机步骤
⒈制作汇编语言系统盘
盘上应包括下列程序
①宏汇编程序(MASM.EXE) ②连接程序(LINK.EXE)
③调试程序(DEBUG.EXE或TD.EXE) ④编辑软件(EDIT.EXE)
也可以在硬盘上建立汇编语言文件夹。
如下例子均在硬盘D区建立文件夹ASM,文件夹下包括宏汇编程序(MASM.EXE)和连接程序(LINK.EXE)即可,编辑软件EDIT.EXE和调试程序DEBUG.EXE系统已有。
⒉在DOS系统下进入文件夹ASM
启动→开始→程序→附件→命令提示符 C>D:
D>CD ASM
⒊用编辑程序建立汇编源程序文件(.ASM①通过编辑软件EDIT.EXE建立。 D>EDIT OUTCHAR.ASM
源文件)
图2 EDIT.EXE编辑软件主界面
注意:I、进入各菜单“Alt键+各菜单名打头字符”(如进入File菜单Alt+F) II、程序输入完毕保存在软盘A(作业盘)上。 III、汇编源程序文件名扩展名为.ASM。
共20页 第 4 页
汇编语言程序设计 实习指导书
②通过编辑软件NOTEPAD(记事本)建立。 开始→程序→附件→记事本
图3 NOTEPAD(记事本)编辑软件主界面
在编辑软件中录入要输入汇编语言源程序,并予以保存(文件扩展名为ASM)。 例1:若在屏幕上连续显示字符0123456789的源程序如下:
NAME EX_06_1 ;OUTP UT CHARACTER 0-9 STACK SEGMENT PARA STACK ′STACK′ STAPN DB 100 DUP(?)
TOP EQU LENGTH STAPN
STACK ENDS COSEG SEGMENT
ASSUME CS:COSEG, SS:STACK START: MOV AX, STACK MOV SS, AX MOV AX, TOP MOV SP, AX MOV BL, 0 PUSH BX
GOON: MOV DL, 20H
MOV AH, 2 INT 21H POP BX
MOV AL, BL INC AL DAA
AND AL, 0FH MOV BL, AL PUSH BX
OR AL, 30H
MOV DL, AL MOV AH, 2 INT 21H
MOV CX, 0FFFFH
共20页 第 5 页
汇编语言程序设计 实习指导书
AGAIN: DEC CX
JNE AGAIN JMP GOON COSEG ENDS
END START
录入以上程序,并以文件名OUTCHAR.ASM予以保存在文件夹ASM下。
⒋用宏汇编程序MASM.EXE程序将刚建立汇编源程序成 汇编目标文件(OUTCHAR..OBJ)
OUTCHAR.ASM
汇编
⑴调用宏汇编程序MASM对源程序进行汇编
D>MASM OUTCHAR
Copyright(C)Microsoft Crop 1981-1985, 1987, All rights reserved. Object filename[outchar.OBJ]:
①Object filename为目标文件名, 可以采用方括号内的文件名, 也可以重新输入一个文件名。 ②Source listing要求输入源列表文件名, 当不要求产生.LST文件时, 可用回车回答, 也可输入一个列表文件名。 (本例假设输入OUTCHAR文件名,在汇编后产生OUTCHAR.LST)
③Cross-Reference要求输入索引文件名。 回答方法类似于源列表文件名情况。 但.CRF文件不是文本文件, 不能用TYPE命令列出。 若要求能阅读, 必须将索引文件(二进制形式的文件)变换为索引列表文件(文本文件)。 方法是执行程序CREF.EXE, 将索引文件变换为索引列表文件(.REF)。 操作步骤是:
D>CREF
Cref Filename[.CRF]:OUTCHAR
List Filename[outchar.REF]:OUTCHAR
⒌利用LINK程序将汇编目标文件OUTCHAR.OBJ连接生成可执行的文件(OUTCHAR.EXE)
D>LINK OUTCHAR.OBJ
IBM Personal Computer Linker
Version 2.10(C)Copyright IBM Corp 1981, 1982, 1983 Run File[outchar.EXE]:
共20页 第 6 页
汇编语言程序设计 实习指导书
D> 其中:
Run File是生成可执行的文件名(.EXE)。
List File是生成MAP LIST(清单列表)文件的文件名。 如有省略, 则不生成MAP LIST文件。 MAP LIST文件可用TYPE命令显示出来,通过此文件,可以了解程序中各个段的内存分布情况。 D>TYPE OUTCHAR.MAP
Start Stop Length Name Class 0000H 0002DH 0002EH COSEG
00030H 00093H 00064H STACK ′STACK′ Origin Group D>
由.MAP文件可以看到各逻辑段存放在内存中的位置, 其中, COSEG段, 从00000H开始, 至0002DH单元结束; 而STACK段, 则从00030H开始至00093H结束. 因为是PARA, 所以, 从被16 整除的边界(最后一位十六进制数地址是 0)开始。
⒍利用DEBUG程序调试OUTCHAR.EXE程序
一般情况下, 经过一次汇编就能顺利通过的应用程序往往是较少的,对一个大的程序, 往往被划分为若干个模块, 并对它们分别进行编写、 汇编和连接, 然后利用DEBUG程序分别对各个模块进行调试。 调试成功后, 再进行最后的连接、 调试, 直至程序能正常运行为止。 因此, 利用DEBUG程序对汇编连接后的程序进行调试是重要的手段之一。 DEBUG的调试命令如下: D>DEBUG OUTCHAR.EXE
其中′-′为进入DEBUG程序的提示符(在调用DEBUG程序时, DEBUG程序应在A盘中)。 在调试一个程序时:
用U命令, 可把.EXE文件反汇编为源文件, 检查输入的程序是否正确; 用G命令, 可设置断点运行可执行的文件;
用A命令, 可直接输入一段源程序并将其汇编为目标程序;
如用R命令,则可显示断点处的各寄存器的当前值和下一条将要执行的命令; 如用D命令, 可以显示数据段中各存储单元的内容及代码段中的指令代码; 如用E命令可对以上的数据和代码进行修改。
对调试成功的程序还可以通过命令N和写盘命令W, 将文件存入磁盘。
⒎在DOS下运行可执行文件OUTCHAR.EXE文件
对汇编连接后生成的可执行文件OUTCHAR.EXE, DOS把它当成外部命令对待, 在DOS提示符下, 可直接键入OUTCHAR.EXE文件的文件名OUTCHAR, 不键入扩展名, 然后按回车键后,OUTCHAR .EXE文件将被执行。 D>OUTCHAR
1 2 3 4 5 6 7 8 9 0 1 2
以上程序执行后, 将连续地在屏幕上显示1, 2, 3, 4?等数字, 每个字符间保留一个空格, 可用
共20页 第 7 页
汇编语言程序设计 实习指导书
实验1. 顺序程序设计
一、 实验目的
⒈掌握算术运算指令的使用方法。 ⒉学会顺序结构程序的编程方法。 ⒊掌握DOS子功能调用方法。
⒋掌握汇编程序中变量的定义方法及变量值的查看方法。
⒌掌握DEBUG调试程序中D、T、P、R等调试命令的使用方法。 ⒍掌握利用DEBUG调试程序查看F标志寄存器值方法。
二、实验内容
⒈编写程序并上机调试完成:从键盘上输入两个1位数,求出其乘积,并以十进制形式在显
示屏上显示该成绩。
编程提示:
①两个1位十进制数的输入可通过DOS的1号子功能调用两次输入2个数字字符实现(将输入的2个数字字符的ASCII码减去30再相乘。
②成绩显示可通过2次调用DOS的2号子功能实现(注意乘积各位的分离可分别用除以10实现。显示的数值要加30H变成字符。)
2已知变量X、Y、Z、V中存放的是有符号字型数据,编写程序,计算(V-(X*Y-540))/X,并把结果存放到DX和AX寄存器中。
编程提示:变量X、Y、Z、V在数据段中可定义成字型,并赋予具体初始数值。
三、实验要求
①提前完成2个程序的编制,并通过上机运行及调试,正确完成程序的编制。
②实验中注意DEBUG调试程序中T命令和P命令的使用,注意观察并记录程序中各个段的内存中的分配情况及各个中断处理子程序在内存中的起始存放地址。
③注意观察程序2和3中数据段中各数据的内存存放情况和程序执行中其值变化情况。 ④用DEBUG调试程序调试所编程序,查看并记录每条指令内存占用情况及执行结果(包括F标志寄存各位值。
⑤注意观察并记录每条指令执行后CS和IP寄存器值变化情况,以加深对顺序程序的概念的理解。
四、实验报告
实习报告格式 ①实习名称 ②实习设备
③实习目的及要求 ④实习内容 ⑤程序清单
⑥实习中出现问题及解决方法 ⑦实习小结
共20页 第 8 页
汇编语言程序设计 实习指导书
实验2. 分支程序设计
一、 实验目的
⒈掌握条件跳转指令的使用方法。 ⒉学会分支结构程序的编程方法。
⒊利用DEBUG调试程序查看F标志寄存器值并分析条件跳转指令的跳转和F标志寄存器值间的关系。
二、实验内容
⒈编写程序并调试运行。要求:从键盘上接收一个按键,如果按键是小写字母,则显示输出L;是大写字母,则显示输出U;如果是数字,则显示输出N;都不是,则显示输出*。
⒉设变量K中存放了20个有符号整数组成的字节型数组,编写程序,找出其中最大的数和最小的数,并显示输出。
三、实验要求
⒈编写程序并上机调试,记录运行结果。
⒉用DEBUG调试程序调试所编程序,查看并记录每条指令内存单元地址及执行结果(包括F标志寄存各位值。)
⒊注意观察并记录每条指令执行后CS和IP寄存器值变化情况,以加深对分支程序的概念的理解。
四、实验报告
实习报告格式 ①实习名称 ②实习设备
③实习目的及要求 ④实习内容 ⑤程序流程图
⑥程序清单及实验数据
⑦实习中出现问题及解决方法 ⑧实习小结
共20页 第 9 页
汇编语言程序设计 实习指导书
实验3. 循环程序设计
一、 实验目的
⒈掌握移位指令的使用方法。 ⒉学会循环结构程序的编程方法。
⒊利用DEBUG调试程序查看循环程序循环过程中CS和IP的变化情况。
二、实验内容
⒈内存中连续存放了100个字节型带符号数据,编写程序,统计出: ①大于0的数据个数; ②小于0的数据个数; ③等于0的数据个数; ④奇数数据的个数; ⑤偶数数据的个数;
⒉编写统计15个学生数学学习成绩程序。
要求:分别统计出低于60分,60-69分,70-79分,80-89分,90-100分的人数,并存放到S5,S6,S7,S8,S9,S10对应内存单元中。
三、实验要求
⒈编写程序并上机调试,记录运行结果。
⒉用DEBUG调试程序调试所编程序,查看并记录每条指令内存单元地址及执行结果(包括F标志寄存各位值。)
⒊注意观察并记录每条指令执行后CS和IP寄存器值变化情况,以加深对分支程序的概念的理解。
四、实验报告
实习报告格式 ①实习名称 ②实习设备
③实习目的及要求 ④实习内容 ⑤程序流程图
⑥程序清单及实验数据
⑦实习中出现问题及解决方法 ⑧实习小结
共20页 第 10 页
汇编语言程序设计 实习指导书
实验4. 子程序设计
一、 实验目的
⒈掌握子程序的编程方法。 ⒉掌握主程序调用子程序方法。
⒊掌握汇编程序中堆栈段的建立方法。 ⒋掌握汇编程序中堆栈段的建立方法。
二、实验内容
编写并调试完成程序:键盘输入一行字符串,在下一行反序显示输出该字符串。 要求:下行显示时光标通过调用“回车换行子程序CR.ASM”实现。
三、实验要求
⒈编写程序并上机调试,记录运行结果。
⒉用DEBUG调试程序调试所编程序,查看并记录子程序调用前后和子程序返回前后堆栈段内容的变化情况以及SP寄存器值变化情况。
⒊注意观察并记录每条指令执行后CS和IP寄存器值变化情况,以加深对子程序概念的理解。
四、实验报告
实习报告格式 ①实习名称 ②实习设备
③实习目的及要求 ④实习内容 ⑤程序流程图
⑥程序清单及实验数据(子程序要求书写子程序说明) ⑦实习中出现问题及解决方法 ⑧实习小结
附录:
共20页 第 11 页
汇编语言程序设计 实习指导书
动态调试程序DEBUG
一、 DEBUG的启动与退出
DEBUG.COM是DOS的外部命令,也是一个非常方便的汇编程序分析工具。
1.DEBUG的启动
DEBUG的启动格式如下:
DEBUG[<文件说明>][<参数>]
其中,“文件说明”指被调试的程序的全名,“参数”是该程序所涉及的参数。 下面是几个启动DEBUG的例子。 D>DEBUG TT.EXE↙ D>DEBUG↙
第一句是调试TT.EXE程序。
第二句是启动DEBUG,不装入文件。
DEBUG装入内存后,接着就从磁盘上查找被调试的程序,找到后将其装入内存(对于后缀为 .EXE的文件,DEBUG将它装入到最低可用的区段中,并从100H开始装入),然后显示出提示符“-”。等待用户进一步输入命令。
DEBUG命令中使用的地址格式约定如下: [<段地址>:]<位移量>
其中,<段地址>可以是段寄存器名,或者是十六进制数,也可以默认。 例如: CS:0100 2212:0100
而地址范围的格式为:<段地址>:<始位移量><末位移量>
或
<段地址>:<始位移量>L<长度> 例如:下列地址范围。 CS: 100 100 2123:100L10
2.退出DEBUG
当完成动态调试任务时,可使用Q命令退出并返回操作系统。
格式:-Q↙
二、 汇编、执行、跟踪和反汇编
汇编、执行、跟踪和反汇编是DEBUG的一组最基本操作。在DEBUG下汇编一小段程序后,就可以进入执行或跟踪执行过程,然后将该程序反汇编出来。
1.A命令(汇编)
A是1条逐行汇编命令,主要用于小段程序的汇编和修改目标程序。若在调试目标程序的过程中, 要求改写或增添一段目标程序, 则可以用A命令直接在DEBUG下实现。
使用逐行汇编命令汇编程序时,一般不允许使用标号和伪指令。但在MS-DEBUG中允许使用DB和DW这两条伪指令。
汇编命令的格式如下:
共20页 第 12 页
汇编语言程序设计 实习指导书
A [<地址>]
该命令可以从指定地址开始, 将输入的汇编语言语句立即汇编成机器代码, 连续存放在内存单元中。
其中,“地址”为开始汇编的地址,若没有“地址”,则从当前地址开始汇编。
在程序输入完毕后, 最后一行不输入内容, 直接按回车键, 即可返回DEBUG程序, 还可用反汇编命令U 对刚输入的内容进行反汇编, 以验证输入的程序是否正确。
A命令用Ctrl+C或按回车键退出汇编。汇编过程中发现错误时,显示出1个“?”并要求重新输入。
使用A命令来汇编小段程序往往比使用汇编和连接程序方便。汇编好的程序也可以用写盘命令存在磁盘上。
【例1】 汇编一小段程序(读软盘BOOT扇区内容)。 -A ↙
2A7D:0100 MOV AX,0201 ;地址自动给出,逐行输入语句 2A7D:0103 MOV BX,0200 2A7D:0106 MOV CX,0001 2A7D:0109 MOV DX,0000 2A7D:010C INT 13 2A7D:010E INT 3
2A7D:010F ↙ ;结束输入 使用A命令应遵守以下规则:
① 所有输入数值, 均为十六进制数。
② 前缀助记符, 必须在相关指令的前面输入, 可以在同一行, 也可以在不同行输入。 ③ 段超越助记符为CS:、 DS:、 ES:、 SS:。 ④ 远调用时的返回指令助记符用RETF。
⑤ 使用串操作指令时, 助记符中必须注明是字节还是字传送。
⑥ 汇编语言能自动汇编短、近和远的转移及近和远的调用,也能由NEAR和FAR前缀来超越。 例如:
0100:0500 JMP 502;短转移
0100:0502 JMP NEAR 505;近转移 0100:0505 JMP FAR 50A;远转移
第一条JMP指令中含有一个字节偏移量。 第二条JMP指令中含有两个字节偏移量。
第三条JMP指令中含有两个字节的偏移量及两个字节的段地址。
2. G命令(执行)
G命令用来启动运行一个程序或程序的一段,它是DEBUG程序进行程序调试的主要命令之一。它的格式如下:
G [=<始址>][<断点地址>?]
其中,断点最多允许设置10个。如果G命令不带参数,则从头运行装入的程序,运行后仍返回DEBUG。如G命令后有断点地址,则程序执行到断点地址时暂停并显示出各寄存器状态。 注意:
共20页 第 13 页
汇编语言程序设计 实习指导书
① 第一个参数′=地址′规定了程序执行的起始地址, 以CS内容作段地址, 等号后面的地址只需给出地址偏移量。 此时, 命令G与地址之间的等号不能省去。
如果在G命令执行前, 已经设置了CS值和IP值, 则也可以直接用G命令, 从指定地址执行程序。
② 格式中后面给出的地址是指断点地址, 最多可设置 10 个断点。 当程序执行到一个断点时, 就停下来, 显示CPU各寄存器的内容和标志位的状态, 以及下一条待执行的指令, 被调试程序的所有断点全部被取消, 并返回DEBUG。
③ 地址参数所指的单元, 必须包含有有效的 8088 指令的第一个字节, 否则将产生不可预料的结果。
④ 堆栈必须至少包含有 6 个可用字节, 否则也将产生不可预料的结果。 ⑤ 若断点地址只包括地址偏移量, 则认为段地址在CS寄存器中。 【例2】 例如,执行例1的小程序。 -G=100 ↙ (从地址100H处开始执行)
AX=8000 BX=0200 CX=0001 DX=0001 SP=FFEE BP=0000 SL=0000 D1=0000
DS=2A7D ES=2A7D SS=2A7D CS=2A7D IP=010E NV UP EI PL NZ NA PO CY 2A7D:010E CC INT 3
3. T命令(跟踪执行)
T命令用来逐条跟踪程序的执行,它的格式是: T[=<地址][<跟踪命令条数>]
每条指令执行后,都要暂停并显示各寄存器的内容。跟踪执行实际上是单步执行。在分析程序时希望不断跟踪程序执行路径,从而分析出程序执行过程的细节。
例如:-T=0100 3 ↙ 格式(1): T [=地址]
该命令可以在指令执行中进行追踪, 若略去地址, 则从CS:IP现行值执行。 每一次T命令都执行一条指令,都要暂停并显示各寄存器的内容。 格式(2): T [=地址][跟踪命令条数值] 此时,它可对多条指令进行追踪, 即在执行了由跟踪命令条数值所指定的若干条指令之后, 停止执行并显示各寄存器的内容和各标志位, 还指出下一条待执行的指令。
4. U命令(反汇编)
U命令可以对二进制代码程序作出反汇编,常用于分析和调试目标程序。 U命令格式为:-U[<地址>] 格式(1): U地址
该命令从指定的地址开始, 反汇编 16 个字节或 32 个字节。 若略去指定地址, 则以上一个U命令反汇编的最后一条指令地址的下一条指令地址作为起始地址; 若没有用过U命令, 则以由DEBUG初始化的段寄存器的值作段地址, 以 100 作为地址偏移量。
例如:反汇编前面汇编的程序:-U 100↙ (从地址100H处开始执行) 2A7D:0100 B80102 MOV AX,0201 ;自动给出反汇编结果 2A7D:0103 BB0002 MOV BX,0200 2A7D:0106 B90100 MOV CX,0001
共20页 第 14 页
汇编语言程序设计 实习指导书
2A7D:0109 BA0000 MOV DX,0000 2A7D:010C CDL3 INT 13 2A7D:010E CC INT 3
2A7D:010F 020A ADD CL,[BP+SI]
上述反汇编程序,在汇编程序和地址中间增加有B80102等内容,表示是二进制的机器码。 注意,在反汇编过程中,如果源程序中有一段数据,则也被反汇编成“程序”,但读不懂,这时应越过这一段。此外,U命令不识别程序结束,因此必须给定结束位置的地址。 格式(2): U范围
这种格式的命令, 可以对指定范围的内存单元进行反汇编, 范围可以由起始地址、 结束地址(只能包含地址偏移量)或起始地址及长度来指定。 其命令格式如: U 04BA:100 0108 或 U 04BA:0100 L7 两者是等效的。
三、显示、修改内存和寄存器命令
程序中反汇编出来的数据不易读懂,必要时需用显示命令显示。此外,当需要修改内存中一些数据时,可以用修改内存命令进行操作。修改寄存器参数时,要使用寄存器命令。
1.D命令(显示内存)
D命令是将调入内存的程序以十六进制形式以及对应的ASCII字符形式显示出来。格式如下:
D[<地址>]或D[<范围>]
其中,“地址”表示从该地址开始显示,若没有地址,则从当前地址显示;“范围”表示显示内存指定范围的内容,这里所说的范围包含起始地址和结束地址。起始地址可由段基址及段内偏移量两个部分组成, 中间用冒号′:′隔开, 也可以只指出段内偏移量, 而此时的段基址在DS中。
此命令执行后,将从指定地址开始, 显示 40H个或 80H个字节的内容, 每一行的左边显示段内偏移地址, 接着显示 16 个单元的内容, 最右边区域则显示这一行的 16 个单元所对应的可显示的字符。 若无可显示的字符, 则用圆点(小数点)填充。
D命令中的地址可为段内偏移量, 也可为段基址和段内偏移量两部分, 中间用冒号隔开, 如 1660:0100, 即指段基址为 1660H, 段内偏移量为 0100H。 DEBUG中所显示的数据均为十六进制数, 且省去了后面的H标志。 例如:-D 100,200↙
表示显示内存地址100--200这一段的内容。 注意:DEBUG操作数一般是十六进制数。
2.E命令(将内容写入内存)
将内容写到指定地址处,命令格式如下: E[<地址>[<字节串>]]
其中,“地址”为写入内容的地址,“字节串”为写入的内容,没有字节串的格式,是一种交互式写入内容。 格式(1): E 地址 内容表
它的功能是用给定的内容表去代替所指定的内存单元的内容。
共20页 第 15 页
汇编语言程序设计 实习指导书
例如:
-E DS:0100 41 ′OPEN′ 41
该命令执行后, 将用列表中的 6 个字符填入从DS:0100 到DS:0105 的 6 个存储单元中。 格式(2): E 地址
它的功能是可以连续地逐个修改内存单元的内容。 当屏幕上显示指定单元的地址和内容之后, 可采取下列办法:
① 若指定单元的内容需要修改, 则将新的内容的十六进制数输入, 再按空格键, 修改便告完成, 然后显示下一个存储单元的地址及内容, 若需要修改, 可进行同样的操作。 若某一个单元的内容不需要修改, 而操作又要进行下去, 则可直接按空格键
② 若需要显示前一个单元的地址和内容, 则输入连接号′-′; 若要修改, 则输入新的内容, 再按′-′键, 本次修改完成; 若显示前一个单元的地址和内容仍要修改, 则可进行同样的操作; 若显示的内容不需要修改, 则可直接按′-′键, 使该操作由高地址向低地址单元连续不断地进行。
③ 按
3.R命令(修改寄存器)
显示寄存器的内容,然后修改其值。命令格式如下: R (显示所有寄存器和标志) R寄存器 (显示指定寄存器) RF (显示所有标志) 格式(1): R
显示寄存器内容时,首先显示13个16位寄存器的内容,随后是标志寄存器的内容,最后一行是下一条要执行的指令地址和指令内容。
格式(2): R 寄存器名
该格式可用于检查和修改指定寄存器的内容。 若不修改其内容, 可按
例如:显示CX寄存器中的内容,并修改为0F: -R CX ↙ CX 0001 : 0F ↙ 格式(3): RF
该格式可用于显示标志和修改标志位状态。 当系统给出标志位状态后, 可采取下列办法: ① 若不需要修改任一标志位, 可按
② 若需要修改一个或多个标志位, 可输入其相反的值. 各标志位之间可以无空格且与顺序无关, 修改后按
由于标志位状态显示时, 是用下列特殊符号表示的, 因而修改时, 只要输入规定的符号即可。 下面是标志名和状态符号的对照表:
标志名置 位符号复 位符号 溢出标志OF(是/否) OV NV 方向标志DF(减/增) DN UP 中断标志IF(允许/禁止) EI DI
共20页 第 16 页
汇编语言程序设计 实习指导书
符号标志SF(负/正) NG PL 零标志ZF(是/否) ZR NZ 辅助进位标志AF(是/否) AC NA 奇偶校验标志PF(偶/奇) PE PO 进位标志CF(是/否) CY NC 只有追踪标志TF, 不能用指令直接修改。 例如: 输入RF命令, 系统可能作出如下响应: OV DN EI NG ZR AC PE CY-
若现在要修改奇偶、 零、 中断和溢出标志位, 可在光标处输入: PO NZ DI NV
四、磁盘文件操作
利用DEBUG命令编写的小程序段运行无误之后,就可以将其存盘。
1.N命令(命名)
命名命令可用来设置文件名,以便于进行读写。格式如下: N<文件名>[<文件名>?]
其中,“文件名”为用户指定的文件名。
2.W命令(写盘)
写盘命令是将当前内存指定长度的内容按N命令给出的文件名存入磁盘。格式如下: W[<地址>[<盘号><相对扇区号><扇区个数>]]
其中,“地址”是写盘内容在内存中的首地址(如果有磁盘参数,则按指定磁盘参数进行写盘操作);“盘号”为0表示A盘,为1表示B盘,为2表示硬盘C;“扇区个数”是写入的扇区总数。
使用W写一个文件时,要先用N命令指定文件名,再用R命令将文件长度送到寄存器BX和CX中。
【例3】 将程序段命名并写入文件中。 -U 100 ↙ ;反汇编
2A7D:0100 B80102 MOV AX,0201 2A7D:0103 NU0002 MOV BX,0200 2A7D:0106 B90100 MOV CX,0001 2A7D:0109 BA0000 MOV DX,0000 2A7D:010C CDL3 INT 13 2A7D,010E CC INT 3 -R CX ↙ CX 0001
: 0F ;设置文件长度 -N READD.COM↙ ;命名 -W ↙ ;写盘 WRITING 000F BYLES
-Q ↙ ;结束退出
再如,将内存0200处的内容(1个扇区)写入A盘第20扇区中。
共20页 第 17 页
汇编语言程序设计 实习指导书
-W 0200 0 20 1 ↙
3.L命令(读盘)
该命令可将磁盘指定扇区的内容读到内存,或将指定文件读到内存。格式如下: L[<地址>[<盘号><相对扇区号><扇区数>]]
其中,“地址”为装入内容的内存首地址;“相对扇区号”为开始装载的扇区号;“扇区数”为要读入的扇区数(最大80H)。 注意:L命令需与N命令配合使用。
例如:将A盘上的DOS引导程序读入内存XXXX:7C00处。 -L 7C00 0 0 1 ↙
若省略地址, 则装入到CS:100 开始的内存区域中。
若是带有扩展名.COM或.EXE文件, 无论命令中是否指定了地址, 一律装入到CS:100 开始的内存区域中去。
五、移动、比较、填充和查找内存命令
这组命令分别用于对内存内容进行移动、比较、填充固定的值和查找某个特定的字节。
1. M命令(移动内存)
移动内存内容实际上是将内存中的一块数据从一处拷贝到另一处。格式如下: M<源地址范围><目标地址>
其中,“源地址范围”为指定数据源的地址范围,“目标地址”指要拷贝到的首地址。
2. C命令(比较)
比较两块内存中的内容是否一致。格式如下: C<源地址范围><目标地址>
其中,“源地址范围”为指定内存块的范围,“目标地址”为被比较内存块的地址。
3. S命令(查找)
S命令是查找内存中指定的内容。格式如下: S<地址范围><要查找的字节或字符串 【例4】 从100处开始查找B8,范围200。 -S 100L200 B8 ↙
当键入查找命令之后,查找到的地址都被列出。为了验证,用U命令逐条反汇编,可以看到结果。
4. F命令(填充)
F命令是将某个指定内容整块地填写到内存指定的位置上。格式如下: F<地址范围><要填充的字节或字节串> 【例5】 从200处开始填充0F个0。 -F 200L0F 00 ↙
六、其他命令
共20页 第 18 页
汇编语言程序设计 实习指导书
1. H命令(十六进制运算)
H命令用来计算十六进制数的和与差。格式如下: H 值1 值2
其中,“值1”和“值2”为要进行计算的数。其和显示在前面,差显示在后面。 【例6】 计算十六进制数12与34的和与差。 -H 12 34 ↙ 0046 FFDE
其中,“0046”为和,“FFDE”是差。
2. I命令(读端口信息)
I命令是读端口信息命令,可显示从指定端口取得的输入数据。格式如下: I 端口地址
3. O命令(输出到端口)
O命令是将指定字节内容送到指定端口。格式如下: O <端口地址><字节内容> 例如:屏蔽CMOS口令的操作。 -O 70 90 ↙ -O 71 00 ↙ -Q ↙
共20页 第 19 页