现在的位置: 首页 > 综合 > 正文

关于X86_64Linux环境下suffix or operands invalid for ‘mov’问题的研究

2013年06月09日 ⁄ 综合 ⁄ 共 454字 ⁄ 字号 评论关闭

今天帮助朋友调试运行某一linux下的文件加密驱动程序,遇到如下问题:

同样一份c代码分别在32位和64位的CentOS6.0下编译运行,32位系统能够运行正常,而64位系统报suffix or operands invalid for ‘mov’的错误。

出错语句为:

asm volatile ("movl %%eax, %%cr0"
:
:"a"(cr0));

错误经研究后找到产生原因,主要是由于操作系统的系统结构发生了变化,在x86-64中,所有通用寄存器(GPRs)都从32位扩充到了64位,名字也发生了变化。8个通用寄存器(eax, ebx, ecx, edx, ebp, esp, esi, edi)在新的结构中被命名为rax, rbx, rcx, rdx, rbp, rsp, rsi, rdi。movl命令也需相应改成movq。

将上述代码改成

asm volatile ("movq %%rax, %%cr0"
:
:"a"(cr0));

编译通过。

PS:不过运行后又爆出了segmentation fault core dump 错误,看来革命尚未成功同志还需努力……


抱歉!评论已关闭.