汇编中mov (%eax), %rdi触发段错误的原因及解决方法
段错误原因与修正方案
错误原因
- 你使用的是x86-64架构汇编,该架构下内存地址为64位长度,但你使用32位寄存器
%eax存储地址,CPU寻址时会自动将%eax的值零扩展为64位地址,这个扩展后的地址大概率属于进程未分配、或无读权限的内存区域,触发段错误。 - 即使
%eax存储的是合法的32位地址,用32位寄存器存储64位模式下的指针本身也不符合规范,极易出现地址越界问题。
修正方法
根据你的实际需求选择对应方案:
- 如果你存储地址的寄存器原本就应该是64位,只是错误使用了32位的
%eax,直接将寻址寄存器替换为64位的%rax即可:mov (%rax), %rdi - 如果你确实需要以
%eax存储的32位值作为指针读取64位数据,首先需要将32位指针值扩展为合法64位地址再访问:
movl %eax, %eax # 零扩展%eax的值到整个%rax寄存器 mov (%rax), %rdi
- 如果你实际需要读取的是
%eax指向的32位值再存入%rdi,明确指定操作数大小即可:- 零扩展存入
%rdi:movl (%eax), %edi(写入32位寄存器%edi时会自动零扩展整个%rdi) - 符号扩展存入
%rdi:movslq (%eax), %rdi
- 零扩展存入
内容的提问来源于stack exchange,提问作者user16806508
相关产品推荐
相关产品推荐

