LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 669|回复: 3

C内联汇编&寄存器堆的困惑!!

[复制链接]
发表于 2005-3-27 09:18:08 | 显示全部楼层 |阅读模式
[这个贴子最后由tclfreegnu在 2005/03/27 09:09am 第 1 次编辑]

可能是汇编语言刚刚接触吧,感到看内联汇编代码很是吃力,有很多疑问。

A.关于寄存器堆的存储惯例

通用寄存器使用惯例
如:关于通用寄存器%eax习惯上是用来存放函数返回值的
  那么%ebx, %ecx, %edx等,是否也存在这类似的使用惯例?

B.内联汇编
我只是略知其形式如下:

指令部分:输出部分:输入部分:损坏部分

但看懂代码还是很困难
如:


  1. asm("movl %4, %%eax;" CPUID
  2.     "movl %%eax, %0; movl %%ebx, %1;
  3.      movl %%ecx, %2; movl %%edx, %3"
  4.     :"=m"(regs.eax),"=m"(regs.ebx),  
  5.      "=m"(regs.ecx), "=m"(regs.edx)
  6.     :"g"(func)
  7.     :"%eax", "%ebx", "%ecx", "%edx");
  8.    


  9. 1)%0...%4具体指那些寄存器?
  10. 2)"movl %4, %%eax;" CPUID //怎么理解?
  11. 3):"g"(func)//什么意思?
  12. 4)"%eax", "%ebx", "%ecx", "%edx"//怎么理解?
  13. 那位朋友帮忙总体分析一下
  14. thanks
复制代码
发表于 2005-3-27 10:28:22 | 显示全部楼层
好像不能说是惯例吧,入口出口参数放到哪里要看是什么指令吧,不同的指令可能有不同的要求吧(如果大家都要求eax是出口那就成惯例了

你这段程序我在《Linux 0.0.1内核分析与操作系统设计》那本书的P42里看过,CPUID在这段程序之前已经预定义了:

  1. #define CPUID ".byte 0x0f,0xa2;"
复制代码


这是识别CPU类型的程序,把ebx edx ecx的返回值转为ASCII然后合并为字符串,对于Intel、AMD、Cyrix的CPU分别得到的结果是GenuineIntel AuthenticAMD Cyrix Instead,要得到这些的条件是入口参数EAX=0

我记得g这个指令应该是执行的意思吧?

其他的我不懂了,我是菜鸟
回复 支持 反对

使用道具 举报

发表于 2005-3-27 19:49:36 | 显示全部楼层
看看置顶的论坛索引中给出的链接:
http://www.linuxsir.cn/bbs/showt ... d=715911#post715911
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-28 11:38:43 | 显示全部楼层
Post by kj501
看看置顶的论坛索引中给出的链接:
http://www.linuxsir.cn/bbs/showt ... d=715911#post715911


really thanks
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表