6230|20

61

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

pxa303 OBM 汇编代码 分析!问题可能比较多,而且可能不断提出,但保证在一个星期内结贴。 [复制链接]

最近分析pxa303中obm的汇编代码,有些疑惑。

;***********************************************************************************
;  Initialize the DDR
;
; Only Initialize DDR if it hasn't already been initialized by the TBR
; if we are running in DDR space, then we need to reload the whole OS
;***********************************************************************************


  mov r1, pc
  ldr r0, =0x80000000
  andals  r0, r0, r1

  bne        __ENABLE_MMU        ; Go right to MMU enable and OBMBootMain

  bl DDRInit


上面的andals指令如何解释,and后面的al是条件“总是吗”?

__ENABLE_MMU子函数只有一条语句  
__ENABLE_MMU
   INCLUDE mmuenable.INC

这个怎么执行呢?

   mmuenable.INC
中一开始的代码是这样的:
  INCLUDE macro.MAC

   def TTB_BASE,              0x80040000
   def TTB_PAGE_BASE,         0x80046000


;*************************************************** *
;* Memory Map with virtual to physical translations * *
;*************************************************** *
   B MemMapEnd
;ALIGN   32
    INCLUDE memmap.INC
MemMapEnd


;***************************************************************
;*
;* Regardless of reset reason, disable MMU and flush things out
;*
;***************************************************************
;ALIGN   32
   ldr      r0, =0x2043             ; enable access to all coprocessors
   mcr      p15, 0, r0, c15, c1, 0
   CPWAIT   r0

是直接执行MemMapEnd吗?

最新回复

呵呵, C language 如何返回 n 个参数呢?? 我倒是知道一个返回值时是放在 a1(r0) 内. Paul, Chao @ Techware   详情 回复 发表于 2009-12-15 13:49
点赞 关注

回复
举报

84

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
andals 传说中的V7指令?楼主用的是什么芯片啊?
B MemMapEnd  应该是无条件执行MemMapEnd了。
期待高人来解答。
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 ljdtj 的回复:
andals 传说中的V7指令?楼主用的是什么芯片啊?
B MemMapEnd? 应该是无条件执行MemMapEnd了。
期待高人来解答。


pxa303应该是基于intel Xscale而来的,属于V5

-----------------------
to:and后面的al是条件“总是吗”?
对,就是这个意思
但是加个als啥意思,没有用过
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用楼主 sailorlyq 的回复:
最近分析pxa303中obm的汇编代码,有些疑惑。

;***********************************************************************************
;? Initialize the DDR
;
; Only Initialize DDR if it hasn't already been initialized by the TBR
; if we are running in DDR space, then we need to reload the whole OS
;***********************************************************************************


? mov r1, pc
? ldr r0, =0x80000000
? andals? r0, r0, r1

? bne        __ENABLE_MMU        ; Go right to MMU enable and OBMBootMain

? bl DDRInit

上面的andals指令如何解释,and后面的al是条件“总是吗”?

__ENABLE_MMU子函数只有一条语句
__ENABLE_MMU
?  INCLUDE mmuenable.INC
这个怎么执行呢?

?  mmuenable.INC
中一开始的代码是这样的:
INCLUDE macro.MAC

?  def TTB_BASE,? ? ? ? ? ? ? 0x80040000
?  def TTB_PAGE_BASE,? ? ? ?  0x80046000


;*************************************************** *
;* Memory Map with virtual to physical translations * *
;*************************************************** *
?  B MemMapEnd
;ALIGN?  32
? ? INCLUDE memmap.INC
MemMapEnd


;***************************************************************
;*
;* Regardless of reset reason, disable MMU and flush things out
;*
;***************************************************************
;ALIGN?  32
?  ldr? ? ? r0, =0x2043? ? ? ? ? ?  ; enable access to all coprocessors
?  mcr? ? ? p15, 0, r0, c15, c1, 0
?  CPWAIT?  r0
是直接执行MemMapEnd吗?

另外几处你不理解的地方,建议你最好看一下arm指令的介绍就知道了,呵呵
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

5
 
不懂,学习。
 
 
 

回复

51

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用楼主 sailorlyq 的回复:
最近分析pxa303中obm的汇编代码,有些疑惑。

? andals? r0, r0, r1

上面的andals指令如何解释,and后面的al是条件“总是吗”?
1. r0=r0&r1, al=Always (normally omitted), s=Updates condition flags. 故其与 ands r0, r0, r1 写法相同, 可能是笔者为了显示其高超的 assembly 功力, 所以才这样写.

__ENABLE_MMU子函数只有一条语句
__ENABLE_MMU
?  INCLUDE mmuenable.INC
这个怎么执行呢?
2. __ENABLE_MMU 应该只是一个 label, 所以 lz 要去看一下 mmuenable.inc 其内容方知.

?  mmuenable.INC
中一开始的代码是这样的:
INCLUDE macro.MAC

