在我们系统的编程类(class)中,我们正在学习汇编语言。在大多数示例程序中,我们的教授。曾在类里面展示过;他正在使用:

XOR CX, CX

代替
MOV CX, 0

或者
OR AX, AX
JNE SOME_LABEL

代替
CMP AX, 0
JNE SOME_LABEL

或者
AND AL, 0FH        ; To convert input ASCII value to numeral
; The value in AL has already been checked to lie b/w '0' and '9'

代替
SUB AL, '0'

我的问题如下,使用 AND/ORXOR 而不是替代(易于理解/阅读)方法时是否有某种更好的性能?

由于这些程序通常在理论课时向我们展示,因此大多数类(class)无法实际口头评估它们。为什么要花 40 分钟的讲座来解释这些琐碎的陈述?

最佳答案

XOR CX, CX  ;0x31 0xC9

仅使用两个字节:操作码 0x31 和 ModR/M 字节,用于存储源和目标寄存器(在这种情况下,这两个是相同的)。
MOV CX, 0  ;0xB8 0x08 0x00 0x00

需要更多字节:操作码 0xB8 ,用于目标的 ModR/M(在本例中为 CX)和两个字节立即数填充零。
从时钟角度来看没有区别(都只占用一个时钟),但是 mov 需要 4 个字节,而 xor 只使用两个字节。
OR AX, AX  ;0x0A 0xC0

再次仅使用操作码字节和 ModRM 字节,而
CMP AX, 0  ;0x3D 0x00 0x00 <-- but usually 0x3B ModRM 0x00 0x00

使用三个或四个字节。在这种情况下,它使用三个字节(操作码 0x3D ,字立即数表示零),因为 x86 对累加器寄存器的某些操作具有特殊的操作码,但通常它会使用四个字节(操作码、ModR/M、字立即数)。在谈论 CPU 时钟时也是如此。

执行时处理器没有区别
AND AL, 0x0F  ;0x24 0x0F  <-- again special opcode for Accumulator


SUB AL, '0'  ;0x2D 0x30 0x00  <-- again special opcode for Accumulator

(只有一个字节的差异),但是当你减去 ASCII 零时,你不能确定在累加器中不会有大于 9 的值。
另外anding 将OFCF 设置为零,而sub 根据结果设置它们 AND ing 可以更安全,但我个人认为这种用法取决于上下文。

关于assembly - 以下汇编命令有什么好处吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18192750/

10-09 04:58