OllyICE反汇编教程及汇编命令详解

合集下载

OllyICE使用说明与示例

OllyICE使用说明与示例

OllyICE使用说明与示例一、OllyDBG 的安装与配置OllyDBG 1.10 版的发布版本是个 ZIP 压缩包,只要解压到一个目录下,运行OllyDBG.exe 就可以了。

汉化版的发布版本是个 RAR 压缩包,同样只需解压到一个目录下运行 OllyDBG.exe 即可:OllyDBG 中各个窗口的功能如上图。

简单解释一下各个窗口的功能,更详细的内容可以参考 TT 小组翻译的中文帮助:反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗口中右击出现的菜单界面选项->隐藏标题或显示标题来进行切换是否显示。

用鼠标左键点击注释标签可以切换注释显示的方式。

寄存器窗口:显示当前所选线程的 CPU 寄存器内容。

同样点击标签寄存器 (FPU) 可以切换显示寄存器的方式。

信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。

数据窗口:显示内存或文件的内容。

右键菜单可用于切换显示方式。

堆栈窗口:显示当前线程的堆栈。

要调整上面各个窗口的大小的话,只需左键按住边框拖动,等调整好了,重新启动一下 OllyDBG 就可以生效了。

启动后我们要把插件及 UDD 的目录配置为绝对路径,点击菜单上的选项->界面,将会出来一个界面选项的对话框,我们点击其中的目录标签:因为我这里是把 OllyDBG 解压在 F:\OllyDBG 目录下,所以相应的 UDD 目录及插件目录按图上配置。

还有一个常用到的标签就是上图后面那个字体,在这里你可以更改 OllyDBG 中显示的字体。

上图中其它的选项可以保留为默认,若有需要也可以自己修改。

修改完以后点击确定,弹出一个对话框,说我们更改了插件路径,要重新启动 OllyDBG。

在这个对话框上点确定,重新启动一下 OllyDBG,我们再到界面选项中看一下,会发现我们原先设置好的路径都已保存了。

有人可能知道插件的作用,但对那个 UDD 目录不清楚。

反汇编入门经典教程

反汇编入门经典教程

