实验一 熟悉 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 的使用)