assembly - 用更少的指令对 64 位寄存器中的所有字节进行异或

标签 assembly bit-manipulation nasm x86-64 micro-optimization

假设在某些 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/

相关文章:

汇编 x86 逐字符读取字符串

assembly - 如何使用 X86 编码器解码器 (XED) 语法编译一组 ASM 指令

c++ - 对象在 assembly 级的x86中如何工作?

c++ - 将它们(函数)保存在内存中的同一位置

c - 十进制到二进制转换器无法计算大于 1023 的小数

c++ - 为什么bool显示正确的位顺序,而直接输出移位运算结果却不正确?

file - 在类似于文件系统的程序集中存储读/写数据

c - 奇数位的位奇偶校验码

macos - 在 mac os 上的 nasm 中编译汇编程序

linux - 停止缓冲区溢出 - NASM 输入