反汇编入门经典教程-CAL-FENGHAI.-(YICAI)-Company One1反汇编入门教程仅以此文来描述如何反汇编一个EXE程序,这里采用的是静态反汇编,也就是先把整个程序全部反汇编成汇编语言后进行修改,这个例子很简单,首先是我从看雪论坛上下载到的一个程序然后我们使用打开它,可以看到这个EXE程序在反编译以后的内容双击正式启动这个程序,随便输入注册码123,点击C HECK这里可以看到程序在输入错误后提示的内容然后我们使用"串式数据参考",找到这个字符串的位置这个位置如下可以看到在我程序的0040段,15B9这个偏移地址下程序输出了这个字符串,然后我们考虑一下,程序在我输入了错误的注册码,并且点击了CHECK以后,弹出了这个字符串,我们向上找,应该可以找到一个跳转,类似JE,JNE,JMP之类的东西,跳转到此处,位置如下可以看到在偏移地址15AB下有一个入口,注意R EFERENCED BY .....这句,是说"有人从这里插队了"到底是谁"插队"到这里了呢,是00401595这个代码.现在我们跳转到这个位置去追踪它输入00401595可以看到是个JNE(不等跳转),我们只要把这个JNE改成JE就可以了使用HIEW打开这个程序打开以后看到一堆乱码,这是因为它是用文本方式打开了一个EXE程序这里我们按F4,选择DECODE(反汇编)模式这回看到的就都是机器码了然后按F5,输入1595(刚才我们找到的那个语句地址),找到那个位置就是这个7516的JNE命令,我们要把它改成JE,这里直接把7516这个机器码修改成7416按F3进入编辑模式然后按F9保存这回再次打开修改后的程序,重新输入123,可以看到CRACK后的结果是完成!反汇编反汇编:把目标代码转为汇编代码的过程,也可说是把编程语言转为汇编语言代码,低级转高级的意思,常用于软件破解(例如找到它是如何注册的,从而解出它的注册码或者编写注册机。

反汇编入门经典教程

反汇编入门经典教程

反汇编入门经典教程反汇编是一种通过逆向工程将机器码转换为可读的汇编代码的过程。

它是了解程序内部工作原理、检测和修复软件漏洞、进行逆向工程等任务的重要工具。

以下是一个反汇编入门经典教程。

第一步:安装反汇编工具要进行反汇编,您需要一个适当的反汇编工具。

一些常用的反汇编工具包括IDA Pro、OllyDbg和Ghidra。

选择其中一个工具,并按照其官方指南安装和配置。

第二步:了解基础知识在开始反汇编之前,您需要掌握一些基础知识。

首先了解汇编语言的基本概念,如寄存器、指令、内存等。

还应该了解不同的汇编指令以及它们的功能和用法。

您可以通过阅读相关的教程和文档来学习这些知识。

第三步:打开目标程序使用反汇编工具打开您要分析的目标程序。

您可以选择一个已编译的可执行文件或者一个在内存中运行的进程。

请确保您具有对该文件或进程的合法访问权限。

第四步:分析代码一旦您打开了目标程序,您将看到程序的汇编代码。

您可以使用工具提供的各种功能来分析代码。

以下是一些基本的分析技巧:1.寻找入口点:在大型程序中,找到程序的入口点是一个重要的第一步。

入口点通常是程序启动时执行的第一条指令。

2.跟踪程序流程:使用调试器功能可以帮助您了解程序的执行流程。

您可以设置断点,在执行到断点时暂停程序并检查寄存器和内存的值。

3.理解函数调用:函数调用是程序执行流程的重要部分。

您可以查看函数调用的汇编指令,并分析参数传递、返回值和栈操作等信息。

4.检查条件和跳转:程序中的条件和跳转指令对于控制程序流程起着重要作用。

您可以跟踪这些指令,以了解程序在不同情况下的执行路径。

第五步:理解代码功能一旦您分析了程序的汇编代码,您将能够了解程序的功能和工作原理。

您可以通过查看函数、变量和各种数据结构的命名来获得有关代码的更多上下文信息。

理解代码的功能将有助于您进行进一步的分析和调试。

第六步:修改代码在一些情况下,您可能希望修改程序的汇编代码。

例如,您可能希望修复一个软件漏洞或者修改程序的行为。

OllyICE反汇编教程及汇编命令详解

OllyICE反汇编教程及汇编命令详解

OllyICE反汇编教程及汇编命令详解常用汇编命令大全一、常用指令1. 通用数据传送指令.MOV 传送字或字节.MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字压入堆栈.POP 把字弹出堆栈.PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSWAP 交换32位寄存器里字节的顺序XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )XADD 先交换再累加.( 结果在第一个操作数里 )XLAT 字节查表转换.BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )2. 输入输出端口传送指令.IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,其范围是 0-65535.3. 目的地址传送指令.LEA 装入有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS 传送目标指针,把指针内容装入DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送目标指针,把指针内容装入ES.例: LES DI,string ;把段地址:偏移地址存到ESDI.LFS 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FSD.LGS 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GSDI. LSS 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SSDI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装入AH.SAHF 标志寄存器传送,把AH内容装入标志寄存器. PUSHF 标志入栈.POPF 标志出栈.PUSHD 32位标志入栈.POPD 32位标志出栈.二、算术运算指令ADD 加法.ADC 带进位加法.INC 加 1.AAA 加法的ASCII码调整.DAA 加法的十进制调整.SUB 减法.SBB 带借位减法.DEC 减 1.NEC 求反(以 0 减之).CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.DAS 减法的十进制调整.MUL 无符号乘法.IMUL 整数乘法.以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算), AAM 乘法的ASCII码调整.DIV 无符号除法.IDIV 整数除法.以上两条,结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW 字节转换为字. (把AL中字节的符号扩展到AH中去) CWD 字转换为双字. (把AX中的字的符号扩展到DX中去) CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去) CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)。

ollydbg汇编指令

ollydbg汇编指令

OLLYDBG汇编指令OllyDbg是一款在Windows平台上广泛使用的调试器,主要用于逆向工程和漏洞分析。

在使用OllyDbg进行反汇编和调试时,掌握常见的汇编指令是至关重要的。

以下是一些常见的x86汇编指令以及它们在OllyDbg中的使用和解释。

1.MOV - 数据传送指令assemblyMOV destination, source描述:用于将源操作数的内容传送到目标操作数中。

示例:assemblyMOV EAX, DWORD PTR DS:[ESI]将DS段中ESI偏移处的32位数据传送到EAX寄存器。

2.ADD - 加法指令assemblyADD destination, source描述:将源操作数的值加到目标操作数上。

示例:assemblyADD ECX, 5将ECX寄存器的值加上5。

3.SUB - 减法指令assemblySUB destination, source描述:从目标操作数中减去源操作数的值。

