我看过流水线
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 等)。这不是一个常见的习语。