在我们系统的编程类(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
/OR
或 XOR
而不是替代(易于理解/阅读)方法时是否有某种更好的性能?由于这些程序通常在理论课时向我们展示,因此大多数类(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 将
OF
和CF
设置为零,而sub
根据结果设置它们 AND
ing 可以更安全,但我个人认为这种用法取决于上下文。关于assembly - 以下汇编命令有什么好处吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18192750/