You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 08:48:06