今天帮助朋友调试运行某一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 错误,看来革命尚未成功同志还需努力……