【问题标题】:xor ax, ax when loading segment register [duplicate]xor ax,加载段寄存器时的 ax [重复]
【发布时间】:2014-12-26 01:29:15
【问题描述】:

我正在尝试编写一个引导加载程序,而我正在编写的所有代码都在实模式下运行。在我发现的所有示例中,要么有xor ax, ax 要么有xor eax, eax,我不明白这是在做什么。它似乎与设置段寄存器有关,但我不清楚是什么。

【问题讨论】:

标签: assembly operating-system bootloader x86


【解决方案1】:

异或指令是异或

查看异或真值表XOR

xor eax, eax ; Set eax to 0
mov eax, 0   ; Set eax to 0

我不是 100% 确定,但我认为使用 XOR 是因为某些历史原因。

【讨论】:

  • 我不是个聪明人
  • 好吧,如果它很容易看到,它并不总是很容易看到;)
  • 对寄存器进行异或运算以将其设置为零是 8 位处理器上相当常见的优化,因为它通常是单字节指令。它通常比立即加载占用两个字节的 0 占用更少的空间和执行得更快。
  • @MartinJames:这仍然是在 x86/x86-64 上将寄存器归零的最短、最快的方法。它不需要立即(->短),并且在新处理器上是特殊情况,在破坏依赖链的同时使用很少的执行资源。很有用。
  • @EOF TIL 的东西。奥瑞特 :)
【解决方案2】:

xor ax, ax 将与mov ax, 0 执行相同的操作,但具有将标志设置为零并根据异或逻辑清除进位的附加功能。在某些旧架构中,xor 消耗的时钟比mov 少。

mov eax,eax 将占用字节码中的 5 个字节,而xor eax,eax 将占用 2 个字节。

【讨论】:

  • 对于为什么xor-zeroing 更好,已经有一个规范的答案:stackoverflow.com/questions/33666617/…xor 在现代 Intel CPU 上仍然更快,即使除了代码大小。这不仅仅是一个历史/旧建筑的东西。 (在 AMD CPU 上,这只是代码大小的优势,但并不慢,因此编译器会使用它。)
猜你喜欢
  • 2017-01-07
  • 1970-01-01
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
  • 2020-04-18
相关资源
最近更新 更多