实验一 熟悉 PC 机的使用和调试汇编程序的方法
一. 实验目的:
1. 掌握汇编程序由编辑、编译、链接到调试的全过程。
2. 通过汇编调试工具加深对机器指令执行过程的了解。
二. 实验要求:
1. 了解 PC 机的系统类型和基本配置, 熟悉 PC 机 DOS 下的基本操作命令。
2. 掌握使用 PE2 (或使用
SIDEKICH (SK),edit) 等编辑器对汇编语言源程序 (扩展名.ASM ) 的编辑操作。
3. 学会用宏汇编程序 MASM (或 TASM ) 对汇编语言源程序进行汇编和使用连接程序 LINK (或 TLINK ) 对 .OBJ 文件链接生成 .EXE 文件。
4. 学会用汇编调试工具软件TD (或DEBUG ) 对.EXE文件进行调试及执行程序的方法。
5. 利用TD (或DEBUG)
加深对机器指令的了解。
6. 了解汇编帮助软件 NG 的使用方法。
三. 实验仪器:
PC 机
四. 实验步骤:
1.开机:
开机后有两种状态,即进入 DOS 操作系统或 WINDOWS 操作系统,下面分别介绍进入后实验步骤:
DOS 操作系统:
打开机器上的开关,这时屏幕上显示">" 提示符即进入DOS工作状态。
要求: 每个同学使用自己的学号或其它有特征的字符串建立自己的子目录,建立方法见<<DOS的基本操作命令>>。开机后,若出现系统崩溃(称"死机")现象,一般使用热启动 (CTRL-ALT-DEL键)或复位键重新启动。
WINDOWS 操作系统
开机后进入
WINDOWS 环境,选择 MS-DOS 方式的图标,连击鼠标的左键,会进入 DOS 环境,一般地进入的工作目录是 D:\USER,(如果工作目录不是 D:\USER,可以通过对MS-DOS方式 的属性修改完成,具体方法是,在 WINDOWS 环境下,光标移至MS-DOS方式 图标,击右键,会弹出一菜单,选择属性栏,下图所示:
然后选择 程序 ,会显示如下窗口:
注意: 将工作目录修改为 D:\USER.
2.NG(汇编帮助软件)和SK(编辑软件)的启动。
NG的启动:在DOS提示符下键入NG,将NG驻留到内存,用户可以随时调出(具体使用方法见<<NG的使用>>。
SK的启动(若使用SK编辑器):在DOS提示符下键入SK,将SK驻留到内存,用户可随时调出(具体使用方法见<<SK的使用>>),该软件适合较短程序的编辑和调试。
3.编辑、编译、链接和调试汇编语言程序过程。
A 建立汇编语言程序
一 使用 PE2 建立汇编语言程序
在 DOS 提示符下使用 PE2 编辑器输入用户汇编语言程序 (扩展名为.ASM)。
>PE2 文件名.ASM (回车)
二 使用 SK 建立汇编语言程序
使用 SK2 热键启动 SK
编辑命令见 《 PE2
的使用方法》 和《 SK 的使用方法》。
三 使用 EDIT 建立汇编程序
> edit 文件名.asm(回车)
B 汇编程序生成目标程序
经过编辑命令建立的汇编语言源程序使用汇编程序编译成目标程序。
一 使用 MASM 宏汇编进行编译
> MASM 文件名
在汇编程序调入后,先显示版本号,然后出现第一行提示,
Object filename [源文件名.OBJ]: ;默认该文件名回车。
Source Listing
[NUL.LST] : 源文件名或其他 ;输入文件名建立可打印文件。
Cross Reference
[NUL.CRF]: 源文件名或其他 ;回车。
Warning Errors
severe Errors
如果汇编过程中发现源程序有错误,由以上两种错误类型分别列出。此时可分析错误原因,返回编辑程序修改源程序。
汇编程序出错信息见 《 汇编程序出错信息表 》, 注意出错的类型及出错的源文件对应行。
若不需要产生 .LST
和 .CRF 文件, 可在 > 下加";"
> MASM 文件名;
二 使用 TASM 进行编译
例如:编译 A.ASM文件。
>TASM A
<Enter>
Turbo Assembler Version 2.5 Copyright (c) 1988,1991 Borland International
Assembling file: a.ASM
Error messages: None
Warning messages: None
Passes: 1
Remaining memory: 162k
可按要求填加必要的选择。例如若需要在 TD 中跟踪源文件调试,可使用/zi 选择(应注意选择项英文的大小写):
>TASM /zi A <Enter>
若要生成列表文件,可用如下操作:
>TASM A ,,A.LST <Enter>
TASM 的选择项如下(可用 /H 显示):
Syntax: TASM [options] source [,object] [,listing] [,xref]
/a,/s Alphabetic or Source-code segment ordering
/c Generate cross-reference in listing
/dSYM[=VAL] Define symbol SYM = 0, or = value VAL
/e,/r Emulated or Real floating-point instructions
/h,/? Display this help screen
/iPATH Search PATH for include files
/jCMD Jam in an assembler directive CMD (eg. /jIDEAL)
/kh# Hash table capacity # symbols
/l,/la Generate listing: l=normal listing, la=expanded listing
/ml,/mx,/mu Case sensitivity on symbols: ml=all, mx=globals, mu=none
/mv# Set maximum valid length for symbols
/m# Allow # multiple passes to resolve forward references
/n Suppress symbol tables in listing
/o,/op Generate overlay object code, Phar Lap-style 32-bit fixups
/p Check for code segment overrides in protected mode
/q Suppress OBJ records not needed for linking
/t Suppress messages if successful assembly
/w0,/w1,/w2 Set warning level: w0=none, w1=w2=warnings on
/w-xxx,/w+xxx Disable (-) or enable (+) warning xxx
/x Include false conditionals in listing
/z Display source line with error message
/zi,/zd Debug info: zi=full, zd=line numbers only
4. 链接程序生成可执行文件
由汇编后建立的目标码文件,必须经过链接后才能生成可执行的命令文件。
一 使用 LINK 完成连接
>LINK 文件名 ;回车后调入链接程序,此时屏幕显示。
Run File [文件名.EXE]: ;回车默认该文件名。
List File [NUL.MAP]: ;
Libraries [ .LIB]: ;回车。
Warning: ;提示错误。
如果有错误,返回编辑程序重新修改源程序。
若要生成 .COM 文件, 则用 EXE2BIN
实现:
>
EXE2BIN A.EXE A.COM
二 使用 TLINK 完成连接
例如:链接 A 文件。
>TLINK A <Enter>
Turbo
Link Version 4.0 Copyright (c) 1991 Borland International
可按要求填加必要的选择。例如若需要在 Debug中跟踪源文件调试,应使用/V
选择 (应注意选择项英文的大小写):
>TLINK /v A <Enter>
若要生成COM 文件,可使用 /Tdc 选择:
>TLINK /Tdc A <Enter>
TLINK 的选择项如下(可用 /H 显示):
Syntax: TLINK objfiles, exefile, mapfile, libfiles, deffile
@xxxx indicates use response file xxxx
Options:
/m = map file with publics
/x = no map file at all
/i = initialize all segments
/l = include source line numbers
/L = specify library search paths
/s = detailed map of segments
/n = no default libraries
/d = warn if duplicate symbols in libraries
/c = lower case significant in symbols
/3 = enable 32-bit processing
/v = include full symbolic debug information
/e = ignore Extended Dictionary
/t = create COM file (same as /Tc)
/o = overlay switch
/P[=NNNNN] = pack code segments
/A=NNNN = set NewExe segment alignment factor
/ye = expanded memory swapping
/yx = extended memory swapping
/C = case sensitive exports and imports
/Txx = specify output file type
/Tdx = DOS image (default)
/Twx = Windows image
(third letter can be c=COM, e=EXE, d=DLL)
5. 汇编语言动态调试工具调试汇编程序
一 使用 DEBUG 进行调试
DEBUG 是专为汇编语言设计的一种调试工具,可用来检查,修改存储单元和寄存器的内容装入,存储及启动运行程序,也可用 DEBUG 汇编简单的汇编语言程序。
>
DEBUG 文件名.EXE
- ;
"-" 是 DEBUG 的提示符
DEBUG 下的基本命令及格式 ( 具体见 《 DEBUG 使用说明 》)
命 令 任 务 格 式
A(Assmble) 汇编语句 A[address]
C(Compare) 比较内存 C range address
D(Dump) 显示内存 D [address]
E(Enter) 改变内存 E address list
F(Fill) 填充内存 F range list
G(GO) 执行程序 G [address]
H(Hexarthmetic) 十六进制运算 H Value Value
I(Input) 输入 I port address
L(Load) 装入内存 L[address]
M(Move) 传送内存 M range range
N(Name) 定义文件 N [d:][path]filename[.com]
O(out put) 输出字节 O port address byte
Q(Quit) 退出DEBUG状态 Q
R((Register) 显示寄存器 R[register name]
S(Search) 检索字符 S rang list
T(Trace) 单步/多步跟踪 T orT[address][value]
U(Unassmble) 反汇编 U [address]orU[range]
W(Write) 文件或数据写盘 W [address[drive sector sector]]
二 使用 TD ( Turbo Debugger ) 调试汇编程序
TD 设计具有 Turbo 系列语言的特点,其多重覆盖窗口、下拉菜单和弹出菜单的结合给用户提供了一个快速友好的交互环境,帮助系统使用十分方便。以下给出常用操作命令,具体命令见 《 Turbo Debugger 命令一览表 》。
A 启动Turbo Debugger
Syntax:
>TD objfiles
例如: 调试已编译链接后的 A 文件:
>
TD A <Enter>
进入 TD 后屏幕显示
下拉菜单栏: 在屏幕的上端
代码区域 : 按地址,机器码及助记符组成
寄存器域 : CPU 中寄存器内容
标志域 : CPU 中所有标志状态
堆栈区域 : 当前堆栈内容
数据区域 : 以地址, ASCII 码值及
ASCII 码显示数据
常用命令栏: 在屏幕下端
屏幕中间区域可通过 TAB 键移动
B F10 或 Alt - 进入菜单提示栏,回车选择对应菜单
例如: Alt - F 进入屏幕上端的 File 栏, 回车后显示下拉菜单,移动光标可选择相应功能。
C Alt
- F10 访问局部菜单 通过该命令,用户可容易的进入当前栏的局部菜单。
D 窗口命令 使用下拉菜单的 Window, 可进入多窗口显示,用户可调试窗口的位置和大小,以最佳的方式观察程序执行过程同时可切换不同显示窗口。
E 常用执行命令在常用命令栏有提示,以下给出更有趣的命令:
连续慢速执行 在 RUN 菜单下选择 Animate
反向跟踪执行 Alt - F4
断点方式执行 用 F2 设断点,使用 RUN 命令后停在断点处
五. 实验内容:
1. 输入以下程序, 完成由编辑、编译、链接到调试的全过程。
在调试过程中应使用单步、断点等方法调试,注意观察寄存器、标志位和有关存储器内容的变化。
A 将 S1 (BYTE) ,S2 (WORD) 和 S3 (DWORD) 送至 D1,D2,D3 .
注意: 以下程序有误,在调试过程中加以修改使之正确
DATA SEGMENT
SS1 DB 1234H
SS2 DW EA32H
SS3 DD 12345678H
DD1 DB 0
DD2 DW ?
DD3 DW ?
DATE ENDS
CODE SEGMEMT
ASUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AL,SS1
MOV DD1,AL
LEA SI,SS2
LEA DI,DD2
MOV AX,[SI]
MOV [DI],AX
MOV SI,OFFSET S3
MOV DI,OFFSET D3
MOV AX,[SI]
MOV D3,AX
INC SI
INC DI
MOV AX,[SI]
MOV [DI],AX
MOV AX,4C00H ;返回系统
INT 21H
CODE ENDS
ENDS STRAT
B 完成两个长整数相加的汇编程序
要求: 调试过程中应更改必要的参数值,以验证程序的正确性,例如本题可修改加数和被加数以判别最高位进位处理是否正确。
将该程序修改为减法、压缩的 BCD 数的加、减 ( BCD 数运算时注意操作数应符合要求) 重新调试。
DATA SEGMENT
NUMBER EQU 6
BUFFER1 DB 12H,0E2H,33H,43H,12H
BUFFER2 DB 22H,0A2H,55H,0F2H,3FH
RESULT DB NUMBER DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV CX,NUMBER-1
MOV SI,OFFSET BUFFER1 ;被加数指针
MOV DI,OFFSET BUFFER2 ;加数指针
LEA BX,RESULT ;和指针
XOR AX,AX ;清CF标志
NEXT: MOV AL,[SI]
ADC AL,[DI] ;带进位相加
MOV BYTE PTR [BX],AL ;保存部分和
INC SI ;变动指针
INC DI
INC BX
LOOP NEXT ;循环控制
ADC AH,0 ;最高位进位
MOV BYTE PTR [BX],AH
MOV AX,4C00H ;返回系统
INT 21H
CODE ENDS
END START
C 完成数据块的移动.
DS_DATA SEGMENT
BUFFER1 DB 0,1,2,3,4,5,6,7,8,9
DS_DATA ENDS
ES_DATA SEGMENT
RESULT DB 10 DUP(?)
ES_DATA ENDS
MY_CODE SEGMENT
ASSUME CS:MY_CODE,DS:DS_DATA,ES:ES_DATA
MY_ PROC
START: PUSH DS
MOV AX,0
PUSH AX
MOV AX,DS_DATA
MOV DS,AX
MOV AX,ES_DATA
MOV ES,AX
MOV SI,OFFSET BUFFER1
MOV DI,OFFSET RESULT
MOV CX,10
REP MOVSB
RET
MY_ ENDP
MY_CODE ENDS
END START
2 在汇编调试工具软件的环境下, 完成下列指令的执行, 注意选取有代表性的数据, 并观察指令执行前后的数值变化:
例如: 观察 MOV AX,BX 指令
在
DEBUG 下将 AX,BX 分别置不同的值,写入 MOV AX,BX 指令然后执行,再观察 AX,BX 寄存器的内容。
A. XCHG
B. XLAT C. LDS 和 LES
D. MUL 和 IMUL E. CBW 和 CWD 分正数和负的情况
F. 移位和循环指令
G. 串操作指令 ( 注意 CS
和 ES 的使用)