示例:SUB EDX, 10将EDX寄存器的值减去10。

4.CMP - 比较指令assemblyCMP operand1, operand2描述:比较两个操作数的值,但不修改它们。

示例:assemblyCMP EAX, EBX比较EAX和EBX的值。

5.JMP - 无条件跳转指令assemblyJMP destination描述:无条件跳转到指定的目标地址。

示例:assemblyJMP 0x401000无条件跳转到地址0x401000。

6.JE/JZ - 条件跳转指令assemblyJE destination描述:如果前一次比较为相等,则跳转到指定的目标地址。

示例:assemblyJE 0x401000如果上一次比较相等,就跳转到地址。

7.CALL - 调用指令assemblyCALL destination描述:调用指定地址处的函数或子程序。

示例:assemblyCALL 0x401020调用地址0x401020处的函数。

OllyICE使用教程

OllyICE使用教程

OllyICE使用说明与示例一、OllyDBG 的安装与配置OllyDBG 1.10 版的发布版本是个 ZIP 压缩包,只要解压到一个目录下,运行 OllyDBG.exe 就可以了。

汉化版的发布版本是个 RAR 压缩包,同样只需解压到一个目录下运行 OllyDBG.exe 即可:OllyDBG 中各个窗口的功能如上图。

简单解释一下各个窗口的功能,更详细的内容可以参考 TT 小组翻译的中文帮助:反汇编窗口:显示被调试程序的反汇编代码,标题栏上的地址、HEX 数据、反汇编、注释可以通过在窗口中右击出现的菜单界面选项->隐藏标题或显示标题来进行切换是否显示。

用鼠标左键点击注释标签可以切换注释显示的方式。

寄存器窗口:显示当前所选线程的 CPU 寄存器内容。

同样点击标签寄存器 (FPU) 可以切换显示寄存器的方式。

信息窗口:显示反汇编窗口中选中的第一个命令的参数及一些跳转目标地址、字串等。

数据窗口:显示内存或文件的内容。

右键菜单可用于切换显示方式。

堆栈窗口:显示当前线程的堆栈。

要调整上面各个窗口的大小的话,只需左键按住边框拖动,等调整好了,重新启动一下 OllyDBG 就可以生效了。

启动后我们要把插件及 UDD 的目录配置为绝对路径,点击菜单上的选项->界面,将会出来一个界面选项的对话框,我们点击其中的目录标签:因为我这里是把 OllyDBG 解压在 F:\OllyDBG 目录下,所以相应的 UDD 目录及插件目录按图上配置。

还有一个常用到的标签就是上图后面那个字体,在这里你可以更改 OllyDBG 中显示的字体。

上图中其它的选项可以保留为默认,若有需要也可以自己修改。

修改完以后点击确定,弹出一个对话框,说我们更改了插件路径,要重新启动 OllyDBG。

在这个对话框上点确定,重新启动一下 OllyDBG,我们再到界面选项中看一下,会发现我们原先设置好的路径都已保存了。

有人可能知道插件的作用,但对那个 UDD 目录不清楚。

初识exe程序反汇编小感[转]

初识exe程序反汇编小感[转]

初识exe程序反汇编小感[转]本文出自“空中的鱼” 博客,出处/358752/264819近期由于一个项目的需要,我初步接触了exe程序反汇编。

折腾了好几天终于见到了那个程序中急需的算法的真面目了。

回顾整个过程,小有感悟。

为记念初识程序反汇编的心路历程,特记录下对程序反汇编过程的粗浅感受。

一、工作环境:1、查壳工具:PEiD(用于初步确定exe程序是否加壳以及使用何种开发软件编写);2、反编译工具:DeDe(经过查壳工具检查,将要被反汇编的程序是用“BorlandC++ 1999”编写的,所以选用专门反编译Delphi程序的DeDe;用于初步确定程序模块、函数方法划分对应exe程序相应汇编指令地址的位置);3、反汇编动态调试工具:OllyICE(即,OD;用于动态反汇编调试程序的相关代码逻辑);4、开发环境: 2005;5、其他工具:EditPlus、记事本、计算器等若干;二、基础知识:1、汇编程序设计:主要深入了解程序数据存放、堆栈使用、子程序调用等技巧;不同类型数据的地址跳转规则(一般都是跳转该类型长度个位置);2、c++程序设计:基本语法结构;指针、数据类型的使用和控制;3、相关工具软件的基本使用方法;三、工作过程:我的反汇编大概过程是:查壳->脱壳、判断开发程序使用的环境->反编译->初步定位主要功能模块或函数的汇编指令起始、终止地址->反汇编准备->查找程序中的特征字符串或特征值,进一步确定需要反汇编的代码逻辑的位置->开始反汇编调试运行,分析需要反汇编的代码逻辑的具体过程->将分析出来的逻辑流程使用c++语言实现。

