假设在某些 x86-64 平台上,我们在某个 64 位寄存器中存储了一些 64 位值(让它为RAX)。挑战是在更少的指令调用中对初始值的所有字节进行异或(结果存储在哪里并不重要)。这是我的 8 条指令解决方案(在 NASM 中):
mov rbx, rax
bswap rbx
xor eax, ebx
mov ebx, eax
bswap ebx
xor ax, bx
mov bx, ax
xor al, bh
我在ASM编程方面不是很有经验,所以也许你们在指令量方面有更好的解决方案。 谢谢!
最佳答案
这个怎么样?
movq xmm0,rax
pclmullqlqdq xmm0,[mask]
pextrb eax,xmm0,7
mask dq 0101010101010101h, 0
这使用无进位乘法 pclmullqlqdq
在一条指令中完成所有异或操作。最后一条指令提取累加结果并将其存储到al
中。
关于assembly - 用更少的指令对 64 位寄存器中的所有字节进行异或,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49212042/