ARM 汇编伪指令宏的用法详解(MACRO-MEND)
来源:互联网 发布:淘宝二手电脑企业店铺 编辑:程序博客网 时间:2024/06/03 14:53
宏是一段独立的程序代码,它是通过伪指令定义的,在程序中使用宏指令即可调用宏。当程序被汇编时,汇编程序将对每个调
用进行展开,用宏定义取代源程序中的宏指令。
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
在程序段中的使用:(使用两次)
用进行展开,用宏定义取代源程序中的宏指令。
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
在程序段中的使用:(使用两次)
- ARM 汇编伪指令宏的用法详解(MACRO-MEND)
- ARM 汇编伪指令宏的用法详解(MACRO-MEND)
- ARM汇编伪指令 宏的用法详解(MACRO MEND)(转载)
- ARM 汇编 伪指令 MACRO及MEND
- ARM 汇编 伪指令 MACRO及MEND
- ARM 汇编 伪指令 MACRO及MEND
- ARM 汇编 伪指令 MACRO及MEND
- ARM 汇编 伪指令 MACRO及MEND
- ARM 汇编 伪指令 MACRO及MEND handle
- ARM汇编伪指令 宏的用法详解
- ARM汇编伪指令 宏的用法详解(MACR…
- ARM汇编伪指令用法
- ARM- MACRO MEND
- ARM汇编伪指令详解
- ARM汇编伪指令详解
- arm 汇编中 .word伪指令的用法
- arm汇编align伪指令详解
- ARM 汇编伪指令
- 流水灯的程序
- Html知识积累连载(01)——文档类型的定义和xmlns的含义
- 银行业务调度系统
- 理解终端复用器tmux系列讲座
- Windows Phone开发之ApplicationBar简介
- ARM 汇编伪指令宏的用法详解(MACRO-MEND)
- 新特性:/dev/shm对Oracle 11g的影响!
- 2012/5/26 0:56
- Windows7下无法删除exe文件,或频繁链接时产生LNK1168错误
- 匈牙利模板
- ubuntu vi
- 《影响力》读后感(持续更新)
- 在忍无可忍的情况下,我终于抛弃了remoting
- 非常神奇的一张图分出你用左脑还是右脑