OR EAX、EAX 是否可以作为 If 语句?

逆向工程 部件
2021-07-10 15:37:30

我有以下问题: 难道 OR EAX, EAX 代表一个 if 语句?

我问的原因是,我在汇编代码中阅读了以下内容:

....
OR EAX, EAX
JNZ funct.A
.....

在 OR EAX, EAX 行之前,调用函数 strcmp,其返回值 00000001 存储在 EAX 中。所以我发现:如果返回值大于零表示不匹配的第一个字符在 string1 中的值大于在 string2 中的值。

所以,我的第一个问题是:“如果返回值大于零表示不匹配的第一个字符在 string1 中的值大于 string2 中的值”是什么意思

第二个问题是:我可以将汇编代码翻译成伪 C 代码,如下所示:

if(EAX == 1){
   funct.A;
}

那样行吗?还是完全错误?如果是,那么您有什么建议?

3个回答

x86 条件分支和移动指令根据标志决定是否跳转/移动如果设置了适当的标志,他们将采取行动,因此可以使用影响标志的任何指令,而不仅仅是CMP. 例如,检查 rax 中的高位是否为零 SHR rax, 32; JZ RAX_IS_0可以用来保存CMP. 因此,较短的指令通常是首选

最常用的一种是TESTAND eax, eax也可以使用,因为它与TEST除了破坏目标完全相同(但在 source 和 dest 是这样的相同寄存器的情况下,这无关紧要)。但是有时OR也使用(最有可能由Delphi 编译器发出)因为OR reg, reg给出与AND reg, reg. 如果您检查反汇编,您会注意到它CMP长了一个字节:

83 F8 00  cmp  eax, 0
09 C0     or   eax, eax
21 C0     and  eax, eax
85 C0     test eax, eax

经过以上指令后,SF、ZF、PF、CF、OF(以及带有 的AH cmp)将被修改。如果未设置,JNZ将检查ZF并跳转,即 eax 非零

TEST应始终使用性能方面的,因为TEST可以与Jcc但不AND与和进行宏融合OR

我会把它翻译成伪代码

if (strcmp(…)) 
    goto funct.A;

OR 的要点是strcmp(),像所有返回整数标量的 C 函数一样,在 中返回其结果EAX为了进行条件跳转,您需要根据值设置条件标志,并且OR EAX, EAX具有设置条件标志(特别ZF是由后续跳转测试的)的好属性,而不修改 中的值EAX

不太确定为什么OR会使用而不是在TEST这里;就代码而言,该功能似乎是相同的。

在 x86 / x86-64 中 or 代表逻辑或。

在你的例子中

 OR EAX, EAX

执行逻辑按位或运算。如果 EAX 为零,则结果将全部为零,并且将设置零标志,这很可能是整点。

我可能会将您显示的代码呈现为

if(EAX != 0)
{
     func.A
}

如果不了解正在发生的事情的更广泛背景,就很难确切地看出这有什么意义。我猜想,如果字符串(或字符串的一部分)匹配,实际的字符串比较应该将 0 返回到 EAX 寄存器中。

事实上,这是一种正常的方法:https : //stackoverflow.com/questions/11663745/compare-arrays-of-characters-in-x86-assembly

上面的这篇文章涉及一种在 x86 中比较字符串的方法。使用 jne 和 cmp 指令而不是 jnz,但这个概念可能适用于您的情况。