搜档网
当前位置:搜档网 › 汇编实验指导书

汇编实验指导书

汇编实验指导书
汇编实验指导书

微机原理与汇编语言程序设计

实验指导书

信息与通信工程学院 Copyright ? 2010.09

目录

上机实验环境 (1)

实验一、寄存器与存储器 (2)

实验二、DEBUG调试程序 (6)

实验三、源程序建立与汇编 (9)

实验四、顺序程序设计 (13)

实验五、分支程序设计 (15)

实验六、循环程序设计 (17)

实验七、子程序设计 (19)

实验八、中断调用程序设计 (21)

实验九、宏汇编程序设计 (23)

实验十、模块化程序设计 (25)

实验十一、与C语言混合编程 (26)

上机实验环境

【硬件环境】

目前8086汇编语言程序一般在IMB PC/XT及兼容机上运行,因此要求机器具备基本配置的IMB PC/XT及兼容机就可以了,对机器的硬件环境没有特殊的要求。

【软件环境】

1. 操作系统:MS-DOS

2. 源程序编辑程序:纯文本编辑器,如:EDIT、EDLIN、记事本等

3. 汇编程序:MASM5.0、TASM3.0以上。

4. 连接程序:LINK

5. 调试程序:DEBUG

实验一、寄存器与存储器

【实验目的】

初步认识调试程序DEBUG,掌握调试程序时常用的命令与操作。

【实验内容】

1. 调试程序DEBUG的启动与退出。

2. 显示与修改寄存器的内容。

3. 显示与修改存储器的内容。

【实验准备】

1. 复习计算机中数据的表示。

2. 复习8086CPU内部结构,特别是8086CPU中的寄存器。

3. 复习8086CPU存储器组织,存储器的分段、逻辑地址、物理地址等概念。

4. 复习汇编语言程序上机过程,特别是DEBUG命令。

【实验步骤】

1. 调试程序DEBUG的启动与退出。

1) 启动DEBUG:在DOS提示符下键入:DEBUG?。进入后显示DEBUG 提示符‘-’,如下图:

2) DEBUG帮助:在DEBUG提示符下键入:??。DEBUG会列出所有命令及使用方法简单提示,如下图:

3) 十六进制数加减法:在DEBUG提示符下键入:H 1234 ABCD?。观察结果。

4) 退出DEBUG:在DEBUG提示符下键入:Q?。即可退出,进入DOS。

2. 显示与修改寄存器的内容。

1) 显示所有寄存器内容:在DEBUG提示符下键入:R?。显示:

2) 显示和修改指定寄存器内容:在DEBUG提示符下键入:RAX?。显示AX内容,如需修改,则直接键入要修改的值(图中1234),若不想修改,直接

回车便可,如下图:

3) 显示修改标志寄存器:在DEBUG提示符下键入:RF?。显示当前标志,如需修改,则直接键入要修改的值(可按任意顺序),若不想修改,直接回车便可,注意标志位的缩写:0标志—NV UP DI PL NZ NA PO NC

1标志—OV DN EI NG ZR AC PE CY,如下图:

4) 请参照上述操作步骤,显示和修改各寄存器内容及标志寄存器内容,观察结果并记录。

3. 显示与修改存储器的内容。

1) 显示存储器的内容,格式:D[地址]或D[范围],如:

D100?:显示100H单元开始的80个字节的内容。

D100 11F?:显示100H~11F单元的内容。

D100L8?:显示100H单元开始的8个字节的内容。

D?:显示上一个D命令显示单元的后续80个字节的内容。

如下图:

2) 修改存储器的内容,格式:E地址[数据数据...]。注意:地址不能省略,但数据可以省略。省略数据列表时可以交互输入, 空格继续, 回车结束。如:

E DS:1000 1A 2B 3C 4D 5E,‘WINDOWS’?:将字节列表中给出的11个字节填入DS:1000开始的存储单元。

E100?:将从100单元开始逐个修改存储单元内容。

