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
推荐阅读最新更新时间: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指令是将数据从寄存器拷贝到内存.没有直接操作内存中数据的数
[单片机]
【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
[单片机]
韦东山ARM裸机学习笔记——代码重定位
前言 以下所写的内容都是基于韦东山JZ2440开发板的,更多内容可参考韦东山第一期ARM裸机视频代码重定位章节或韦东山S3c2440代码重定位详解学习。 一、什么是代码重定位? 代码重定位就是将代码的text段、rodata段、data段等从一个地址搬移到另外一个地址。本来程序烧写好之后是在某一个地址开始运行的,经过代码重定位之后,可以在另外一个地址运行。例如:程序烧写在Nor Flash上,本来是在Nor Flash上的0地址开始运行的,通过代码重定位,把数据段或整个程序搬移到SDRAM的0x30000000地址运行。 二、为什么要代码重定位? 1、程序烧写在Nand Flash上的情况 (1)Nand Flash
[单片机]
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处理器,则让开关机时间、图片旋屏速度,以及文件传输速度均超越国外主流机型。此外
[手机便携]