汇编笔记四【标志寄存器】 by:凉游浅笔深画眉 / Net7Cracker

2024-03-08 15:50

本文主要是介绍汇编笔记四【标志寄存器】 by:凉游浅笔深画眉 / Net7Cracker,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

一、PUSH xxxxx指令和ESP的关系

  ESP的值,是由PUSH 指令后面的操作数的宽度决定的。也就是xxxxx的宽度,假如PUSH 后面跟的是一个立即数,由于整数是四字节,所以esp-4。

  假如PUSH 后面跟的是容器,那么就看这个容器的宽度。

  例:假如目前ESP的值是FFFFFFFF

    当PUSH 1 这条指令执行后,ESP=FFFFFFFB,因为1是个立即数,只要PUSH后面是立即数,那么ESP的值就会减4

  例:假如目前ESP的值是FFFFFFFF

    当PUSH ax 这条指令执行后,ESP=FFFFFFFD,因为AX是个寄存器,该寄存器一共是16位,也就是2个字节,所以ESP的值就会减2

  例:假如目前ESP的值是FFFFFFFF

    当PUSH eax 这条指令执行后,ESP=FFFFFFFB,因为EAX是个寄存器,该寄存器一共是32位,也就是4个字节,所以ESP的值就会减4

  例:假如目前ESP的值是FFFFFFFF

    当PUSH DWORD PTR DS:[XXXXXX] 这条指令执行后,ESP=FFFFFFFB,因为DWORD宽度为4个字节,所以ESP的值就会减4

  例:假如目前ESP的值是FFFFFFFF

    当PUSH WORD PTR DS:[XXXXXX] 这条指令执行后,ESP=FFFFFFFD,因为DWORD宽度为2个字节,所以ESP的值就会减2

 

二、PUSHAD,POPAD指令

  PUSHAD指令压入32位寄存器,其入栈顺序是:EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI .

      也就是将8个通用寄存器EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI 全部压入堆栈,作用是保护堆栈。

  当你执行完毕PUSHAD指令后,可以对寄存器进行任意操作,操作完毕后,只需要再执行POPAD指令,即可还原刚才压入的8个通用寄存器的值。

 

