如何不使用MOV指令实现寄存器之间的数据传输?
不使用MOV实现MOV EAX, EBX等价效果的方案
我们基于32位x86汇编环境讨论,要求最终效果和MOV EAX, EBX完全等价:EAX最终等于原EBX的值,EBX、所有标志位、其他寄存器状态均不发生改变。
最优方案:使用LEA指令
LEA(加载有效地址)指令原本用于内存地址计算,本质是直接返回操作数的地址值,且完全不修改任何标志位,也不需要操作额外的存储空间,是和MOV效果最接近的替代方案:
lea eax, [ebx]
该指令执行后,EAX直接等于EBX的原始值,其余所有硬件状态都没有变化,和MOV EAX, EBX效果100%一致。
备选方案:使用PUSH+POP栈中转组合
如果场景下无法使用LEA,可以通过栈做临时中转实现,执行后ESP会自动恢复到原始值,其余状态和MOV完全一致:
push ebx pop eax
执行逻辑:先将EBX的值压入栈顶,ESP自动减4;再将栈顶的值弹出到EAX,ESP自动加4回到初始值。最终EAX等于原EBX的值,不影响其他寄存器和标志位。
不推荐方案(会修改标志位,不符合完全等价要求)
如果不需要保留标志位,可以使用以下方案,但和原始MOV指令效果不完全一致:
- 清零后做或运算:
该方案会修改ZF、PF、SF标志位。xor eax, eax or eax, ebx - 清零后做加法:
该方案会修改所有算术相关标志位。sub eax, eax add eax, ebx
内容的提问来源于stack exchange,提问作者Yuri Aps
相关产品推荐
相关产品推荐