1、查壳:运行PeiD,打开要反汇编的exe程序,在这里姑且称之为:test.exe吧。

如示意图1:“多项扫描”上面那行“Microsoft Visual C++ 7.0 Dll Method 3”就是该程序的开发环境了。

接下来电击窗口右下角的“>>”按钮,再来看看该程序是否加壳,如示意图2:分别点击“熵值”、“EP校验”、“快速校验”这三行最右侧的“-”按钮,就可以看到是否加壳的提示了。

汇编教程汇编指令详解

汇编教程汇编指令详解

汇编教程汇编指令详解
汇编语言可以说是机器语言的一种直观形式,是与硬件直接相关的低
级程序设计语言。

它是一种以简洁的汇编指令来表达操作码机器指令的程
序设计语言,汇编语言的指令代码一般比机器语言的指令代码要短,是编
写高效、可移植的机器级程序的理想语言。

汇编语言的基本构成:
(1)指令集:汇编语言的指令集是机器的最基本和最重要的组成部分,也是机器的指令集,描述了机器所做的操作。

(2)操作数:汇编语言的指令集中涉及到的操作数有多种,比如寄
存器操作数、立即数、内存操作数等。

(3)运算和转移指令:汇编语言中的运算和转移指令包括算术运算
指令、比较指令、逻辑运算指令、移位指令等,它们是机器执行的基本操作。

(4)转移指令:汇编语言中的转移指令可以改变机器指令的执行顺序,并实现分支程序设计。

(5)I/O指令:汇编语言中的I/O指令可以实现与外部设备的通信,获取外部设备提供的数据。

(6)汇编指令:汇编指令用于移植各种汇编程序到不同的处理器上,从而实现程序的机器无关性。

一、MOV指令:
MOV指令用于把操作数的值赋给另一个操作数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

OllyICE反汇编教程及汇编命令详解[转]2009-02-11 08:09OllyICE反汇编教程及汇编命令详解内容目录计算机寄存器分类简介计算机寄存器常用指令一、常用指令二、算术运算指令三、逻辑运算指令四、串指令五、程序跳转指令------------------------------------------计算机寄存器分类简介:32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。

32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。

对低16位数据的存取,不会影响高16位的数据。

这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。

4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。

程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。

寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。

可用于乘、除、输入/输出等操作,使用频率很高;寄存器EBX称为基地址寄存器(Base Register)。

它可作为存储器指针来使用;寄存器ECX称为计数寄存器(Count Register)。

在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;寄存器EDX称为数据寄存器(Data Register)。

在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。

在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。

2、变址寄存器32位CPU有2个32位通用寄存器ESI和EDI。

其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。

寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。

变址寄存器不可分割成8位寄存器。

作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。

它们可作一般的存储器指针使用。

在字符串操作指令的执行过程中,对它们有特定的要求,而且还具有特殊的功能。

3、指针寄存器其低16位对应先前CPU中的BP和SP,对低16位数据的存取,不影响高16位的数据。

32位CPU有2个32位通用寄存器EBP和ESP。

它们主要用于访问堆栈内的存储单元,并且规定:EBP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;ESP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。

寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。

指针寄存器不可分割成8位寄存器。

作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。

4、段寄存器段寄存器是根据内存分段的管理模式而设置的。

内存单元的物理地址由段寄存器的值和一个偏移量组合而成的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。

CPU内部的段寄存器:ECS——代码段寄存器(Code Segment Register),其值为代码段的段值;EDS——数据段寄存器(Data Segment Register),其值为数据段的段值;EES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;ESS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;EFS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;EGS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。

在16位CPU系统中,它只有4个段寄存器,所以,程序在任何时刻至多有4个正在使用的段可直接访问;在32位微机系统中,它有6个段寄存器,所以,在此环境下开发的程序最多可同时访问6个段。

32位CPU有两个不同的工作方式:实方式和保护方式。

在每种方式下,段寄存器的作用是不同的。

有关规定简单描述如下:实方式:前4个段寄存器CS、DS、ES和SS与先前CPU中的所对应的段寄存器的含义完全一致,内存单元的逻辑地址仍为“段值:偏移量”的形式。

