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

汇编中mov (%eax), %rdi触发段错误的原因及解决方法

段错误原因与修正方案

错误原因

  • 你使用的是x86-64架构汇编,该架构下内存地址为64位长度,但你使用32位寄存器%eax存储地址,CPU寻址时会自动将%eax的值零扩展为64位地址,这个扩展后的地址大概率属于进程未分配、或无读权限的内存区域,触发段错误。
  • 即使%eax存储的是合法的32位地址,用32位寄存器存储64位模式下的指针本身也不符合规范,极易出现地址越界问题。

修正方法

根据你的实际需求选择对应方案:

  1. 如果你存储地址的寄存器原本就应该是64位,只是错误使用了32位的%eax,直接将寻址寄存器替换为64位的%rax即可:
    mov (%rax), %rdi
  2. 如果你确实需要以%eax存储的32位值作为指针读取64位数据,首先需要将32位指针值扩展为合法64位地址再访问:
movl %eax, %eax  # 零扩展%eax的值到整个%rax寄存器
mov (%rax), %rdi
  1. 如果你实际需要读取的是%eax指向的32位值再存入%rdi,明确指定操作数大小即可:
    • 零扩展存入%rdi:movl (%eax), %edi(写入32位寄存器%edi时会自动零扩展整个%rdi)
    • 符号扩展存入%rdi:movslq (%eax), %rdi

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:57:03