else if 伪指令 c语言,引导程序中伪指令详解

ARM汇编程序分析过程中,比较难理解的是他的伪操作、宏指令和伪指令。本文是结合44B0X引导程序中出现伪操作、宏指令和伪指令进行总结,便于进一步分析44B0X的引导。

*****************************************************

一、GET option.s

// GET和INCLUDE功能相同

功能:引进一个被编译过的文件。

格式:GET    filename

其中:fiename    汇编时引入的文件名,可以有路径名。

GET符号在汇编时对宏定义,EQU符号以及存储映射时是很有用的,在引入文件汇编完以后,汇编将从GET符号后开始。在被引入的文件中可能有GET符号再引入其他的文件。GET符号不能用来引入目标文件。

*****************************************************

二、INTPND EQU 0x01e00004

//EQU可以用“*”代替,在阅读源程序时注意。

功能:对一个数字常量赋予一个符号名。

格式:name    EQU   expression

其中:name   符号名。Expression    寄存器相关或者程序相关的固定值。

使用EQU定义常量,与C语言中用#define定义一个常量相同。

例:num   EQU   2    ;   数字2赋予符号num

*****************************************************

三、GBLL    THUMBCODE        [ {CONFIG} = 16

THUMBCODE SETL {TRUE}

CODE32

|

THUMBCODE SETL {FALSE}

]

[ THUMBCODE

CODE32   ;for start-up code for Thumb mode

]

//其中[=IF ,|=ELSE ,]= ENDIF, CODE32 表明一下操作都在ARM状态。这些都是伪操作这段理解为设定THUMCODE的值,然后确定,用户的程序是在ARM状态还是THUM状态。

*****************************************************

四、MACRO

$HandlerLabel HANDLER $HandleLabel

$HandlerLabel

sub sp,sp,#4 ;decrement sp(to store jump address)

stmfd sp!,{r0} ;PUSH the work register to stack

ldr r0,=$HandleLabel;load the address of HandleXXX to r0

ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX

str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack

ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)

MEND

//MACRO……MEND

功能:标志一下宏的定义。

格式:MACRO

Macro_prototype

MEND

宏表达式的格式如下:

{$label}   macroname    {$ parameter{,parameter2}…}

其中:

$ label   参数,在宏使用时,被给定的符号替代。

Macroname   宏的名称,并不一定以一条指令或者符号名开始。

$parameter    在宏使用时,被替代的参数,格式为:$parameter=“default value”

在宏体中,参数如:$parameter和变量一样使用,在被宏引用时,被赋于新值,参数必须用“$”符号加于区别。$label在宏定义内部符号时很有用,可以看作宏的参数。使用“|”符号作为使用一个参数缺省值的变量,如果使用的是一个空格符串,将省去该变量。在使用内部标志的宏定义中,将内部标志定义为带后缀的标志,将会很有用。如果在扩展中空间不够,可以作为参数和后继文字之间或者参数之间使用圆点隔开,但在文本和后继参数之间不能使用圆点。宏可以定义局部变量的范围。宏还可以嵌套使用。

例:

MACRO

$label    xmac    $p1,$p2

LCLS   err

$labell,loopl

BGE    $pl

$labell,loop2

BL     $p1

BEG      $p1

BEG      $labell,loop2

MEND

*****************************************************

五、$和$$

//$临时变量替换,若程序中需要用字符$则用$$来表示,通常情况下,包含在两个||之间的$并不表示进行变量替换,但是如果|线是在双引号内,则将进行变量替换。用“.”来分割出变量名的用法,

GBLS STR1

GBLS STR2

STR1 SETS "AAA"

STR2 SETS "BBB$$STR1.CCC"  //汇编后STR2的值为bbAAACCC

*****************************************************

六、 IMPORT  Main    ; The main entry of mon program

//该伪操作告诉编译器当前的符号不是在本文件中定义的,在本源文件中可能引用该符号,而不论该源文件是否使用该符号,该符号都将被加入到本源文件中。

格式:

IMPORT symbol {[WEAK]}

symbol 引用的符号的名称,他是区分大小写的,[WEAK]指定这个选项后,如果symbol所在的源文件中没有被定义,编译器也不会报错。他和EXTERN作用相同,不同之处在于,如果本源文件没有实际引用该符号,该符号将不会被加入到本源文件的符号表中。

*****************************************************

七、AREA    Init,CODE,READONLY       ENTRY

//功能:指示汇编器汇编一段新的代码或新的数据区。

格式:

name  给出的特定段名。以数字开头,必须加竖线,否则,将报错,例如:|1_Data-Area|。某些名字已保留,如:|C$$code|已经被C编译器用作代码,或者用作与C库相连的代码段。

Attr    段名属性,下列属性是有效的:

ALIGN=expression

缺省状态下,AOF段将按4个字节对准,expression可以是2~31之间的整数,该段将按2(上标为expression)字节对准。例如,espression等于

10,该段将按1KB对准。

CODE        特定机器指令,缺省为READONLY。

COMDEF      通用段定义。该AOF段可能包括代码和数据,但必须与其他段名相区别。

COMMON      通用数据段,无须再注释定义任何代码和数据,通常由链接器初始化为零。

DATA        包含数据,但是不包含指令,缺省为READWRITE

INTERWORK   表明代码段可以适用ARM/Thumb interworking功能。

NOINIT      表明数据段可以初始化为零,只包含指示符。

PIC         表明定位独立段,可以不修改情况下,在任意地址执行。

READONLY    表明该段可读可写。

汇编时,必须至少有一个AREA指示符。使用AREA符号可以将源程序区分,但是必须不重名。通常需要独立的AOF段做为代码或者数据段,较大程序可以分为多个代码段。AOF段可以定义局部标签的范围,可以使用ROUT符号。如果没有任何的AREA指示符定义,汇编器将会产生名为

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值