VIVI中问题.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
VIVI中问题

/include/headware.h里面有如下的定义 #ifndef __ASSEMBLY__ #define __REG(x) (*(volatile unsigned long *)(x)) #define __REGl(x) (*(volatile unsigned long *)(x)) #define __REGw(x) (*(volatile unsigned short *)(x)) #define __REGb(x) (*(volatile unsigned char *)(x)) #else #define __REG(x) (x) #define __REGl(x) (x) #define __REGw(x) (x) #define __REGb(x) (x) 请问__REG(x) 的定义是对x进行二级指针运算嘛?如果不是,那是什么意思? 2、 /arch/s3c2410/head.S的汇编格式是遵循什么格式的,是Intel还是ATT格式的,怎么看起来都不像。满多东西看不明白,哪位大侠给点指导。谢谢了。 ? ************************************************************************************************************************************* 1。 不是二级指针。 x中放的是一个常量,比如你的sdram contoler某个寄存器的物理地址是0xa0000000,那么我就可以这样用了: #define SDRAM_CTRL_REG __REG(0xa0000000) 然后我以后要对这个寄存器进行访问,就可以这样: 写: SDRAM_CTRL_REG = 0xffff; 读: if (SDRAM_CTRL_REG != 0x3f4e) 顺便说一下,那个#if #lese的意思是这样的: 由于头文件中定义的宏有时用在c源码中,有时用在.S汇编源码中,这样对一个宏的定义就需要两种形式,显然:像#define __REG(x) (*(volatile unsigned long *)(x)) 这样的宏,汇编程序不可能认得,所以kernel中引用了__ASSEMBLY__这个宏,如果定义了该宏,说明该块代码可以被.S包含;如果没定义,说明可以被.c包含,不知道我说明白没有 2.那个。。。话说arm得汇编就不会是intel语法了吧。。。Intel还是ATT格式的问题只在x86体系下谈才有意义。。。。不过可以这样说,他的操作书顺序和市面上的书中介绍的arm汇编的顺序是完全一致的。绝大多说指令都是左边是目的操作数,右边是源操作数(和第二操作数,如果有的话),除了少数指令,比如str ? *********************************************************************************************************************************************** 单从__REG这个宏上可以看出他是不能用相对地址的。建议你使用这些宏,因为使用vivi提供的这些宏在编程的书写风格上非常一致,看起来也很舒服^^ 不过你可以自己定义自己的宏,比如(我没做过vivi的编程,所以说不定vivi上有呢): #define __REG2(x, y) __REG((x) + (y)) 其中x是基地址(绝对地址),y是相对地址(或者说是寄存器索引)。 最简单的就是: read_reg(__REG(x + y)); x是基地址;y是寄存器偏移值(相对地址,寄存器索引,随你怎么叫吧^^) 在保持代码风格的同时可以发挥自己的想象去修改你的代码。希望对你有所帮助。 **************************************************************************************************************************************************** 谢谢你的解释,我现在在看vivi的代码看得我头晕脑胀得,以前没怎么编程。 现在又得麻烦你了。下面是vivi里的用汇编编写的启动部分的源码。 #include config.h #include linkage.h #include machine.h @ Start of executable code ENTRY(_start) ENT

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档