YASM汇编中对内存执行逻辑右移出现异常清零该如何处理?
问题成因
- 操作数宽度匹配错误:
shr byte [number], 8指令通过byte关键字指定了操作数为8位宽度,该指令仅会修改number地址指向的单个字节,不会操作相邻地址的其他高位字节,完全无法实现多字节数值的整体移位。你将数据存入寄存器运算时,是对完整宽度的寄存器(如32位通用寄存器)执行移位,会自动处理所有位的移动,因此可以得到预期结果。 - 移位计数规则不符合预期:x86架构的移位指令对输入的移位计数有隐式掩码逻辑,实际有效移位值为
输入计数 % 操作数位数。对于8位操作数来说,移位计数仅取低3位,你传入的8会被处理为0,理论上不会修改目标字节。你观测到目标字节变为0、最终结果为0x333200,本质是单字节操作无法移动高位字节内容,仅修改了最低位字节导致的。
无寄存器修复方案
x86架构不支持直接的内存到内存数据移动,我们可以通过栈操作完成字节搬移,全程不借助通用寄存器即可实现3字节数值的逻辑右移8位,代码如下:
segment .bss number resb 100 section .text ; 搬移number+1、number+2两个字节到number、number+1的位置 push word [number+1] pop word [number] ; 最高位有效字节清0,完成右移补0逻辑 mov byte [number+2], 0
执行后number地址处的3字节内容就会从0x31 0x32 0x33(对应数值0x333231)变为0x32 0x33 0x00(对应数值0x003332),符合你的预期。
内容的提问来源于stack exchange,提问作者NullPointer7
相关产品推荐
相关产品推荐