为访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量。

保护方式:在此方式下,情况要复杂得多,装入段寄存器的不再是段值,而是称为“选择子”(Selector)的某个值。

5、指令指针寄存器32位CPU把指令指针扩展到32位,并记作EIP,EIP的低16位与先前CPU中的IP作用相同。

指令指针EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。

在具有预取指令功能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。

所以,在理解它们的功能时,不考虑存在指令队列的情况。

6、标志寄存器一、运算结果标志位1、进位标志CF(Carry Flag)进位标志CF主要用来反映运算是否产生进位或借位。

如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。

使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。

2、奇偶标志PF(Parity Flag)奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。

如果“1”的个数为偶数,则PF的值为1,否则其值为0。

利用PF可进行奇偶校验检查,或产生奇偶校验位。

在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。

3、辅助进位标志AF(Auxiliary Carry Flag)在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:(1)、在字操作时,发生低字节向高字节进位或借位时;(2)、在字节操作时,发生低4位向高4位进位或借位时。

对以上6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。

4、零标志ZF(Zero Flag)零标志ZF用来反映运算结果是否为0。

如果运算结果为0,则其值为1,否则其值为0。

在判断运算结果是否为0时,可使用此标志位。

5、符号标志SF(Sign Flag)符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。

在微机系统中,有符号数采用码表示法,所以,SF也就反映运算结果的正负号。

运算结果为正数时,SF的值为0,否则其值为1。

6、溢出标志OF(Overflow Flag)溢出标志OF用于反映有符号数加减运算所得结果是否溢出。

如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。

“溢出”和“进位”是两个不同含义的概念,不要混淆。

如果不太清楚的话,请查阅《计算机组成原理》课程中的有关章节。

二、状态控制标志位状态控制标志位是用来控制CPU操作的,它们要通过专门的指令才能使之发生改变。

1、追踪标志TF(Trap Flag)当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。

这种方式主要用于程序的调试。

指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。

2、中断允许标志IF(Interrupt-enable Flag)中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。

但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。

