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

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

出错语句为:

 

[cpp]   view plain copy
  1. asm volatile ("movl %%eax, %%cr0"  
  2. :  
  3. :"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。

将上述代码改成

 

[cpp]   view plain copy
  1. asm volatile ("movq %%rax, %%cr0"  
  2. :  
  3. :"a"(cr0));  



编译通过。

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