<<WinDbg 调试实践基础>> 第一章:内存,寄存器和简单的运算 (1)

翻译 2013年12月05日 22:25:26

本文翻译自 <<Windows Debugging Practical Foundations>>

第一章:内存,寄存器和简单的运算 

Chapter 1: Memory, Registers and Simple Arithmetic

 

计算机中理想化的内存和寄存器

Memory and Registers inside an Idealized Computer

 

计算机的内存是由连续的内存单元组成的。每一个内存单元具有唯一的地址。每一个单元可以包含一个“数值”,我们把这个“数值”叫做在这个内存单元地址的内容。内存的访问相对于计算指令来说是比较慢的,为了提高速度,需要用内存来存储临时的结果以加速复杂的操作,这个用来临时存储的内存叫做寄存器。寄存器是独立的内存单元,寄存器的名字就是它的地址。

 

chap_1_1.jpg

图1.1

 

Intel 32位pc 上的内存和寄存器
Memory and Registers inside Intel 32-bit PC

 

在这里内存位置的地址是数字组成。通常内存地址是由彼此相差4的整数组成。我们在在下图右侧显示了两个寄存器EAX和EDX。

 

chap_1_2.jpg

图1.2

 

因为内存单元可以存储数字,所以接下来我们创建一个工程来做一个简单的运算:让电脑计算两个数字的和,我们通过这个工程来看看内存和寄存器是如何存储和如何改变他们的值的。我们给这个工程起名叫做“Arithmetic”。

 

“Arithmetic”项目: 内存布局和寄存器
“Arithmetic” Project: Memory Layout and Registers

 

        在我们的这个项目中有两个内存地址:“a” 和“b”。我们可以把“a” 和 “b”想象成它们各自的地址的名称。现在我们引入一个特殊的记号标记:[a] 代表内存地址“a”中的内容。如果我们使用C和C++语言来实现这个项目,我们可以声明和定义内存地址“a” 和 “b” 如下:

        static int a, b;

当我们载入程序,静态内存中的内容被初始化为“0”。下面是载入这个程序后的内存层次结构图。

 

chap_1_3.jpg

图1.3

 

“Arithmetic”项目:一个计算机程序
“Arithmetic” Project: A Computer Program

     我们可以把计算机程序想象成一系列用来操纵内存单元和寄存器的指令。比如说一个加法操作:将12号内存单元中的内容和14号内存单元中的内容相加。伪代码表示如下:

     [14]:= [14] + [12]

    下表左面显示的是我们的第一个程序的伪代码:

 

[a] := 1

[b] := 1

[b] := [b] + [a] ;[b] = 2

[b] :=[b] * 2    ;[b] = 4

 

这里我们先把每条汇编指令写成相应的伪码

伪码中“:=”的含义是对需要替换的内存地址中的内容进行赋值。“;” 是注释标识,分号后面是注释内容。

用高级语言写的程序代码会被编译器编译成机器语言。如果机器语言被某种助记系统表示成相应的助记符号,则机器语言也就具有了可读性。我们把这个助记系统叫做汇编语言。举个例子: INC [a],表示将内存地址a中存储的值加1。

 

“Arithmetic”项目:给内存地址赋值
“Arithmetic” Project: Assigning Numbers to Memory Locations

我们提到“a”代表内存单元的位置(地址),同时它也是地址 00428504的名称(参见图1.3),[a]代表存储在地址“a”中的内容。

如果我们使用C/C++语言,”a” 被称作”变量a”,对”a”赋值用C/C++语言这样写:

  a = 1;

 

用Intel汇编语言我们这样写:
       mov [a], 1

 

    在WinDbg反汇编输出中我们可以看到如下的代码:

    mov dword ptr [ArithmeticProject!a (00428504)], 1

   

     变量”a”以!作为前缀,ArithmeticProject是可以执行文件ArithmeticProject.exe 的名字。
     在下面表格右面列出了前两行伪代码对应的汇编代码:

    

 

[a] := 1

[b]:= 1

