在x86机器上减去`x`和添加`-x`有什么区别?

san*_*oyd 7 compiler-construction x86 assembly

是否存在语义差异?在特定情况下,其中一个可能更快吗?

Ale*_*nze 13

如果你已经-x预先计算,然后sub smth, xadd smth, -x将要同样快速执行.

从语义上讲,标志状态会有所不同.

考虑进行8位加法和减法:

0x01 - 0x01 = 0x00, CF = 0
0x01 + 0xFF = 0x00, CF = 1
Run Code Online (Sandbox Code Playgroud)

  • 实际上,它们在硬件上都是相同的(通过逻辑ADD单元实现)。如果您将SUBTRACT发送到处理器,则会在处理器到达之前对其进行二进制补全,但是由于硬件都是并行的,因此不会对性能造成任何影响,因此它们彼此之间的速度一样快:) (2认同)
  • 凉。只是从您的帖子中还不很清楚。 (2认同)

har*_*old 5

除了标志不同之外,如果x是常量,选择一个或另一个可能导致更短的编码(很少).

加法和减法都有一个op r/m32, imm8表格,其中立即数操作数是一个字节,但该字节是符号扩展的.因此add edx, 128必须使用dword立即编码,但sub edx, -128可以使用符号扩展字节进行编码(节省3个字节).