2.4通用寄存器下
2.4通用寄存器下
本节必须掌握的知识点:
u掌握DTDebug界面、并熟练使用
u熟记汇编窗口的组成及寄存器窗口的组成
u MOV指令的熟练使用
u掌握字节、字、双字的知识
u使用汇编指令对8位、16位、32位寄存器数据的存储
在2.3节中介绍通用寄存器的知识,并且知道了寄存器是处理器(CPU)中用来存储数据的地方。接下来我们借用软件了解2.3节中的知识点。
2.4.1【DTDebug软件】
DTDebug.exe是供程序员使用的程序调试工具。【本节只简单介绍DTDebug的使用,详细说明书请到编程达人官网去下载相关文档】
在2.1节中介绍DTDebug软件的安装步骤,相信大家已经安装好这个软件。接下来介绍这个软件的使用。
双击DTDebug.exe软件图标如图2-4-1所示,打开界面如图2-4-2所示。
图2-4-2是软件的原始界面,没有任何记录。那该怎么把将要被调试的程序打开哪?
有四种方式:
1、在如图2-4-2程序窗口中找到File -> Open ->找到调试程序;
2、直接将要被调试的程序拖拽到如图2-4-2程序窗口中。
3、关闭如图2-4-2窗口,把将要被调试的程序拖到如图2-4-1DTDebug图标上。
4、在如图2-4-2程序窗口中找到File -> Attach ->找到将要被调试的程序(正在运行的软件)。
以IPMGS.exe为例,介绍DTDebug界面,如图2-4-3,图2-4-4所示。
图2-4-4中标注的4个窗口,分别为汇编窗口、寄存器窗口、内存窗口、堆栈窗口。
【本节中只是简单介绍,更深入的操作以后课程会介绍】
2.4.2【汇编窗口】
简单介绍汇编窗口,汇编窗口由内存、特征码、汇编、标注区(从左向右)这四块组成。【在本节这三块不做介绍】
一个程序运行以后,处理器会一行行的执行它的代码,如图2-4-4处理器会沿着汇编窗口从上往下一行行执行代码,直至结束。跟着操作时肯定会有如下疑问,首先没有看到被调试的程序运行,其次汇编窗口并没有从上往下一行行执行代码。接下来解答一下,DTDebug软件是可以中断当前运行的程序的,如图2-4-4黄色区域中写着Paused
表示当前程序是被中断的,其次接着看图2-4-4汇编窗口中有黑色区域表示当前被调试的程序被中断在这块内存区域。该块区域是被调试程序的入口点。【文中讲到的中断指:处理器运行到该段程序时,让该程序停止运行了】。 那怎么让程序一行行往下执行哪?看图2-4-4中有一个三角符号
,按下程序将会一行行往下执行,此时被调试的程序就会运行起来。
接下来介绍寄存器窗口。如图2-4-4寄存器窗口所示。
2.4.3【寄存器窗口】
简单介绍寄存器窗口,寄存器窗口由EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI这8个通用寄存器,还有EIP寄存器、EFLAGS寄存器及它们相对应存储的数值。
EIP、EFLAGS寄存器与8个通用寄存器的区别在于,以EAX寄存器为例,EAX寄存器可以任意读写数据,而EIP寄存器,它的作用是存放当前代码段即将被执行的下一条指令的地址,不可以随意读写,如图2-4-4寄存器窗口所示,EIP当前存储的值为:004185B7,看汇编窗口黑色区域和EIP存储的值是一样的。那么EFLAGS是标志寄存器,它是受特殊汇编指令的控制,特殊汇编指令决定它当前数值位的变化,【本节不做详细介绍,内存窗口和堆栈窗口本节不做介绍】。
寄存器窗口简单介绍完了,那怎么用通用寄存器哪?在介绍使用之前先介绍一个指令。
2.4.4【MOV指令】
MOV指令是移动数据。MOV指令可以把立即数移动到寄存器,也可以把寄存器的数据移动到寄存器。
例:
MOV EAX,1 (把1移动到EAX寄存器里)
MOV EAX,ECX (把ECX寄存器的数据移动到EAX寄存器里)
用DTDebug软件把例题操作一遍。首先打开软件如图2-4-4所示,将鼠标移动到汇编窗口,双击黑色区域所对应的那一行汇编代码,弹出输入指令窗口如图2-4-5所示,把鼠标移动到输入窗口中,将里面的指令编写成:MOV EAX,1如图2-4-6所示,点击Enter键,汇编指令将被显示到汇编窗口,如图2-4-7所示。MOV EAX,ECX重复以上的操作。完成后按F8执行,观察寄存器窗口,如图2-4-8、图2-4-9所示。
弹出输入指令窗口
输入指令:MOV EAX,1
输完指令点击键盘Enter键
F8单步运行
F8单步运行
简单介绍完了MOV指令,通过对MOV指令的编写、运行,寄存器相对应存储的数据发生了变化,那这些数据是怎么存储的哪?接下来介绍数据在通用寄存器中的存储。
2.4.5【通用寄存器对数据的存储】
先回顾一下8位、16位、32位通用寄存器。
如通用寄存器表所示。
根据图2-4-9寄存器窗口所示,EAX对应的数据是:0x0012FFB0.只有8个数据。而EAX是32位的,它是怎么存储的哪?
这里要回顾一下字节、字、双字这个知识点。
字节:记为Byte,一个字节由8个bit组成,可以存在8位寄存器中。
字:记为Word,一个字由两个字节组成,这两个字节分别为这个字的高位字节和低位字节,可以存在16位寄存器中。
双字:记为DoubleWord,一个双字由2个字组成,这两个字分别为这个双字的高位字和低位字,可以存在32位寄存器中。
一个双字可以存在一个32位寄存器中,这个双字由高位字和低位字组成。低位字可以存放16位寄存器,而16位寄存器,由两个字节组成,这个高位字节和低位字节自然就存在这个寄存器的高8位寄存器和低8位寄存器中。
以EAX寄存器为例,如图2-4-10所示。
图2-4-10 EAX寄存器逻辑结构图
知道了字节、字、双字,在看寄存器窗口中的数据相信大家知道它是怎麽存储了的。
接下来用汇编指令来实现对8位、16位、32位寄存器进行存储。
以下例题自己在软件中实验,增强寄存器对数据存储的认识,其次可以加强对MOV指令的练习,再者多熟悉该软件,我们以后的章节都会用到。
例:
MOV AL,1
MOV AH,2
MOV AX,0xFFFF
MOV EAX,0xFFFF0000
MOV CL,1
MOV CH,2
MOV CX,0xFFFF
MOV ECX,0xFFFF0000
u下一节介绍内存。
练习:
1、MOV EAX,200
MOV EAX,CX 可以这样操作吗?对吗?大家思考一下
MOV CL,300 这个指令是错误的吗?思考一下为什么错?怎样写才正确
MOV ECX,EAX 说出哪个是源操作数、哪个是目的操作数、哪个是操作码
2、能够正确理解字节、字、双字,且可以用汇编指令对8位寄存器的高位、低位熟练的操作,熟练对16位、32位寄存器正确存储数据。