琦天娃娃 发表于 2011-10-19 17:24:08

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

本帖最后由 琦天娃娃 于 2011-10-19 17:26 编辑

今天帮助朋友调试运行某一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 错误,看来革命尚未成功同志还需努力……http://static.blog.csdn.net/xheditor/xheditor_emot/default/crazy.gif


琦天娃娃 发表于 2011-10-24 11:44:14

本帖最后由 琦天娃娃 于 2011-10-24 11:44 编辑

后续进展:segmentation fault core dump问题已解决

主要是写的测试程序工作在应用层,没有访问权限,把程序用驱动模式载入问题解决。

wajmjjj 发表于 2011-10-24 14:03:51

希望小甲鱼能出64汇编,毕竟现在基本都开始往64迁移了

琦天娃娃 发表于 2011-10-24 16:41:54

wajmjjj 发表于 2011-10-24 14:03 static/image/common/back.gif
希望小甲鱼能出64汇编,毕竟现在基本都开始往64迁移了

小甲鱼只有一个人,他没有办法照顾所有的学科,我觉得与其期待别人不如自己开始动手实践~{:5_92:}

wajmjjj 发表于 2011-10-24 23:01:10

琦天娃娃 发表于 2011-10-24 16:41 static/image/common/back.gif
小甲鱼只有一个人,他没有办法照顾所有的学科,我觉得与其期待别人不如自己开始动手实践~

额,有心无力啊,最近比较忙,实在没时间搞,我连32位的汇编都只是略懂,惭愧啊惭愧。。。。
页: [1]
查看完整版本: 关于X86_64Linux环境下suffix or operands invalid for ‘mov’问题的探讨