我看过流水线
OR EAX, 0xFFFFFFFF
并且在寄存器EAX
中程序已经存储了一个字符串。我在理解如何与字符串和类似的值进行比较时遇到问题。执行该指令后,EAX
值为0xFFFFFFFF
。
有人能告诉我那个操作有什么目的吗?它是汇编代码中经常出现的一行吗?(例如,XOR EAX, EAX
这是一种有效的制作方式EAX = 0
吗?是这样的吗?)
我看过流水线
OR EAX, 0xFFFFFFFF
并且在寄存器EAX
中程序已经存储了一个字符串。我在理解如何与字符串和类似的值进行比较时遇到问题。执行该指令后,EAX
值为0xFFFFFFFF
。
有人能告诉我那个操作有什么目的吗?它是汇编代码中经常出现的一行吗?(例如,XOR EAX, EAX
这是一种有效的制作方式EAX = 0
吗?是这样的吗?)
我认为为了理解编译器为什么会这样做,请研究以下反汇编:
B8 FF FF FF FF mov eax, 0FFFFFFFFh
83 C8 FF or eax, 0FFFFFFFFh
编译器试图完成的可能是eax
使用尽可能少的字节将寄存器设置为 -1,以便缓存友好。只要您不介意弄乱标志,它OR
的吞吐量也大约是MOV
指令的两倍。
这可能是一个被初始化为 -1 的变量。
抱歉,我无法将其作为评论发布,但一些快速(且非详尽)的测试显示以下内容:
or
而不是mov
( /Os
)or
而不是mov
任何优化设置(包括禁用)mov
任何优化设置特别是 gcc 的行为支持 Peter Andersson 的回答。
这将始终导致将EAX
寄存器设置为等于 0xFFFFFFFF,并且还会产生适当设置标志的副作用(即 N=1、Z=0 等)。这不是一个常见的习语。