x86/x64汇编基础14.汇编基础10:逻辑比较指令

笔记

学习最新前沿软件逆向安全技术、游戏安全辅助脚本技术,B 站 小迪 xiaodi 老师

微信 i-xiaodi

逻辑比较指令

用于对比操作数或设置标志。

操作符

功能

示例

cmp

比较两个操作数

cmp eax, ebx

test

测试(与操作,不存结果,仅设置标志)

test eax, eax

CMPTEST 都是常见的汇编指令,尤其在 Windows 逆向工程中经常用来进行条件判断和标志位操作。它们的主要区别在于如何影响标志寄存器以及如何使用它们来控制程序的流程。

1. CMP(Compare)

CMP 是“比较”的缩写。它会对两个操作数进行减法运算,但不会存储结果,而是只更新标志寄存器(如零标志 ZF,进位标志 CF,符号标志 SF 等)。其语法为:

CMP operand1, operand2

CMP 的作用是将 operand1operand2 相减,并根据结果设置标志位。最常见的应用是与条件跳转指令(如 JEJNEJGJL 等)配合使用,以决定程序的执行流。

常见用途:

  • 比较两个值是否相等:CMP eax, ebx,如果 eax == ebx,则 ZF 被置为 1,zero 可以通过 JEJZ 做相应跳转。
  • 比较大小:CMP eax, ebx,如果 eax > ebx,则可以通过 JG 跳转。

示例:

CMP eax, ebx
JE equal_label     ; 如果 eax == ebx,则跳转到 equal_label
JG greater_label   ; 如果 eax > ebx,则跳转到 greater_label

2. TEST

TEST 用于执行“按位与”操作,它会将两个操作数按位与,并只更新标志寄存器不存储结果TEST 可以用来检查某些位是否被设置(即是否为 1)。

语法为:

TEST operand1, operand2

TEST 的作用是对两个操作数进行按位与(AND)运算,并根据结果更新标志寄存器。特别是它主要用于检查某些位是否为 1

常见用途:

  • 检查特定的标志位:如果需要检查某个标志位是否为 1,可以用 TEST 来实现。
  • 检查寄存器中某些特定位是否被置为 1,例如 TEST eax, 0x01 可以用来检查 eax 的最低位是否为 1。

示例:

TEST eax, eax        ; 检查 eax 是否为 0
JZ zero_label        ; 如果 eax 为 0,则跳转到 zero_label

TEST eax, 0x01       ; 检查 eax 的最低位是否为 1
JZ lowest_bit_zero   ; 如果最低位为 0,则跳转到 lowest_bit_zero

区别总结:

  • CMP:通过计算两个操作数的差值来影响标志位,通常用于比较操作数之间的关系(例如,等于、大于、小于等)。CMP 会影响多个标志位,如 ZFSFOF 等。
  • TEST:执行按位与操作,检查某些位是否被设置为 1。TEST 通常用于检查特定的位标志。

在逆向工程中的应用:

  • 判断程序流程: 反汇编程序时,CMPTEST 经常被用来判断某些值,控制程序的流程。例如,CMP 常用于检查返回值是否为零,以决定是否跳过某些代码。TEST 则更多地用于检查特定标志位,如检查某个位是否被设置。
请登录后发表评论

    没有回复内容