Chinaunix首页 | 论坛 | 博客
  • 博客访问: 383925
  • 博文数量: 80
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1767
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-24 16:18
个人简介

为啥不能追求自己的爱好一辈子呢

文章分类

全部博文(80)

文章存档

2017年(1)

2015年(2)

2014年(18)

2013年(59)

分类: LINUX

2013-06-07 15:52:11

    今天看linux内核0.11版的内存管理代码,里面用位图定义了内存的布局,但是代码在ubuntu 12.04上面没能编译成功,报了can't find a register in class creg while reloading asm错误
   

点击(此处)折叠或打开

  1. __asm__("std;repne;scasbnt"
  2.             "jne 1f\n\t"                                    
  3.             "movb $1,1(%%edi)\n\t"                            
  4.             "sall $12,%%ecx\n\t"                            
  5.             "addl %2,%%ecx\n\t"                            
  6.             "movl %%ecx,%%edx\n\t"
  7.             "movl $1024,%%ecx\n\t"
  8.             "leal 4092(%%edx),%%edi\n\t"
  9.             "rep;stosl\n\t"
  10.             "movl %%edx,%%eax\n"                    
  11.             "1:"
  12.             :"=a"(__res)
  13.             :""(0),"i"(LOW_MEM),"c"(PAGING_PAGES),
  14.             "D"(mem_map + PAGING_PAGES - 1)
  15.             :"cx","di","dx");
,我就上网上搜索了一下。原来gcc版本升级了,假设你告诉编译器你使用了一个寄存器,等你再次使用它的时候你直接告诉编译器这个寄存器的号码就行啦,不然编译器以为你需要用两个这样的寄存器就会报错,现在只需要把相同的寄存器改成编号就行啦。

点击(此处)折叠或打开

  1. __asm__("std;repne;scasbnt" 
  2.             "jne 1f\n\t"                                    
  3.             "movb $1,1(%%edi)\n\t"                            
  4.             "sall $12,%%ecx\n\t"                            
  5.             "addl %2,%%ecx\n\t"                             
  6.             "movl %%ecx,%%edx\n\t"
  7.             "movl $1024,%%ecx\n\t"
  8.             "leal 4092(%%edx),%%edi\n\t" 
  9.             "rep;stosl\n\t"
  10.             "movl %%edx,%%eax\n"                    
  11.             "1:"
  12.             :"=a"(__res)
  13.             :"0"(0),"i"(LOW_MEM),"c"(PAGING_PAGES),
  14.             "D"(mem_map + PAGING_PAGES - 1)
  15.             :"3","4","dx");


阅读(2260) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~