[b] := [b] + [a]; [b] = 2

[b] :=[b] * 2;  [b] = 4

 

 

mov [a], 1

mov [b], 1

     执行完前两行汇编指令,和图1.3比较,内存中的布局如下图1.4

 

     chap_1_4.png

WinDbg修改寄存器和内存

1:修改寄存器命令  r @eax=1 2: 修改内存命令 ed (esp+8) 0xffffffff
  • nightelve
  • nightelve
  • 2013年11月21日 22:20
  • 3823

windows高级调试 第五章 内存破坏之一-栈 实例三:栈溢出 动手实践的过程

最近一段时间,在工作中一直在进行windows下面的软件调试。使用的调试工具是windbg。但是对这个工具不熟悉,很多命令都不会,只好靠多看书来补充了。看了以前买的一本书《Advanced Windo...
  • haojiahuo50401
  • haojiahuo50401
  • 2012年03月04日 23:36
  • 1632

《分布式java运用:基础与实践》笔记1

第一章 分布式java运用 网络通信:       通常基于网络协议实现:TCP/IP(可靠) 、UDP/IP(即时)       同步IO{ BIO(blocking  IO):以阻塞方式发起IO操...
  • lylhjh
  • lylhjh
  • 2016年03月16日 17:29
  • 320

Windbg调试----Windbg入门

Windbg简单来说就是一个Windows下对用户态/内核态的程序进行调试,以及对Core Dump文件的分析。对于Crash,资源泄露,死锁等问题的分析,Windbg是一个强有力的利器。相关资料本人...
  • CJF_iceKing
  • CJF_iceKing
  • 2016年08月05日 13:26
  • 4415

【信息资源管理】第一章:信息资源管理基础

导读:         信息琢磨不定,你感觉到它却不能很好理解它,只有很好的理解它才能更好的去感受  它。         花了一点时间对第一章进行了详读,顿时感...
  • mengdonghui123456
  • mengdonghui123456
  • 2016年02月16日 10:21
  • 1016

调试寄存器(DRx)理论与实践

调试寄存器(DRx)理论与实践By Hume/冷雨飘心前言+牢骚:生活的苦痛就象烈火,时时煎熬着伤痕累累疲惫不堪的那颗心。我拼力挣扎,然而却无济于事……太残酷了….上帝也在苦笑。           ...
  • zhaofuguang
  • zhaofuguang
  • 2013年10月18日 14:55
  • 670

windbg寄存器指令——rM

1.windbg中直接输入r是转储常用的寄存器的值: kd> r eax=00000001 ebx=ffdff980 ecx=8054bd4c edx=000002f8 esi=0000000...
  • wuyangbotianshi
  • wuyangbotianshi
  • 2014年09月27日 23:42
  • 2027

使用windbg检测内存泄漏

使用windbg检测内存泄漏 缘起: 作为C++程序员,检测内存泄漏是非常痛苦的事情。尤其是看着程序的内存在一直增长,你却无能为力。此时,windbg可以用来检测内存泄漏。 配置windbg: 1...
  • huntzw
  • huntzw
  • 2014年03月24日 16:58
  • 2800

调试寄存器(debug registers, DRx)理论及实践

导读:  标 题:DRx寄存器的使用(待续) (4千字) 发信人:hume   时 间:2003-06-18 17:33:11 详细信息: 调试寄存器(DRx)理论与实践 By Hume/...
  • sdulibh
  • sdulibh
  • 2016年02月27日 20:39
  • 400

windbg查找c#高内存原因

1.WinDbg.exe WinDbg.exe是windows平台的debug工具, 但是c#的程序需要SOS.DLL和SOSEX.DLL来支持。 其中SOS.DLL,该扩展包是.NET平台的一部...
  • xiaoxianerqq
  • xiaoxianerqq
  • 2015年10月14日 14:52
  • 741
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:<<WinDbg 调试实践基础>> 第一章:内存,寄存器和简单的运算 (1)
举报原因:
原因补充:

(最多只允许输入30个字)