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

x86_64汇编中SSE指令movapd写xmm寄存器值到内存无生效问题

问题原因

你的align 16对齐指令放错了位置,它当前属于.data段的配置,不会对后续的.bss段生效,导致result变量的对齐属性不符合movapd指令的要求,这是问题的核心根源。

movapd作为128位SSE对齐读写指令,严格要求内存操作数必须16字节对齐。虽然你从gdb打印的地址看起来末尾是0、符合对齐要求,但链接阶段因为.bss段没有显式声明对齐要求,可能存在隐性的地址属性问题,部分CPU或内存区域(比如共享库关联的bss段)会静默拒绝未对齐的SSE写操作,不会触发崩溃但也不会完成写入,刚好和你遇到的现象完全吻合。

而你拆分使用movsd写入时可以正常执行,是因为movsd单次只操作8字节内存,仅要求8字节对齐,对齐门槛更低,所以不受这个问题影响。

修复方案

  1. 调整对齐指令位置,将align 16放到.bss段内部、result定义的前面,确保变量符合16字节对齐要求:
section .data
    i dq 0.0, 1.0

section .bss
    align 16
    result resq 2

如果需要更稳妥,可以直接在段声明时指定对齐属性:section .bss align=16

  1. (可选)显式指定操作数长度,避免汇编器推断错误,明确告诉nasm这是128位写操作:
movapd oword [result], xmm0

其中oword表示128位(八字)长度,消除指令编码的歧义。

如果调整对齐后问题仍然存在,可以临时将result放到.data段定义测试,排除bss段特殊属性的影响:

section .data
    i dq 0.0, 1.0
    align 16
    result dq 0.0, 0.0

内容的提问来源于stack exchange,提问作者Modi57

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:15:02