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

来源:本站
导读:目前正在解读《ARM汇编伪指令 宏的用法详解》的相关信息,《ARM汇编伪指令 宏的用法详解》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《ARM汇编伪指令 宏的用法详解》的详细说明。
简介:本文给大家介绍了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)

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

;在程序中调用该宏

HandlerFIQ HANDLER HandleFIQ ;通过宏的名称HANDLER调用宏,其中宏的标号为HandlerFIQ,参数为HandleFIQ

HandlerIRQ HANDLER HandleIRQ

HandlerUndef HANDLER HandleUndef

HandlerSWI HANDLER HandleSWI

HandlerDabort HANDLER HandleDabort

HandlerPabort HANDLER HandlePabort

也许我们会问想格式中的[$ label]到底有什么作用?

当宏定义体内部跳转时,这个参数会起到至关重要的作用。要想在宏内部跳转,就必须在宏定义体内部有程序标号如(LOOP),如果不使用参数($ label),当在一个程序段内调用两次宏的时候,编译器就会出现错误,因为当汇编时产生了两个相同名字的程序标号。

例子:

宏的定义体:

MACRO

$PM DELAY $CanShu

$PM

LDR R7,=$CanShu ;

;LDR R7,[R7] ;此时参数是一个立即数 如果是变量的话是会用到这一句

$PM.LOOP

SUBS R7,R7,#0X01

BNE $PM.LOOP

MEND

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

...

AA DELAY 0X000005F0

...

BB DELAY 0X00000FF0

...

此时调用多次,编译器就不会出现问题,例子中的AA和BB仅仅是一个标号,用户可以自行书写,因为在宏指令呗展开时,这个符号在汇编时将使用相应的值替代

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

提醒:《ARM汇编伪指令 宏的用法详解》最后刷新时间 2024-03-14 00:57:52,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《ARM汇编伪指令 宏的用法详解》该内容的真实性请自行鉴别。