?  def TTB_BASE,? ? ? ? ? ? ? 0x80040000
?  def TTB_PAGE_BASE,? ? ? ?  0x80046000


;*************************************************** *
;* Memory Map with virtual to physical translations * *
;*************************************************** *
?  B MemMapEnd
;ALIGN?  32
? ? INCLUDE memmap.INC
MemMapEnd


;***************************************************************
;*
;* Regardless of reset reason, disable MMU and flush things out
;*
;***************************************************************
;ALIGN?  32
?  ldr? ? ? r0, =0x2043? ? ? ? ? ?  ; enable access to all coprocessors
?  mcr? ? ? p15, 0, r0, c15, c1, 0
?  CPWAIT?  r0
是直接执行MemMapEnd吗?
3. YES.


Paul, Chao @ Techware
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

7
 
多谢各位高人。

如果
__ENABLE_MMU 子函数只有一条语句
__ENABLE_MMU
   INCLUDE mmuenable.INC


如果它的意思是直接进入mmuenable.INC执行的话,那么它应该执行
B MemMapEnd
;ALIGN   32
    INCLUDE memmap.INC
MemMapEnd

    可是这样的话INCLUDE memmap.INC这条语句是不是就被调过去了?

我可能表述的不太清楚,这个地方我想问的是

__ENABLE_MMU
   INCLUDE mmuenable.INC
这个子函数的作用是直接跳入mmuenable.INC 顺序执行指令吗?还是仅仅起到一个包含头文件的作用?

 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

8
 
andals 没有找到啥的。
B MemMapEnd
局势跳转到MemMapEnd 了。嘿嘿。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

9
 
INCLUDE mmuenable.INC是把mmuenable.INC的内容插入在这里,程序执行到这时应该就是执行mmuenable.INC里面的内容。而INCLUDE memmap.INC也是同样的道理。INCLUDE memmap.INC部分应该不会被跳过去,如果程序能够从B MemMapEnd返回的话,应该会去执行memmap.INC的内容。

在这里还想向paul_chao大侠请教下,s=Updates condition flags,如果ands r0, r0, r1后面没有对condition flags进行判断的转移指令,是否可以用and r0,r0,r1来替代呢?
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

10
 
andals == ands, ands != and.

当然, 若是对 status register 没有参考的需要的话, 加不加 's' 是无关的, 这是 programmer 须自行注意的.

Paul, Chao @ Techware

 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

11
 
谢谢paul_chao大侠的解答。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

12
 
这里高手很多呀。
刚才看了一下手册,andals  r0, r0, r1。如果r0, r1逻辑与的结果是0的话会把状态寄存器的Z位设置为1,这样的结果就和CMP结果判定相等是一样的,因为CMP的操作是把r0, r1相减,如果相等结果也是0,同样置位Z。

这块的思路基本上理清了。

OBM还有一个很奇怪的语句: ContinueBoot
它并不是一个汇编指令。如果是个子函数(或者叫函数分支?)的话,它前面为什么没有跳转指令呢?

 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 11 楼 sailorlyq 的回复:
OBM还有一个很奇怪的语句: ContinueBoot
它并不是一个汇编指令。如果是个子函数(或者叫函数分支?)的话,它前面为什么没有跳转指令呢?


ContinueBoot 会不会是 macro 呢?? 那几个 *.inc 档找找吧

Paul, Chao @ Techware

 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

14
 
应该是个宏。但是没有找到在哪定义的。
另外那个DDRInit也没有找到,不过有个命令引入了它,IMPORT DDRInit。难道它汇编也有一个类似于.lib的库吗?
 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(初级)

15
 
老外的模块化处理真不是盖的!楼主用的什么工作环境,打开这个工程之后如果有看到.lib的话,有可能部分代码存在于.lib中了。也有可能DDRInit是用C或者CPP代码实现的。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

16
 
刚才看了一下,DDRInit就应该是一个library routine。
可是这里ContinueBoot 并没有被引入,在别的地方也没有找到。我想它会不会仅是一个标记,开发人员原来想用一下 bl ContinueBoot;可后来没有用到。
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

17
 
最后两个问题。

汇编调用C语言的时候如何传参的,C语言调用汇编的时候是如何传参的。

是通过R0 R1 R2 R3 这几个寄存器吗?比如第一个参数放R0中。
多谢。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

18
 
汇编调用C语言;C语言调用汇编一般都是用R0、R1、R2、R3来传参的。第一个参数放R0,第二个参数R1,第三个参数R2,第四个参数R3。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

19
 
那返回值放在哪呢?
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

20
 
如果是一个参数返回值就放在r1中,n个参数返回值就放在rn中。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播:当AI遇见仿真,会有什么样的电子行业革新之路?
首场直播:Simcenter AI 赋能电子行业研发创新
直播时间:04月15日14:00-14:50

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 8

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表