如下图:

【实验要求】

1. 叙述使用DEBUG调试程序的过程。

2. 分析实验过程中出现的错误的原因。

实验二、DEBUG调试程序

【实验目的】

掌握DEBUG调试程序中的汇编与调试命令,并利用DEBUG进行简单的程序设计。

【实验内容】

1. 汇编与反汇编命令。

2. 程序调试命令。

3. 简单程序设计。

【实验准备】

1. 复习汇编语言程序上机过程。

2. 复习8086数据传送类指令。

3. 复习8086算术运算指令。

【实验步骤】

1. 汇编与反汇编命令。

1) 汇编命令:格式:A[地址],若省略地址,则默认为当前的CS:IP。如:

A100 :从100单元开始逐句输入汇编指令,回车后DEBUG自动翻译成机器码,如下图:

2) 反汇编命令:格式:U[地址]或U[地址范围],若省略地址,则默认为当前的CS:IP。如:

U100 :将100H单元开始的32个字节的内容翻译成汇编指令并显示,如下图:

2. 程序运行跟踪命令。

1) 运行命令:格式:G[=地址],若省略地址,则默认为当前的CS:IP。初次调试时不建议采用,可能会因为程序设计不当,造成意想不到的结果。

2) 跟踪命令:格式:T[=地址] [指令条数],若省略地址,则默认为当前的CS:IP。跟踪命令从指定的地址开始执行指令条数规定的指令后暂停,并显示寄存器内容和当前标志值。若不指定指令条数,则默认为1,即为单步跟踪。如下图:de

3) 参照步骤1、2所述,观察并记录一下指令执行的结果:MOV、ADD、ADC、SUB、SBB、INC、DEC。

3. 简单程序的设计。

编写实现以下要求的简单汇编指令程序(任选其一),调试运行、观察并记录结果。

1) 交换SI的高低字节。

2) 计算200H开始的3个字节单元的累加和。

3) 计算X?Y(X、Y为16位任意整数),结果存放到200H开始的单元。

参考程序。

1) 交换SI的高低字节。

MOV AX,SI

XCHG AL,AH

MOV SI,AX

INT 3 ;断点中断调用指令,便于程序调试。

2) 计算200H开始的3个字节单元的累加和。

SUB AX,AX

ADD AL,[200]

ADC AH,0

ADD AL,[201]

ADC AH,0

ADD AL,[202]

ADC AH,0

INT 3

3) 计算X?Y。

MOV AX,X ;X为被乘数

MOV BX,Y;Y为乘数

IMUL BX

MOV [200],AX ;低16位

MOV [202],DX ;高16位

INT 3

【实验要求】

1. 记录指令运行和程序运行的结果。

2. 编写、调试运行程序,分析实验过程中出现的错误的原因。

实验三、源程序建立与汇编

【实验目的】

1. 熟悉汇编语言源程序的一般结构。

2. 熟悉常用伪指令的使用。

3. 掌握汇编程序MASM和连接程序LINK的使用方法和从源程序建立到生成可执行文件的汇编连接全过程。

【实验内容】

1. 建立汇编语言源程序文件.ASM。

2. 利用汇编程序将源文件汇编成用机器码表示的目标文件.OBJ。

3. 用连接程序把目标文件转化成可执行文件.EXE。

4. 运行可执行文件。

【实验准备】

1. 复习汇编语言程序上机过程。

2. 复习汇编语言语句格式及伪指令。

3. 复习汇编语言的段结构。

【实验步骤】

1. 汇编语言源程序的建立。

1) 选择一个或自编一个你熟悉的完整的汇编语言源程序。

2) 使用编辑程序录入。格式:EDIT [文件名]。如:在DOS提示符下,键入EDIT ABC.ASM :用文本编辑程序打开或新建文件名为ABC.ASM的汇编语言源程序,如下图:

3) 逐句输入源程序,输入完毕,保存。如下图:

2. 汇编为目标文件

1) 使用汇编程序MASM。格式:MASM [源文件名.asm],[目标文件名.obj],[列表文件名.lst],[交叉索引文件名.crf]。若省缺文件名,则MASM采用交互式提示输入。如下图:

2) 注意汇编过程和结束后的错误与警告提示。MASM分警告错误(Warning Errors)和严重错误(Severe Errors)。出现严重错误时汇编不能进行,此时应分析错误提示,找出原因,仍用EDIT修改后重新汇编,直到错误为0为止。

3) 汇编正确,将至少产生目标文件(.OBJ)。

3. 用连接程序生成可执行文件

1) 目标文件不能直接运行,需要用到连接程序。连接程序LINK可将多个.OBJ文件(即一个程序的多个模块)连接生成一个可执行文件.EXE。格式:LINK [目标文件1.OBJ], [目标文件2.OBJ]…。若省缺文件名,则采用交互式输入。如下图:

2) 同样注意连接过程的错误与警告信息。若有错误,在分析错误提示,找出原因后,仍须用EDIT修改源程序,重新汇编,重新连接,直到错误为0为止。

4. 执行程序

1) 通过以上的操作我们得到了一个可直接执行的文件。在DOS提示符下键入文件名即可运行程序。如:ABC ?

2) 有时程序可执行了,但在屏幕上看不到结果或者不是我们预期的结果,这时我们就又要用到上个实验中的DEBUG程序进行察看或调试。

3) 直接调试可执行文件的方法。格式:DEBUG 文件名.EXE。

如:DEBUG ABC.EXE ?

参考程序。

功能:从内存中存放的10个无符号字节整数中找出最小数并保存在AL中。

DATA SEGMENT

BUF DB 23H,16H,08H,20H,64H,8AH,91H,35H,2BH,7FH

CN EQU $-BUF

DATA ENDS

STACK SEGMENT STACK 'STACK'

STA DB 10 DUP(?)

TOP EQU $-STA

STACK ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

START: PUSH DS

XOR AX,AX

PUSH AX

MOV AX,DATA

MOV DS,AX

MOV BX,OFFSET BUF

MOV CX,CN

DEC CX

MOV AL,[BX]

INC BX

LP: CMP AL,[BX]

JBE NEXT

MOV AL,[BX]

NEXT: INC BX

DEC CX

JNZ LP

MOV AH,4CH

INT 21H

CODE ENDS

END START

【实验要求】

1. 输入源程序,在实验报告中列出源程序清单。

2. 分析实验过程中出现的错误的原因,说明解决办法。

3. 执行程序,记录运行结果。

实验四、顺序程序设计

【实验目的】

1. 掌握顺序程序的一般结构和设计方法。

2. 熟悉算术运算指令的使用。

【实验内容】

1. 编程计算数学表达式:(W-(X*Y+Z-220))/X,并将结果(商和余数)存入RESULT开始的数据区中。其中W、X、Y、Z均为16位有符号数。

2. 建立源程序、汇编、连接并用DEBUG调试。

【实验准备】

1. 复习汇编语言程序设计的基本方法和步骤。

2. 复习算术运算指令。

【实验步骤】

1. 设计思想

1) 本实验将用到加减乘除运算。

2) 16位乘法结果可能有32位,因此本实验中的加减运算要考虑32位。

3) 计算步骤依照表达式中的先后次序。

2. 画出程序框图

参考流程图:

开始

程序初始化,计算X*Y

计算X*Y+Z

计算X*Y+Z-220

计算W-(X*Y+Z-220)

计算W-(X*Y+Z-220)/X

结束

3. 编程并录入

4. 汇编、连接生成.EXE文件

5. 调试、运行程序并观察记录结果。

参考程序。

DATA SEGMENT

W DW -303

X DW 1000

Y DW -15

Z DW 20

RESULT DW 2 DUP(?)

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV AX,X

IMUL Y

MOV CX,AX

MOV BX,DX

MOV AX,Z

CWD

ADD CX,AX

ADC BX,0

SUB CX,220

SBB BX,0

MOV AX,W

CWD

SUB AX,CX

SBB DX,BX

IDIV X

MOV RESULT,AX

MOV RESULT+2,DX

MOV AH,4CH

INT 21H

CODE ENDS

END START

【实验要求】

1. 输入源程序,在实验报告中列出源程序清单。

2. 分析实验过程中出现的错误的原因,说明解决办法。

3. 执行程序,记录运行结果。

AL>Y?

实验五、分支程序设计

【实验目的】

1. 掌握分支程序的一般结构和设计方法。

2. 熟悉比较指令和转移指令的使用。 【实验内容】

1. 在数据区中定义三个带符号数的字节变量。

2. 编写程序将其中的最大数找出来送到MAX 单元。 【实验准备】

1. 复习分支结构程序设计的基本方法和步骤。

2. 复习比较转移指令。 【实验步骤】 1. 设计思想

1) 本实验将用到带符号数比较转移指令。

2) 可先比较两个数,选出其中大者,再与第三个数比较。

2. 画出程序框图 参考流程图:

Y

N

Y

N

开始 程序初始化,AL ←X

AL ←Y AL ←Z

AL>Z?

A

A

MAX AL

结束

3. 编程并录入

4. 汇编、连接生成.EXE文件

5. 调试、运行程序并观察记录结果。

参考程序。

DATA SEGMENT

X DB 115

Y DB 23

Z DB -20

MAX DB ?

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV AL,X

CMP AL,Y

JG NEXT

MOV AL,Y

NEXT: CMP AL,Z

JG OK

MOV AL,Z

OK: MOV MAX,AL

MOV AH,4CH

INT 21H

CODE ENDS

END START

【实验要求】

1. 输入源程序,在实验报告中列出源程序清单。

2. 分析实验过程中出现的错误的原因,说明解决办法。

3. 执行程序,记录运行结果。

实验六、循环程序设计

【实验目的】

1. 熟悉循环控制指令的使用。

2. 掌握循环程序结构类型和循环控制方法。

3. 掌握单循环程序的一般结构和设计方法。 【实验内容】

1. 编程将数据段STR1单元开始的N 个字符移到STR2开始的区域。

2. 编程统计数据串中0出现的次数并送到另一个内存单元。(选做) 【实验准备】

1. 复习循环结构程序设计的基本方法和步骤。

2. 复习循环控制指令和串操作指令等。 【实验步骤】(实验内容1) 1. 设计思想

1) 本实验为数据块移动操作,既可用MOV 传送指令,也可用串操作指令。

2) 可以从数据块的首地址开始也可从末地址开始。

2. 画出程序框图

参考流程图(MOV 指令,首地址开始):

Y

N

Y

开始

程序初始化,SI ←STR1首地址, DI ←STR2首地址,CX ←循环次数

实现单个字符的传送 地址指针加1调整

结束 CX-1=0?

3. 编程并录入

4. 汇编、连接生成.EXE文件

5. 调试、运行程序并观察记录结果。

参考程序。

DATA SEGMENT

STR1 DB ‘WHAT IS YOU NAME?’,0AH,0DH,’$’

CN EQU $-STR1

STR2 DB CN DUP(?)

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA

MOV DS,AX

MOV ES,AX

MOV CX,CN

LEA SI,STR1

LEA DI,STR2

LP: MOV AL,[SI]

MOV [DI],AL

INC SI

INC DI

LOOP LP

MOV AH,4CH

INT 21H

CODE ENDS

END START

【实验要求】

1. 输入源程序,在实验报告中列出源程序清单。

2. 分析实验过程中出现的错误的原因,说明解决办法。

3. 执行程序,记录运行结果。

4. 编写利用串操作指令实现实验内容1的程序。

5. 说明实验内容2的设计思想。

相关主题