三、标志寄存器(EFLAGS)

  

  标志寄存器在OD中体现形式就是下图的EFL,EFL的值其实就是CF,PF,AF,ZF,SF,TF,IF,DF,OF这几个标志综合表现形式。

  

  具体是怎么拆分的呢:

  例如图中的EFL的值是213,那么换算成2进制的话就是

  2:0010

  1:0001

  3:0011

  合起来就应该是001000010011

    

  

  

  a、【CF】最高位进位标志(Carry flag):如果运算结果最高位产生了一个进位或者借位,那么其值为1,否则为0

    例:

      MOV AX,0xFFFF

      ADD AX,1

      最高位为F,如果再加1就会进位,所以这两句指令执行完毕后CF标志应该是1

      执行前:

      

      

 

      执行后:

      

      这里有个现象就是,EAX为什么不是00010000,因为我们操作的是AX,就算AX存储超过最大限制,也不会越位去改变其他寄存器的值。

  b、【PF】奇偶标志(Parity Flag):奇偶标志PF,用于反映运算结果中“1”的个数的奇偶性,如果“1”的个数为偶数,那么PF为1,否则为0

    例1:

      MOV AL,3

        ADD AL,1

      其结果AL应该等于4=0100,0100中1的个数为奇数,所以PF标志应该为0.

      执行前:

      

 

      执行后:

      

 

    例2:

      MOV AL,3

      ADD AL,2

      其结果为5=0101,0101中“1”的个数为偶数,所以P标志为应该为1

      执行前:

      

 

      执行后:

      

 

  c、【AF】辅助进位标志(Auxiliary Carry Flag)

    在发生下列情况时,辅助进位AF的标志会被置为1,否则其值为0.

    (1)、在字操作时,发生低字节向高字节进位或借位时

    (2)、在字节操作时,发生低4位向高四位进位或借位时

    例1:字操作,也就是16位,双字节操作

    MOV AX,0xEEFF

    ADD AX,1

    因为倒数第二个F有进位,所以A标志为1

    执行前

    

    执行后:

    

 

    例2:

      MOV EAX,0xEEEEFFFF

        ADD EAX,1

      因为倒数第四个F发生了进位,所以标志A的值为1

      执行前:

      

      执行后:

      

 

  d、【ZF】零标志(Zero Flag):零标志ZF用来反映运算结果是否为0,如果运算结果为0,其值为1。在判断运算结果为0时,可借用此标志位。

    例:

      XOR EAX,EAX

      因为XOR指令的特性,当与自身异或操作时,其值肯定为0,所以这句语句可以理解为EAX清零,但是他和MOV EAX,0 有区别,就是在ZF标志位。

      MOV EAX,0并不会影响ZF标志位,但XOR EAX,EAX就会将ZF置为1

    执行前

    

 

    执行后:

    

 

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

  例1:

    MOV AL,0x7F

    ADD AL,1

    因为结果为80,最高位为8,二进制形式为1000,所以SF应该为1

    执行前:

    

 

    执行后:

    

 

  例2:

    MOV AL,7E

      ADD AL,1

    因为结果为7F,最高位为7,二进制形式为0111,所以SF应该为0

    执行前:

    

 

    执行后:

    

 

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

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

    OF与CF的区别(溢出与最高位进位的区别):

    CF表示无符号数运算结果是否超过范围。

    OF表示有符号数运算是否超过范围。

    溢出主要针对有符号数之间运算的结果,在有符号数运算中有如下规律:

      正数+正数 如果结果是负数,则说明溢出

      负数+负数 如果结果是正数,则说明溢出

      正数+负数永远不可能溢出

      例如7E+7E=FC,FC已经在负数区间了,证明溢出

        执行前:

        

        执行后:

        

      例如 FE+FE=1FC    结果已经超过负数区间了,证明溢出

        执行前:

        

        执行后:

        

     

 

        

    总结:逆向时,该关注CF还是OF,取决逆向者对两个操作数希望执行的是有符号运算还是无符号运算。

       如果是有符号,则关注OF,无符号则关注CF。

 

  

  g、【DF】方向标志:其值决定了下文中第六点,第七点这样的指令结束后,edi,esi的增长方向。

    如果DF=0,指令执行完毕后ESI和EDI都增加对应的宽度

    如果DF=1,指令执行完毕后ESI和EDI都减少对应的宽度

  

 四、ADC指令:带进位加法,和ADD类似,但是相加的时候会把CF标志位的值也加进去

  格式:ADC R/M,R/M/IMM 两边不能同时为内存,宽带要一致

  例如:

     ADC AL,CL

     ADC BYTE PTR DS:[0x12ffff],2

     ADC BYTE PTD DS:[0X12FFC4],AL

五、SBB指令:带借位减法,和SUB类似,但是相减的时候会再减去一个CF标志位的值

  格式:SBB R/M R/M/IMM 两边不能同为内存,宽度要一致 

  例如:     

     ADC AL,CL

     ADC BYTE PTR DS:[0x12ffff],2

     ADC BYTE PTD DS:[0X12FFC4],AL

 

六、XCHG指令:交换数据,

  格式:XCHG R/M 两边不能同为内存,也不能同位立即数,宽度要一致

  例如:

    XCHG AL,CL

    XCHG DOWRD PTR DS:[0x12FFC4],EAX

    XCHG BYTE PTR DS:[0x12FFC4],AL

 

七、MOVS指令:移动数据 内存-内存

    把ESI的地址指向的值移动到EDI地址指向的值,执行完毕后ESI EDI会进行自加或自减,具体是自加还是自减,受DF标志位影响

    BYTE/WORD/DWORD

    MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]                       简写为MOVSB

    MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI]                   简写为MOVSW

    MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]               简写为MOVSD

    通常MOVS指令可以用于字符串复制。

 

八、STOS指令:将AL/AX/EAX的值存放到[EDI]指定的内存单元,具体是使用哪个寄存器,看STOS指令后面的宽度

   执行完毕后ESI EDI会进行自加或自减,具体是自加还是自减,受DF标志位影响

   例:

    STOS BYTE PTR ES:[EDI]             简写为STOSB

    STOS WORD PTR ES:[EDI]           简写为STOSW

    STOS DWORD PTR ES:[EDI]         简写为STOSD

 

 

九、REP指令,按计数寄存器中(ECX)中指定的次数重复执行字符串指令

  MOV ECX,10

  REP MOVSD

  

  

转载于:https://www.cnblogs.com/fuhua/p/5936394.html

这篇关于汇编笔记四【标志寄存器】 by:凉游浅笔深画眉 / Net7Cracker的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/787599

相关文章

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个