guoxh9
驱动太牛
驱动太牛
  • 注册日期2003-10-13
  • 最后登录2011-10-14
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:2799回复:7

44b0开发板中这段代码什么意思?详细解释一下

楼主#
更多 发布于:2004-05-19 10:21
;**********************************************************
;检查是否使用tasm.exe进行编译

 GBLL    THUMBCODE
    [ {CONFIG} = 16
THUMBCODE SETL {TRUE}
    CODE32
    |  
THUMBCODE SETL {FALSE}
    ]

    [ THUMBCODE
    CODE32   ;for start-up code for Thumb mode
    ]    
     
;******************************************************
rou_wexx
驱动牛犊
驱动牛犊
  • 注册日期2003-03-04
  • 最后登录2008-11-10
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-05-19 17:47
GBLL THUMBCODE   //全局变量
[ {CONFIG} = 16  //if(config ==16
THUMBCODE SETL {TRUE}// { Thumbcode ==TRUE;
CODE32
|    //else
THUMBCODE SETL {FALSE} //Thumbcode =FALSE;
]//endif

[ THUMBCODE  if ...        
CODE32 ;for start-up code for Thumb mode
]           endif
guoxh9
驱动太牛
驱动太牛
  • 注册日期2003-10-13
  • 最后登录2011-10-14
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-20 08:40
code16伪指令指示汇编编译器后面的指令为16位的thumb指令
code32伪指令指示汇编编译器后面的指令为32位的arm指令


{CONFIG} = 16  //if(config ==16
THUMBCODE SETL {TRUE}// { Thumbcode ==TRUE;
CODE32
是不是说 CONFIG=16 :code32伪指令指示汇编编译器后面的指令为32位的arm指令??

这不是矛盾吗?
rou_wexx
驱动牛犊
驱动牛犊
  • 注册日期2003-03-04
  • 最后登录2008-11-10
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-05-20 17:18
他其实是多写了一个CODE32 第一个可以不要的,后面那个的意思一点也没错,你看过下面的解释就明白了o
Because all Thumb-capable ARM processors start in ARM state, you must use the BX instruction to branch and exchange to Thumb state, and then use the CODE16 directive to instruct the assembler to assemble Thumb instructions. Use the corresponding CODE32 directive to instruct the assembler to return to assembling ARM instructions.
因为这是你这么模块的开始,可并不知道你上一个模块是什么状态哦,所以”必须“需要用CODE32 return to assembling ARM instructions
这只是一种习惯而已你现在没有的话也是也可的啦。就像在编程时候增加ASSERT ()是一样的概念啦。

[编辑 -  5/21/04 by  rou_wexx]
guoxh9
驱动太牛
驱动太牛
  • 注册日期2003-10-13
  • 最后登录2011-10-14
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-05-21 08:33
Because all Thumb-capable ARM processors start in ARM state, you must use the BX instruction to branch and exchange to Thumb state, and then use the CODE16 directive to instruct the assembler to assemble Thumb instructions. Use the corresponding CODE32 directive to instruct the assembler to return to assembling ARM instructions.

rou_wexx大虾:
以上这段英文翻译如下:
因为所有的(可以执行Thumb指令的)arm处理器在复位之后先执行arm指令,所以你必须用BX指令切换到Thumb指令状态,然后用伪指令CODE16表示编译器将编译Thumb指令,使用相应的伪指令CODE32表示编译器返回编译ARM指令。

我不明白的是下面这段代码:
[ THUMBCODE
CODE32 ;for start-up code for Thumb mode
]

翻译成c语言形式如下:

if(THUMBCODE=TRUE)
   {
     CODE32    ;启动代码为Thumb模式
   }
endif

矛盾之处如下:
if(THUMBCODE=TRUE)表示汇编Thumb指令

而{
     CODE32    ;启动代码为Thumb模式
   }
code32伪指令指示汇编编译器后面的指令为32位的arm指令





  



guoxh9
驱动太牛
驱动太牛
  • 注册日期2003-10-13
  • 最后登录2011-10-14
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-05-21 08:42
是不是这个原因?:
Thumb指令系统包括ARM代码,至少是初始化和例程入口部分为ARM代码。

这样尽管启动代码是Thumb模式,但由于入口部分为ARM代码所以用CODE32指示汇编编译器后面的指令为32位的arm指令,用BX指令切换到ARM指令状态.












rou_wexx
驱动牛犊
驱动牛犊
  • 注册日期2003-03-04
  • 最后登录2008-11-10
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-05-21 22:16
其实你想的太复杂了哦,说白了整个预编译段就是为了说明要ARM的当前状态和编译器的状态统一而已。这里他只是给了个标准的例子,实际大多数情况不需要啦。但是上面的config==16只说明你编译器当前在使用的TASM.EXE 但你现在 Thumb-capable ARM processors start in ARM state(注意是MCU的状态和编译器无关)。所以要使两者一致编译出来的代码才能被运行,使用CODE32 使编译器也处于ARMASM.EXE状态,我想你对两者的关系有点混淆哦(CODE16/32只会影响编译器,只有BX会改变processors state.只要两者一致就好哈哈,是不是我写的太罗嗦哦,我明天去旅游3天,所以不明白的话可以email 我,guwei@transrf.com 或可以msn :rou_wexx@hotmail.com.欢迎交流,互相学习,很少见到你这么认真的哦。
guoxh9
驱动太牛
驱动太牛
  • 注册日期2003-10-13
  • 最后登录2011-10-14
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-05-22 08:26
明白了!
谢谢讲得这么详细!
我已加你msn!
你可以加我
游客

返回顶部