opponent 反义词:转贴:ARM 汇编 伪指令 MACRO及
来源:百度文库 编辑:中财网 时间:2024/05/03 06:49:35
ARM 汇编 伪指令 MACRO及MENDMACRO伪操作标识 宏定义的开始,MEND标识宏定义的结束。
用MACRO 及MEND定义一段代码,称为宏定义体,这样在程序中就可以通过宏指令多次调用该代码段
语法格式
MACRO
{$label} macroname {$parameter {,$parameter}...}
;code
...
;code
MEND
其中:
$labelz在宏指令被展开时,label可被替换成相应的符号,通常是一个标号。在一个符号前使用$标识程序被汇编时将使用相应的值来替代$后的符号
Macroname为所定义的宏的名称
$parameter为宏指令的参数。当宏指令被展开时将被替换成相应的值,类似于函数中的形式参数。可以在宏定义时为参数指定相应的默认值。
MACRO
$HandlerLabel HANDLER $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
HandlerIRQ HANDLER HandleIRQ
HandlerUndef HANDLER HandleUndef
HandlerSWI HANDLER HandleSWI
HandlerDabort HANDLER HandleDabort
HandlerPabort HANDLER HandlePabort
比如第一个为例说明 HandlerFIQ HANDLER HandleFIQ
;;程序被汇编后,宏展开的结果
HandlerFIQ
sub sp,sp,#4
stmfd sp!,{r0}
ldr r0,=HandleFIQ
ldr r0,[r0]
str r0,[sp,#4]
ldmfd sp!,{r0,pc}
用MACRO 及MEND定义一段代码,称为宏定义体,这样在程序中就可以通过宏指令多次调用该代码段
语法格式
MACRO
{$label} macroname {$parameter {,$parameter}...}
;code
...
;code
MEND
其中:
$labelz在宏指令被展开时,label可被替换成相应的符号,通常是一个标号。在一个符号前使用$标识程序被汇编时将使用相应的值来替代$后的符号
Macroname为所定义的宏的名称
$parameter为宏指令的参数。当宏指令被展开时将被替换成相应的值,类似于函数中的形式参数。可以在宏定义时为参数指定相应的默认值。
MACRO
$HandlerLabel HANDLER $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
HandlerIRQ HANDLER HandleIRQ
HandlerUndef HANDLER HandleUndef
HandlerSWI HANDLER HandleSWI
HandlerDabort HANDLER HandleDabort
HandlerPabort HANDLER HandlePabort
比如第一个为例说明 HandlerFIQ HANDLER HandleFIQ
;;程序被汇编后,宏展开的结果
HandlerFIQ
sub sp,sp,#4
stmfd sp!,{r0}
ldr r0,=HandleFIQ
ldr r0,[r0]
str r0,[sp,#4]
ldmfd sp!,{r0,pc}
下面一句一句分析一下,为了便于分析,假设sp = 0x33ff8000,$HandleLabel = 0x33ffff00,
[0x33ffff00] = 0x10000000,r0 = 0x56001234:
$HandlerLabel HANDLER $HandleLabel
宏的名字叫HANDLER ,有两个参数
$HandlerLabel
定义一个标号
sub sp,sp,#4
把栈顶指针减4,留出一个字的空间(用于保存跳转地址的值),sp=0x33ff7ffc
stmfd sp!,{r0}
首先把sp减4 (sp=0x33ff7ff8),然后把将要使用的r0寄存器入栈,此时[0x33ff7ff8]=0x56001234
ldr r0,=$HandleLabel
给寄存器r0赋值,r0=0x33ffff00
ldr r0,[r0]
给寄存器r0赋值,r0=0x10000000
str r0,[sp,#4]
;把寄存器r0保存到0x33ff7ffc (0x33ff7ff8+4),sp没有改变sp=0x33ff7ff8,如果
str r0,[sp,#4]!sp 改变
此时
;[0x33ff7ffc] = 0x10000000
ldmfd sp!,{r0,pc}
把栈顶的两个字弹出,分别保存到r0、pc,此时sp=0x33ff8000,r0=0x56001234,pc=0x10000000 ,通过比较不难发现,sp和r0在执行前后都没有变化,程序就跳转到0x10000000处执行
伪指令MACRO、DQ和END的标号名字域必须有名
ARM指令集中SMLAL及UMLAL指令中的加法进位是如何处理的?
哪位大虾能把汇编的基本命令和伪操作指令全一点的归纳终结啊?
汇编加法指令ADD
这都是什么汇编指令?
汇编指令的简单问题
请解释一下这几条汇编指令
汇编指令 cjne 是什么意思啊
x86指令集同ARM指令集的主要区别
汇编指令的学习有没有技巧
汇编中的cLc指令什么时候使用?
加花指令属于汇编吗
汇编中的指令关于RCL RCR
汇编、反编汇及逆向工程
在c96系列单片机的伪指令中,定义字变量的位指令是什么?
汇编指令中那几条是硬件来执行的
如何在C语言中调用汇编指令序列?
关于汇编的几个指令的简单问题
macro是什么?
汇编试题及答案在那里有?
汇编浮点数的结构及运算
声现象 中考试题汇编及答案
一条arm 指令如何判断其操作数是有符号数还是无符号数?
汇编指令中的查表指令"DB"使用相关问题