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

X86-64下使用asmjit通过内存地址设置XMM寄存器出现段错误原因求解

问题原因

  • 寻址规则平台差异:x86 32位模式支持直接将32位立即数作为绝对内存地址使用,你传入的f指针转成32位uintptr_t后刚好符合寻址要求,因此32位环境运行正常。但x86_64模式不支持直接传入64位立即数作为绝对内存地址,直接把指针值传给X86Mem构造函数时,数值会被截断为32位符号扩展的地址偏移量,最终访问的是非法内存地址,触发段错误。
  • 指令选择不匹配:你要加载的是4字节长度的float类型数据,但使用的movq指令会单次访问8字节内存,即使寻址逻辑正确,也有可能因为访问了f指针后续4字节的不可访问内存触发异常,正确加载单精度浮点数应该使用movss指令。

修复方案

修改逻辑为先将指针地址加载到通用寄存器,再通过寄存器间接寻址读取内存中的float值写入XMM寄存器,该写法同时兼容32位和64位环境,示例代码如下:

using namespace asmjit;
using namespace x86;

void setXmmVarViaAddressLocation(X86Compiler& cc, X86Xmm& v, const float* f)
{
    // 申请匹配当前架构位数的通用寄存器存储指针
    X86Gp addrReg = cc.newIntPtr();
    // 将指针地址写入通用寄存器
    cc.mov(addrReg, reinterpret_cast<std::uintptr_t>(f));
    // 寄存器间接寻址读取4字节float写入XMM寄存器
    cc.movss(v, X86Mem(addrReg));
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:54:07