ARM 汇编 伪指令 MACRO及MEND

发布者:温柔的爱情最新更新时间:2018-04-15 来源: eefocus关键字:ARM  汇编  伪指令  MACRO  MEND 手机看文章 扫描二维码
随时随地手机看文章

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

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


关键字:ARM  汇编  伪指令  MACRO  MEND 引用地址:ARM 汇编 伪指令 MACRO及MEND

上一篇:TQ2440之uboot---6.start.S中relocate部分分析,adr与ldr区别
下一篇:ARM数据处理指令中的立即数问题

推荐阅读最新更新时间:2024-03-16 16:00

ARM协处理器命令MCR-MRC
ARM协处理器cp15,有16个寄存器,详细看《ARM体系结构与编程》 这里我大概说一下MRC与MCR这两个协处理器操作,参考《s3c2440》元件手册P140页 这两个命令是用于ARM寄存器与协处理器寄存器之间操作的,一个协处理器与寄存器之前操作的例子就是,一个浮点值在协处理器中转换成32位整型,然后它的结果传送到ARM920T的寄存器中MRC。相反则为MCR。 最重要的应用就是通过命令从协处理器交换控制信息到ARM920T CPSR相应标识位 看几个例子就明白 MRC p2,5,r3,c5,c6 协处理器p2把c5和c6经过5操作的结果赋给r3 MCR p6,0,r4,c5,c6 协处理器p6把r4执行0操作后将结果存放进
[单片机]
GNU ARM汇编--(三)ARM处理器的基本原则
这一篇的知识来源全部来自《ARM System Developer's Guide》 从编程人员的视角来看,arm核是由数据总线连接的功能单元组成,如下图所示: 数据通过数据总线流向处理器核心,这里的数据可以是将要执行的指令,也可以是数据项.上面的图是Von Neumann体系的arm核,数据项和指令共用同一总线.而h哈佛结构体系的arm核就会用两个不同的总线. 就像所有的RISC处理器,arm采用load-store体系结构.也就是说它含有两条不同的指令类型来出入处理器.loar指令将数据从内存拷贝到寄存器,store指令是将数据从寄存器拷贝到内存.没有直接操作内存中数据的数
[单片机]
GNU <font color='red'>ARM</font><font color='red'>汇编</font>--(三)<font color='red'>ARM</font>处理器的基本原则
ARM裸板】Nand Flash编程
1.读芯片ID 1.1 读芯片ID时序 简化为4个步骤: 1.使能片选 2.写命令0x90 3.写地址0x00 4.读ID信息 /* 识别NAND FLASH */ void scan_nand_flash(void) { int i; //保存读取ID信息的数组 unsigned char id_info = {0}; nand_enable_cs();//使能CS nand_write_cmd(0x90); nand_write_addr(0x00); for(i = 0;i 5;i++){ id_info = nand_read_data(); } nand_disa
[单片机]
【<font color='red'>ARM</font>裸板】Nand Flash编程
韦东山ARM裸机学习笔记——代码重定位
前言 以下所写的内容都是基于韦东山JZ2440开发板的,更多内容可参考韦东山第一期ARM裸机视频代码重定位章节或韦东山S3c2440代码重定位详解学习。 一、什么是代码重定位? 代码重定位就是将代码的text段、rodata段、data段等从一个地址搬移到另外一个地址。本来程序烧写好之后是在某一个地址开始运行的,经过代码重定位之后,可以在另外一个地址运行。例如:程序烧写在Nor Flash上,本来是在Nor Flash上的0地址开始运行的,通过代码重定位,把数据段或整个程序搬移到SDRAM的0x30000000地址运行。 二、为什么要代码重定位? 1、程序烧写在Nand Flash上的情况 (1)Nand Flash
[单片机]
韦东山<font color='red'>ARM</font>裸机学习笔记——代码重定位
C语言函数和汇编函数相互调用
简介:在C程序main函数中,接收用户输入任意个整数,然后在main中调用使用ARM汇编编写的函数(在该函数中完成对这些整数的排序功能),然后再在C程序main函数中输出这些排好顺序的整数。 main.c #include stdio.h int main() { int i=0; int num=0; int *array=NULL; while(num = 0) //输入数组中元素的个数 { printf( please enter the number of elements:n ); scanf( %d ,&num); if(num 0) { break; } } if(NULL == (ar
[单片机]
ARM汇编指令集之八——移位指令(操作)
1、LSL(或ASL)操作 LSL(或ASL)操作的格式为: 通用寄存器,LSL(或ASL) 操作数 LSL(或ASL)可完成对通用寄存器中的内容进行逻辑(或算术)的左移操作,按操作数所指定的数量向左移位,低位用零来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。 操作示例 MOV R0, R1, LSL#2 ;将R1中的内容左移两位后传送到R0中。 2、LSR操作 LSR操作的格式为: 通用寄存器,LSR 操作数 LSR可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用零来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。 操作示例
[单片机]
ARM菜鸟成长记——之一
从开始搞ARM到现在将近半年多了,第一个项目搞得有些眉目了,终于感觉像是入门了,半年来,有开始的新鲜,中间的苦闷,到最后的欣喜。其中过程可谓曲折离奇,遇到了很到前人没有遇到过的疑难杂症,当然很多时候是因为我的粗心酿成的。曾经也有过放弃的念头,那个焦虑,像得了狂躁症一样。后来下定决心即使绩效没了,工作丢了也要搞完它。其实在这个过程中,看到跟我一样的很多新人在论坛上发帖求助,可是很多时候回者寥寥无几,可能问题太幼稚,也可能问题描述的不清楚。我发过很多帖子,甚至直接骚扰了网上很多的牛人,他们都给了我很大的帮助,但是我当时的想法太简单了,总想着某个牛人能够解决掉这个问题,现在想想,即使是牛人,没有看到具体的问题也很难给你一个解决方法,遇到困
[单片机]
汉王电纸书E920亮相南国书香节
八月羊城飘书香。2011年南国书香节暨羊城书展于8月19日在广州拉开帷幕。本届书展首设“图书馆+书房”展会,数字出版依然成为看点。在展会上,国内电子阅读器领军企业汉王科技推出了搭载全新技术的大屏电纸书E920,这也是该产品首次与广东用户正式见面。 汉王科技电纸书产品展台 汉王电纸书产品展示 据悉,这款9.7英寸大屏电纸书将主要面向行业市场,其屏幕尺寸与实体书籍版面更加接近,可以让读者完整浏览专业书籍;珍珠屏的材质让电纸书更白,200dpi图像显示效果,优于目前国外市场主流机型的150dpi,让图像表现得更加细腻;ARM Cortex的CPU处理器,则让开关机时间、图片旋屏速度,以及文件传输速度均超越国外主流机型。此外
[手机便携]
汉王电纸书E920亮相南国书香节
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved