一、实验目的:
1.熟悉汇编语言的编辑、汇编、链接、运行与调试的全过程。
2.掌握Masm for Windows 集成开发软件的应用。
二、实验内容:
1、源程序文件:HELLO.ASM,调用DEBUG调试程序,给出相应的调试结果。
2、编程实现如下功能并通过DEBUG对程序进行调试:
若有一个数为X=10,利用加法指令和移位指令完成:
(1)X* 2
(2)X* 4
(3)X* 10
三、实验步骤
1、建立汇编语言源程序,并汇编、链接、生成*,exe文件。
2、进入 DEBUG,对exe文件进行调试
3、在BUF单元预置一个有符号数X,BUF1存放X2,BUF2存放X4,BUF3存放X*10用G命令运行程序,通过D命令查看内存,记下程序运行后BUF1、BUF2及BUF3单元的内容,并分析。
4.用T命令运行程序,记下执行每条指令后IP的内容和下一条要执行的指令,以及每一次执行指令后寄存器,内存单元数据变化情况。
四、实验代码:
实验内容1代码:
DATAS SEGMENT
;此处输入数据段代码
STRING DB 'Hello World!',13,10,'$'
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
LEA DX,STRING
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
实验内容2代码:
;若有一个数为X=10,利用加法指令和移位指令完成:
;(1)X*2
;(2)X*4
;(3)X*10
DATAS SEGMENT
; 此处输入数据段代码
X DW 10 ; 初始化 X 为 10
Result1 DW 0 ; 存储 X*2 的结果
Result2 DW 0 ; 存储 X*4 的结果
Result3 DW 0 ; 存储 X*10 的结果
DATAS ENDS
STACKS SEGMENT
; 此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
; 此处输入代码段代码
;X*2(左移1位),AX 存 X * 2
MOV AX, X
SHL AX, 1
MOV Result1, AX ; 存储结果
;X*4
MOV AX, X
SHL AX, 1 ; 使用左移2位实现 X*4
SHL AX, 1
MOV Result2, BX ; 存储结果
;X*10
MOV AX, X
SHL AX, 1 ; 使用左移三位实现 X*8
SHL AX, 1
SHL AX, 1
ADD AX, X ;使用加法指令实现X*10
MOV Result3, CX ; 存储结果
MOV AH, 4CH
INT 21H
CODES ENDS
END START
五、程序流程图(实验内容2)
六、实验结果:
(在本实验结果的DEBUG调试中,由于实验1只是学习调试步骤的使用,因此只针对实验2进行具体的调试,结果如下所示。)
DEBUG命令:
(1)R命令
用于查看或修改寄存器内容:
R(回车)
各标志位状态定义如下:
标志名 1 0
OF OV NV
DF DN UP
IF EI DI
SF NG PL
ZF ZR NZ
AF AC NA
PF PE PO
CF CY NC
0771: 0000 B87007 MOV AX,0770 (MOV AX,DATAS)
CS IP 指令对应机器码 第一条指令
(2)D命令
用于显示内存单元的内容,使用格式有下列几种:
D(回车) ;从DEBUG初始化时的段和偏移量的地址开始显示
D 00(回车) ;显示DS:00地址开始的80H(128)个字节内容
D DS:00 0F(回车) ;显示DS:00到CS:0F地址的内容
(3)E命令
用于修改存储单元的内容,使用格式有下列几种:
E DS:00 1 2 3 4 5(回车) ;DS:00开始的5个单元内容改成了1、2、3、4、5
修改后可使用D命令,查看该地址单元的内容是否被修改。通过D命令查看内存,发现DS:00-DS:04存放的数据确实修改为1 2 3 4 5.
(4)U命令
用于对指令码进行反汇编(机器码→符号指令),显示它们的地址、机器码和操作数以及汇编指令语句,使用格式为:
U (回车) ;将CS:00地址开始的32个单元内容进行反汇编
0771: 0000 B87007 MOV AX,0770
(MOV AX,DATAS)
CS(段基址) IP(偏移地址) 指令对应机器码 符号指令
U 10 6(回车) ;将CS:10地址开始的6个单元内容进行反汇编
(5)T命令
用于逐条指令跟踪,使用格式为:
T(回车)从当前的CS:IP开始执行,执行完一条指令停下来
T (=CS:IP)(n)(回车) 从指定CS:IP开始执行,执行完n条指令停下来
(6)G命令
G (CS1:IP1) (回车) 从当前的CS:IP开始执行。后面的地址CS1:IP1为断点地址,当指令执行到断点时,就停止执行并显示当前所有寄存器及标志位的内容,和下一条将要执行的指令。
(7)Q命令
用于退出DEBUG管理,返回DOS,使用格式为:
Q(回车)