两个 x86 IA32 ISA 指令之间的区别?

Posted

技术标签:

【中文标题】两个 x86 IA32 ISA 指令之间的区别?【英文标题】:difference between two x86 IA32 ISA instructions? 【发布时间】:2014-11-02 08:56:24 【问题描述】:

我注意到在 x86 IA32 ISA 中将寄存器设置为 0 的符号通常表示为:

xorl %eax, %eax

我想知道这个符号和

之间是否有区别
movl $0, %eax

因为两者似乎本质上都在做同样的事情。这只是效率问题吗?

【问题讨论】:

Is this just a matter of efficiency? 是的。通常,xor 操作码更短,在大多数情况下更快。要获得准确答案,请参阅特定平台的程序集参考。 大部分情况下,但xor 会影响标志。所以如果你必须保留标志(这种情况很少发生),你就不能使用它。 【参考方案1】:

是的,这只是效率问题。英特尔建议使用 xorl 而不是 movl,因为它的处理器认识到将寄存器与自身异或的结果始终为 0 - 它不依赖于寄存器中最初的内容(See section 3.5.1.8)。这使得清除寄存器成为相对于其他指令的独立操作,并且可以提高指令级并行度和性能。英特尔不承诺 Movl 具有此属性。

【讨论】:

movl 也不依赖于之前的值 没错,但你的 Intel x86 处理器不知道。 当然可以。当它注册重命名业务时,它看不到输入寄存器,因此没有依赖关系。当然,除非它是 8 位或 16 位 mov,但这是 movl。但是,xor 仍然更快,因为它甚至不执行。 严格来说,英特尔并没有具体说明 movl 指令会发生什么。我已经修改了我的原始帖子以反映这一点。 “将 0 移入寄存器”虽然也在 3.5.1.8 中监听

以上是关于两个 x86 IA32 ISA 指令之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

cmp 不工作 - Intel x86 (IA32) 程序集

X86和X86_64和X64有什么区别?

20145239 《信息安全系统设计基础》第5周学习总结

IA32与x86

IA32 IA64 X64 的区别

IA64与x64的区别