汇编执行XOR rbx指令报operand type mismatch错误咨询
x86-64汇编
xor rbx触发操作数类型不匹配报错排查 错误原因
- 报错完全来自第三行
xor rbx, 0x2222222222222222指令,前两行代码无语法问题:xor esi, esi是标准的32位寄存器清零操作,movabs rbx, 0x4a510d0d4c4b400d是合法的64位立即数加载操作。 - 核心触发逻辑是x86-64指令集的硬件编码限制:仅
mov类指令(对应movabs助记符)支持直接编码64位宽度的立即数,xor/add/and这类ALU运算指令,当操作目标是64位通用寄存器时,仅支持接收32位有符号立即数作为源操作数,硬件会自动将该32位立即数符号扩展到64位再参与运算,没有提供直接对接64位立即数的指令编码。 - 你传入的异或密钥
0x2222222222222222是64位宽度,超出32位有符号立即数的表示范围,汇编器无法生成对应合法机器码,因此抛出操作数类型不匹配错误。
解决方法
- 优先推荐方案:先把64位异或密钥加载到空闲通用寄存器,再执行寄存器间的异或操作,性能最优且无逻辑风险,修改后代码如下:
xor esi, esi movabs rbx, 0x4a510d0d4c4b400d movabs rcx, 0x2222222222222222 xor rbx, rcx
- 寄存器紧张场景替代方案:拆分运算分别处理rbx的高32位、低32位,注意x86-64下写入32位寄存器会自动将对应64位寄存器高32位清零的特性,按顺序运算避免结果错误,写法如下:
xor esi, esi movabs rbx, 0x4a510d0d4c4b400d mov rax, rbx shr rax, 32 xor eax, 0x22222222 shl rax, 32 xor ebx, 0x22222222 or rbx, rax
注意:如果异或用的64位常量可以通过32位有符号数符号扩展得到,可以直接在xor指令后写32位立即数,汇编器会自动完成符号扩展,不需要额外处理,但你当前用的密钥
0x2222222222222222不符合这个条件,不能直接简写。
内容的提问来源于stack exchange,提问作者Hysii
相关产品推荐
相关产品推荐