具体规定如下:(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。

CPU的指令系统中也有专门的指令来改变标志位IF的值。

3、方向标志DF(Direction Flag)方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。

具体规定在第5.2.11节——字符串操作指令——中给出。

在微机的指令系统中,还提供了专门的指令来改变标志位DF的值。

三、32位标志寄存器增加的标志位1、I/O特权标志IOPL(I/O Privilege Level)I/O特权标志用两位二进制位来表示,也称为I/O特权级字段。

该字段指定了要求执行I/O指令的特权级。

如果当前的特权级别在数值上小于等于IOPL的值,那么,该I/O指令可执行,否则将发生一个保护异常。

2、嵌套任务标志NT(Nested Task)嵌套任务标志NT用来控制中断返回指令IRET的执行。

具体规定如下:(1)、当NT=0,用堆栈中保存的值恢复EFLAGS、CS和EIP,执行常规的中断返回操作;(2)、当NT=1,通过任务转换实现中断返回。

3、重启动标志RF(Restart Flag)重启动标志RF用来控制是否接受调试故障。

规定:RF=0时,表示“接受”调试故障,否则拒绝之。

在成功执行完一条指令后,处理机把RF置为0,当接受到一个非调试故障时,处理机就把它置为1。

4、虚拟8086方式标志VM(Virtual 8086 Mode)如果该标志的值为1,则表示处理机处于虚拟的8086方式下的工作状态,否则,处理机处于一般保护方式下的工作状态。

计算机寄存器常用指令一、常用指令1. 通用数据传送指令.MOV 传送字或字节.MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字压入堆栈.POP 把字弹出堆栈.PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSWAP 交换32位寄存器里字节的顺序XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )XADD 先交换再累加.( 结果在第一个操作数里)XLAT 字节查表转换.BX 指向一张256 字节的表的起点, AL 为表的索引值(0-255,即0-FFH); 返回AL 为查表结果. ( [BX+AL]->AL )2. 输入输出端口传送指令.IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器)输入输出端口由立即方式指定时, 其范围是0-255; 由寄存器DX 指定时,其范围是0-65535.3. 目的地址传送指令.LEA 装入有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS 传送目标指针,把指针内容装入DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送目标指针,把指针内容装入ES.例: LES DI,string ;把段地址:偏移地址存到ESDI.LFS 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FSD.LGS 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GSDI.LSS 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SSDI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装入AH.SAHF 标志寄存器传送,把AH内容装入标志寄存器.PUSHF 标志入栈.POPF 标志出栈.PUSHD 32位标志入栈.POPD 32位标志出栈.二、算术运算指令ADD 加法.ADC 带进位加法.INC 加1.AAA 加法的ASCII码调整.DAA 加法的十进制调整.SUB 减法.SBB 带借位减法.DEC 减1.NEC 求反(以0 减之).CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.DAS 减法的十进制调整.MUL 无符号乘法.IMUL 整数乘法.以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),AAM 乘法的ASCII码调整.DIV 无符号除法.IDIV 整数除法.以上两条,结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW 字节转换为字. (把AL中字节的符号扩展到AH中去) CWD 字转换为双字. (把AX中的字的符号扩展到DX中去) CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去) CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)三、逻辑运算指令AND 与运算.OR 或运算.XOR 异或运算.NOT 取反.TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).SHL 逻辑左移.SAL 算术左移.(=SHL)SHR 逻辑右移.SAR 算术右移.(=SHR)ROL 循环左移.ROR 循环右移.RCL 通过进位的循环左移.RCR 通过进位的循环右移.以上八种移位指令,其移位次数可达255次.移位一次时, 可直接用操作码. 如SHL AX,1.移位>1次时, 则由寄存器CL给出移位次数.如MOV CL,04SHL AX,CL四、串指令DS:SI 源串段寄存器:源串变址.ES I 目标串段寄存器:目标串变址.CX 重复次数计数器.AL/AX 扫描值.D标志0表示重复操作中SI和DI应自动增量; 1表示应自动减量. Z标志用来控制扫描或比较操作的结束.MOVS 串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. ) CMPS 串比较.( CMPSB 比较字符. CMPSW 比较字. )SCAS 串扫描.把AL或AX的内容与目标串作比较,比较结果反映在标志位. LODS 装入串.把源串中的元素(字或字节)逐一装入AL或AX中.( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )STOS 保存串.是LODS的逆过程.REP 当CX/ECX0时重复.REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX0时重复.REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX0时重复.REPC 当CF=1且CX/ECX0时重复.REPNC 当CF=0且CX/ECX0时重复.五、程序转移指令1.简单的条件转移指令JZ(或jE) OPR---------------结果为零转移, 测试条件ZF=1JNZ(或jNE) OPR --------------结果不为零转移,测试条件ZF=0JS OPR----------------------结果为负转移, 测试条件SF=1JNS OPR---------------------结果为正转移, 测试条件SF=0JO OPR--------------------- 溢出转移, 测试条件OF=JNO OPR --------------------不溢出转移, 测试条件SF=0JP OPR ---------------------结果为偶转移, 测试条件SF=1JNP OPR --------------------结果为奇转移, 测试条件SF=0JC OPR -------------------- 有进位转移, 测试条件SF=1JNC OPR --------------------无进位转移, 测试条件SF=02.无符号比较条件转移指令(以下指令经常是CMP OPD,OPS后面的指令根据比较结果来实现转移)JB(或JNAE) opd --------------小于或者不大于等于则转移JNB(或JAE) opd---------------不小于或者大于等于则转移JA(或NJBE) OPD---------------大于或者不小于等于则转移JNA(或JBE) OPD---------------不大于或者小于等于则转移3.带符号比较条件转移指令JL(或JNGE) --------------小于或者不大于等于则转移JNL(或JGE)--------------不小于或者大于等于则转移JG(或NJLE)---------------大于或者不小于等于则转移JNG(或JLE)---------------不大于或者小于等于则转移六、调用子程序与返回指令CALL 子程序调用指令RET 子程序返回指令六、其它指令OFFSET -------------------- 返回偏移地址SEG -------------------- 返回段地址EQU(=) -------------------- 等值语句PURGE -------------------- 解除语句DUP -------------------- 操作数字段用复制操作符SEGMENT,ENDS -------------------- 段定义指令ASSUME -------------------- 段地址分配指令ORG -------------------- 起始偏移地址设置指令$ --------------------地址计数器的当前值PROC,ENDP -------------------- 过程定义语句NAME,TITLE,END -------------------- 程序开始结束语句MACRO,OllyICE反汇编教程及汇编命令详解内容目录计算机寄存器分类简介计算机寄存器常用指令一、常用指令二、算术运算指令三、逻辑运算指令四、串指令五、程序跳转指令------------------------------------------计算机寄存器分类简介:32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。

相关文档
最新文档