执行shr eax,8指令后,如何保留被移出的e0值以供后续使用?
保存SHR指令移出字节的可行方案
原代码执行后,eax的低8位0xe0会被丢弃,要保留这个值,必须在移位操作前将其暂存,以下是几种实用方法:
方法1:用通用寄存器暂存
如果有空闲寄存器(比如bl),直接将低8位复制过去:
mov eax, 0x4012e0 ; eax = 0x4012e0 mov bl, al ; bl = 0xe0(保存低8位) shr eax, 8 ; eax = 0x4012
后续可直接使用bl中的0xe0。
方法2:用零扩展保存到32位寄存器
如果需要将低8位作为32位值使用,用movzx指令零扩展存储:
mov eax, 0x4012e0 ; eax = 0x4012e0 movzx ecx, al ; ecx = 0x000000e0(完整保存低8位) shr eax, 8 ; eax = 0x4012
方法3:用栈暂存(寄存器不足时)
如果通用寄存器都在占用,可将低16位压入栈,移位后再取出低8位:
mov eax, 0x4012e0 ; eax = 0x4012e0 push ax ; 将ax(0x12e0)压入栈 shr eax, 8 ; eax = 0x4012 pop bx ; bx = 0x12e0,此时bl = 0xe0
注意:SHR指令右移8位时,低8位会直接丢失,无法通过CPU标志位恢复整个字节,因此必须在移位前完成保存操作。
内容的提问来源于stack exchange,提问作者edw
相关产品推荐
相关产品推荐

