您的位置 首页 电子

ARM汇编伪指令 宏的用法详解

宏是一段独立的程序代码,它是通过伪指令定义的,在程序中使用宏指令即可调用宏。当程序被汇编时,汇编程序将对每个调用进行展开,用宏定义

是一段独立的程序代码,它是经过伪指令界说的,在程序中运用宏指令即可调用宏。当程序被汇编时,汇编程序将对每个调用进行打开,用宏界说代替源程序中的宏指令。

MACRO、MEND

语法格局:

MACRO

[$ label] macroname{ $ parameter1, $ parameter,……}

指令序列

MEND

MACRO伪操作标识宏界说的开端,MEND标识宏界说的完毕。用MACRO及MEND界说一段代码,称为宏界说体,这样在程序中就能够经过宏指令屡次调用该代码段。

其间, $ label在宏指令被打开时,label会被替换成相应的符号,通常是一个标号。在一个符号前运用$表明程序被汇编时将运用相应的值来代替$后的符号。

macroname为所界说的宏的称号。

$parameter为宏指令的参数。当宏指令被打开时将被替换成相应的值,相似于函数中的形式参数,能够在宏界说时为参数指定相应的默认值。

宏指令的运用方法和功能与子程序有些相似,子程序能够供给模块化的程序设计、节约存储空间并进步运转速度。但在运用子程序结构时需求维护现场,然后增加了体系的开支,因而,在代码较短且需求传递的参数较多时,能够运用宏汇编技能。

首要运用MACRO和MEND等伪操作界说宏。包括在 MACRO 和 MEND 之间的代码段称为宏界说体,在MACRO伪操作之后的一行声明宏的原型(包括宏名、所需的参数),然后就能够在汇编程序中经过宏名来调用它。在源程序被汇编时,汇编器将宏调用打开,用宏界说体代替源程序中的宏界说的称号,并用实践参数值代替宏界说时的形式参数。

宏界说中的$label是一个可选参数。当宏界说体中用到多个标号时,能够运用相似$label.$internallabel的标号命名规矩使程序易读。

MACRO 、 MEND 伪操作能够嵌套运用。

运用示例:

MACRO

$HandlerLabel HANDLER $HandleLabel ;宏的称号为HANDLER,有1个参数$HandleLabel

$HandlerLabel

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

stmfd sp!,{r0} ;PUSH the work register to stack(lr does not push because it return to original address)

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

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

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

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

MEND

;在程序中调用该宏

HandlerFIQHANDLER HandleFIQ ;经过宏的称号HANDLER调用宏,其间宏的标号为HandlerFIQ,参数为HandleFIQ

HandlerIRQHANDLER HandleIRQ

HandlerUndefHANDLER HandleUndef

HandlerSWIHANDLER HandleSWI

HandlerDabortHANDLER HandleDabort

HandlerPabortHANDLER HandlePabort

或许咱们会问想格局中的[$ label]到底有什么效果?

当宏界说体内部跳转时,这个参数会起到至关重要的效果。要想在宏内部跳转,就必须在宏界说体内部有程序标号如(LOOP),假如不运用参数($ label),当在一个程序段内调用两次宏的时分,编译器就会呈现过错,由于当汇编时产生了两个相同姓名的程序标号。

比如:

宏的界说体:

MACRO

$PMDELAY$CanShu

$PM

LDRR7,=$CanShu;

;LDRR7,[R7];此刻参数是一个当即数假如是变量的话是会用到这一句

$PM.LOOP

SUBSR7,R7,#0X01

BNE$PM.LOOP

MEND

在程序段中的运用:(运用两次)

AADELAY0X000005F0

BBDELAY0X00000FF0

此刻调用屡次,编译器就不会呈现问题,比如中的AA和BB仅仅是一个标号,用户能够自行书写,由于在宏指令呗打开时,这个符号在汇编时将运用相应的值代替

0x00000FF0是一个参数 在此处是一个当即数,用户可自行运用为变量

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/dianzi/261580.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部