OR EAX,0xFFFFFFFF 的目的

逆向工程 部件
2021-06-20 02:48:12

我看过流水线

OR EAX, 0xFFFFFFFF

并且在寄存器EAX中程序已经存储了一个字符串。我在理解如何与字符串和类似的值进行比较时遇到问题。执行该指令后,EAX值为0xFFFFFFFF

有人能告诉我那个操作有什么目的吗?它是汇编代码中经常出现的一行吗?(例如,XOR EAX, EAX这是一种有效的制作方式EAX = 0吗?是这样的吗?)

3个回答

我认为为了理解编译器为什么会这样做,请研究以下反汇编:

B8 FF FF FF FF                          mov     eax, 0FFFFFFFFh
83 C8 FF                                or      eax, 0FFFFFFFFh

编译器试图完成的可能是eax使用尽可能少的字节寄存器设置为 -1,以便缓存友好。只要您不介意弄乱标志,它OR的吞吐量也大约是MOV指令的两倍

这可能是一个被初始化为 -1 的变量。

抱歉,我无法将其作为评论发布,但一些快速(且非详尽)的测试显示以下内容:

  • gcc (4.6.3)在优化大小时使用or而不是mov( /Os)
  • msvc (13) 使用or而不是mov任何优化设置(包括禁用)
  • clang (3.0) 使用mov任何优化设置

特别是 gcc 的行为支持 Peter Andersson 的回答。

这将始终导致将EAX寄存器设置为等于 0xFFFFFFFF,并且还会产生适当设置标志的副作用(即 N=1、Z=0 等)。这不是一个常见的习语。