`

ARM 汇编 伪指令 MACRO及MEND handle

 
阅读更多

MACRO伪操作标识 宏定义的开始,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

在后面的程序有多处调用,其大致作用是把宏的第一个参数$HandlerLabel 转变为一个标号,然后让程序跳转到第二个参数 $HandleLabel (第二个参数应该为一个地址)对应的值的地址去。

;;在程序中调用
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]=0x10000000r0 =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处执行

分享到:
评论

相关推荐

    常用ARM指令集及汇编.pdf

    第 I 页常用 ARM 指令集及汇编 Ver:1010 比较指令23 CMP 23 CMN23 TST24 TEQ24 乘法指令25 MUL25 MLA25 UMULL25 UMLAL26 SMULL 26 SMLAL 26 ARM 跳转指令27 B27 BL27 BX 27 ARM 协...

    ARM伪指令集(常用及实用)

    ARM汇编伪指令............................................................................................................................2 一.常见的符号定义伪指令有如下几种:.............................

    arm9疑难问题小结

    对初学arm的时,一些疑难问题进行总结,ARM汇编% ldr和adr CPSR_cxsf ^的作用 MACRO-MEND

    ch4-2-汇编语言程序设计(dos功能调用与程序设计).pptx

    回顾 伪指令 数据定义伪指令 符号定义伪指令 段定义伪指令 设定段伪指令 过程定义伪指令 宏命令伪指令 结束伪指令 DATA DB 3 DUP(22H,?) CONST EQU 100 CODE SEGMENT DISPLAY PROC DADD MACRO ENDS ENDP ENDM ...

    学习ARM汇编的经典参考资料

    学习ARM汇编指令的经典资料。 对ARM的各种汇编指令进行了深入全面的讲解,并给出了各种示例和详细注解,并且还对一些值得注意的点或是容易犯错误的地方进行了总结。 目录 前言......................................

    ARM指令集 肯定可以下载

    ARM7TDMI(-S)指令集及汇编....................................................................................................................1 ARM 处理器寻址方式...........................................

    easybuilder 8000 指令说明 macro

    easybuilder 8000 指令说明

    PIC单片机指令系统

    简介 指令时序 指令格式 寻址方式 常用伪指令 宏指令 Macro 表

    arm指令集-中文 (ARM微控制器基础)

    ARM7TDMI(-S)指令集及汇编....................................................................................................................1 ARM 处理器寻址方式...........................................

    汇编控制伪操作之二

    本文是关于汇编控制伪操作。

    asm 汇编语言基础知识

    汇编语言源程序的汇编过程是是利用汇编程序(MASM)对已编辑好的源程序文件(.ASM)进行汇编,将源程序文件中以ASCII码表示的助记符指令逐条翻译成机器码指令,并完成源程序中的伪指令所指出的各种操作,最后可以...

    Microsoft Macro Assembler 8.0 (MASM) 软件包 (x86)

    Microsoft Macro Assembler 8.0 (MASM) 是一个利用 x86 汇编语言程序并产生相应的二进制文件的工具。用 MASM 生成的汇编语言程序可以使用 Visual C++ 2005 Express 版进行编辑和调试。本软件包需要在计算机上先行...

    汇编文档内容比较

    汇编文档内容比较 SAVER MACRO ;各寄存器入栈 PUSH AX PUSH BX PUSH CX PUSH DX PUSH DS PUSH SI ENDM

    Macro F1 and Macro F1.pdf

    Macro F1 and Macro F1是2019年的一篇关于两种宏观F1-score的计算方式的详细讲解。

    MASM汇编编辑器 好用 简单

    ◆硬指令助记符可以是任何一条处理器指令,也可以是一条宏指令,伪指令助记符主要完成一些不产生CPU动作的说明性工作,在程序执行前由汇编程序完成处理。 ◆处理器指令的操作数可以是立即数、寄存器和存储单元。伪...

    Microsoft Macro Assembler Reference

    MSDN 中 微软宏汇编程序的参考 帮助讲解 Microsoft Macro Assembler Reference

    excel macro

    好用 的 excel macro,可以build好用 的 excel macro,可以build好用 的 excel macro,可以build好用 的 excel macro,可以build

    [confluence插件] confluence-markdown-macro-1.6.22.jar

    [confluence插件] confluence-markdown-macro-1.6.22.jar [confluence插件] confluence-markdown-macro-1.6.22.jar [confluence插件] confluence-markdown-macro-1.6.22.jar [confluence插件] confluence-markdown-...

    Laravel开发-laravel-blade-macro

    Laravel开发-laravel-blade-macro laravel blade`@macro`指令。

    FreeMarker使用Macro实例

    FreeMarker使用Macro实例,很好的学习资料。

Global site tag (gtag.js) - Google Analytics