一. 实验目的
1)进一步掌握windbg调试器的使用方法;
2)通过windbg观察不同寻址方式的结果;
3)学习编写简单汇编程序。
二. 实验内容
编译eg0002.asm
Windbg调试
设置windbg调试环境
三. 实验过程和程序
程序代码:
;eg0002.asm
include io32.inc
;定义数据段
.data
bvar byte 12h ;定义字节类型数据
array word 0Ah,0Bh,0Ch,0Dh,0Eh,0AAH,0BBH,0CCH,0DDh,0EEh ;定义字类型数组
arr_size = $-array ;计算数组大小,以字节为单位
arr_len = arr_size/2 ;计算以字为单位的数组大小
wvar word 5678h ;定义字类型数据
dwvar dword 12345678h ;定义双字类型数据
i dword 0 ;定义变量i,赋初值0
;定义代码段
.code
start:
mov ax , 0ABCDh ;单字立即数寻址
mov ebx, 0ABCDh ;双字立即数寻址
mov ax , array ;直接寻址
mov ebx, dword ptr array+1 ;寻址类型不匹配时使用 dword ptr强制转换
mov al , type bvar ;计算类型占用的字节数,byte类型占1个字节
mov al , type wvar ;word类型占2个字节
mov eax, lengthof array ;计算数组长度,以类型为单位
mov edi, sizeof array ;计算数组长度,以字节为单位
mov ebp, arr_size ;这一组实际上都是立即数,因为是在编译时就计算出来的常数值
lea eax, array ;取数组地址
mov ebx, i ;取i的值
p_next:
mov cx , [eax+ebx*2] ;读入array中的第i个数据到cx,因为array是word类型,所以乘以2
call disprw
cmp ebx, lengthof array ;比较i的值与数组长度
je p_end;
inc ebx ;i=i+1
jmp p_next ;循环取下一个数
p_end:
exit 0
end start ;指定入口点
四. 实验结果和分析
启动编译环境win32.bat
输入命令:(1)make32 eg0002 (2)eg0002
结果如下:
设置windbg调试环境:
设置好3个路径,eg0201.*等文件所在的目录
其它两个路径和这个一样
打开程序和源文件:
加载程序和源码后,在windbg中输入命令:
(1).reload/f (2)lm
结果如下:
输入命令:
g @$exentry
程序将直接运行,并在程序入口点停止,结果如下:
输入单步执行命令:P
结果如下:
输入查看变量信息命令:
dt eg0002!*
结果如下: