欢迎来到 54818模板网!这是一个yzmcms的模板分享站。

汇编指令cmp怎么理解?怎么用?

相关案例演示

        最近在玩镇邪这款游戏,自己尝试着修改了一下游戏数据。突然我想自己是不是能用编程做一个外挂辅助出来玩玩,于是我学习CE,看看能不能用python整出来。


        刚上手很多东西都不知道怎么弄。玩CE少不了用到反汇编,很多东西是莫名其妙啊。弄了很久,但编程思想是相通的。学起来也会简单很多。我现在就是想过关CE自带的教程,第九关刚接触比较难。前八关的知识在第九关时作用不大。第九关应该算是玩汇编刚起步吧。网上看了很多教程,和我的想法不同,我又想先自己研究一下。尝试了很多想法及尝试,最终还是过不了关,只能按网上的教程来了。教程中的思想很容易理解,汇编语法和PHP不一样,需要多研究研究,就比如这个CMP指令。网上搜索一阵子相关的教程后,发现他们语言太死板,说的我云里雾里的。


        下面是教程中是通关需要注入的代码:

cmp [rbx+14],1    //比较两个数的大小
jne originalcode    //当零标志位为0时执行
jmp exit    //直接执行exit

        相对PHP来说汇编语法格式太简单了,CMP是比较两个数的大小。这个CMP指令和PHP运算符有相似之处也有不同处。就我个人的理解,下面我来说说它们的区别。

CMP指令语法:

cmp a,b

        和PHP一样,只是单纯的比较大小,并不会改变 变量a和b的 值。CMP差不多但又有不一样,它会用计算的结果去修改什么位,我也不知道这算是什么位,还没学到这些,也可能是看不懂。反正CMP比较的结果不会直接告诉你,出了结果它会去修改位,然后我们通过这些位来判断结果是怎样的。


        PHP中比较大小,我们是先给出条件,像这样 if(a>b)、if(a=b)、if(a<b),结果是 true 或 false。先条件后结果。汇编CMP不一样,它无法先给出条件去作比较,它是直接先计算,然后用计算出的结果修改位。 流程是 先计算,后写入位。我们通过获取位的值来判断a和b是大于、小于还是等于。


        9个位的排列如下图:

标志寄存器
15
14131211109876543210




OFDFIFTFSFZF
AF
PF
CF








运算结果标志位

状态控制标志位


        标志位:CMP指令按照计算结果会修改橙色的 溢出标志、符号标志、零标志、辅助进位标志、奇偶标志、进位标志。


        CMP比较又分两种情况:

        第1种:比较两个无符号数,则零标志位和进位标志位 它们两关系如下表所示:


CMP 无符号数
汇编比较  CMP A,B 
零标志位(ZF)
进位标志位(CF)
A>B
00
A<B01
A=B10


        第2种:比较的是两个有符号数,则符号标志位、零标志位和溢出标志位 它们的关系如下表所示:


CMP 有符号数
汇编比较  CMP A,B 
运算关系
A>B
符号标志(SF) = 溢出标志(OF)
A<B符号标志(SF) ≠ 溢出标志(OF)
A=B零标志位(ZF) = 1


        从上面两张表格中可以发现,不管是哪种情况,我们只需要看零标志位是1还是0,就可以做简单的对比判断了。


        再回到文章开头,需要注入的代码:

cmp [rbx+14],1    //比较两个数的大小
jne originalcode    //当零标志位为0时执行
jmp exit    //直接执行exit

        JNE指令解释:如果 零标志位(ZF)=0,则跳转,反之,不跳转,直接执行下一条代码

        一下就明白了。

    上一篇:四字节汉字不能写入mysql数据库

    下一篇:已经是最后一篇

    作者:54818模板网 关注:676 时间:2023-01-20 15:39:26
    相关网站教程