ARM 汇编伪指令宏的用法详解(MACRO-MEND)_arm汇编macro-程序员宅基地

技术标签: 汇编  编译器  delay  service  存储  arm  

宏是一段独立的程序代码,它是通过伪指令定义的,在程序中使用宏指令即可调用宏。当程序被汇编时,汇编程序将对每个调
用进行展开,用宏定义取代源程序中的宏指令。
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
在程序段中的使用:(使用两次)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/coder9999/article/details/7603688

智能推荐

标准对话框和文件对话框_标准 dialog-程序员宅基地

文章浏览阅读114次。代码实例#include "modaldialog.h"#include <QMenuBar>#include <QMenu>#include <QAction>#include <QDialog>#include <QDebug>#include <QMessageBox>#include <QFile..._标准 dialog

Apache Druid 在 Shopee 的工程实践_窗口函数 apache druid-程序员宅基地

文章浏览阅读805次。本文首发于微信公众号“Shopee技术团队”。摘要Apache Druid 是一款高性能的开源时序数据库,它适用于交互式体验的低延时查询分析场景。本文将主要分享 Apache Druid 在支撑 Shopee 相关核心业务 OLAP 实时分析方面的工程实践。随着 Shopee 业务不断发展,越来越多的相关核心业务愈加依赖基于 Druid 集群的 OLAP 实时分析服务,越来越严苛的应用场景使得我们开始遇到开源项目 Apache Druid 的各种性能瓶颈。我们通过分析研读核心源码,对出现性能瓶._窗口函数 apache druid

贪心算法-背包问题(python实现)_背包问题贪心算法python-程序员宅基地

文章浏览阅读3.2k次,点赞2次,收藏18次。贪心算法-背包问题⼀个⼩偷在某个商店发现有n个商品,第i个商品价值vi元,重wi千克。他希望拿⾛的价值尽量⾼,但他的背包最多只能容纳W千克的东⻄。他应该拿⾛哪些商品?0-1背包:对于⼀个商品,⼩偷要么把它完整拿⾛,要么留下。不能只拿⾛⼀部分,或把⼀个商品拿⾛多次。(商品为⾦条)分数背包:对于⼀个商品,⼩偷可以拿⾛其中任意⼀部分。(商品为⾦砂)举例:商品1:v1=60 w1=10商品2:v2=100 w2=20商品3:v3=120 w3=30背包容量:W=50 goods = [(6_背包问题贪心算法python

基于格拉姆角场GAF结合卷积神经网络的故障诊断附matlab代码 2023新算法,直接写!-程序员宅基地

文章浏览阅读720次,点赞13次,收藏8次。多输入单输出 (MISO) 预测在许多实际应用中至关重要,例如故障诊断、异常检测和预测性维护。本文提出了一种基于格拉姆角场 (GAF) 和卷积神经网络 (CNN) 的 MISO 预测方法。GAF 用于提取输入数据中的局部特征,而 CNN 用于学习这些特征之间的关系并生成预测。该方法在故障诊断任务上进行了评估,实验结果表明其具有良好的预测精度和鲁棒性。引言MISO 预测是指基于多个输入变量预测单个输出变量的任务。它在许多领域都有着广泛的应用,例如故障诊断、异常检测和预测性维护。

字符串的重复判断_文本字符串重复识别多少位-程序员宅基地

文章浏览阅读556次。刚才无意间看到一个数学题目,六位数能被9整除,且各个数字不相同,求最大的六位数减最小六位的数。看到这种题目我想都没想就直接打开了vs,中途遇到了一个问题就是不能有重复的数字,我就用itoa函数将数字转换成字符串然后再判断:bool Check_2(char* str){if (*str == 0) return false;for (char* p = str; *p != 0; p++){ for (char* q = p + 1; *q != 0; q++) { if (*p == *_文本字符串重复识别多少位

机载点云单木分割方法和实现过程的概括介绍(论文赏析)-程序员宅基地

文章浏览阅读3.4k次。这里写目录标题主流方法图简单说明主流方法图简单说明从数据组织方法上看,主要有两种,一种是基于CHM,一种是直接基于点云。CHM实际上就是归一化的数字表面模型nDSM,实现方法为,建立二维规则格网,将点云投影到格网中,格网值为内部点云的最低点高程,格网中无点时,进行插值,即将邻近格网值赋予该无点格网,得到DEM,同理将最低点高程改为最高点高程得到DSM,二者做差即可得到CHM。a\ 分水岭方法在opencv库以及matlab中都可以直接调用分水岭函数来实现,关键在于如果在对应分割区域构建标记,来_单木分割

随便推点

Spark笔记7之广播变量累加器_sparkfan 7-程序员宅基地

文章浏览阅读128次。参考:共享变量通常情况下,一个传递给 Spark 操作(例如 map 或 reduce)的函数 func 是在远程的集群节点上执行的。该函数 func 在多个节点执行过程中使用的变量,是同一个变量的多个副本。这些变量的以副本的方式拷贝到每个机器上,并且各个远程机器上变量的更新并不会传播回 driver program(驱动程序)。通用且支持 read-write(读-写) 的共享变量在任务..._sparkfan 7

Linux音频设备驱动-3_static int wm8904_adc_osr_put(struct snd_kcontrol -程序员宅基地

文章浏览阅读600次。4、put()函数put()用于从用户空间写入值,如果值被改变,该函数返回1,否则返回0;如果发生错误,该函数返回1个错误码。代码清单17.22给出了1个put()函数的范例。代码清单17.22 snd_ctl_elem_info结构体中put()函数范例1 static int snd_xxxctl_put(struct snd_kcontrol *kcontrol, struct_static int wm8904_adc_osr_put(struct snd_kcontrol *kcontrol, struct snd_ctl_

IPtables中SNAT、DNAT和MASQUERADE的含义_通信中的masque是什么-程序员宅基地

文章浏览阅读475次。IPtables中可以灵活的做各种网络地址转换(NAT),网络地址转换主要有两种:SNAT和DNAT。SNAT是source networkaddress translation的缩写,即源地址目标转换。比如,多个PC机使用ADSL路由器共享上网,每个PC机都配置了内网IP,PC机访问外部网络的时候,路由器将数据包的报头中的源地址替换成路由器的ip,当外部网络的服务器比如网站web服务器接_通信中的masque是什么

Python-Django毕业设计基于的开放式实验室预约系统(程序+Lw)_基于python的实验室预约管理系统-程序员宅基地

文章浏览阅读184次。该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程项目运行环境配置:Pychram社区版+ python3.7.7 + Mysql5.7 + HBuilderX+list pip+Navicat11+Django+nodejs。项目技术:django + python+ Vue 等等组成,B/S模式 +pychram管理等等。环境需要1.运行环境:最好是python3.7.7,我们在这个版本上开发的。其他版本理论上也可以。2.pycharm环境:pycharm都可以。_基于python的实验室预约管理系统

Java - 使用Cipher类实现加密(RSA)_cipher cipher = cipher.getinstance("rsa");-程序员宅基地

文章浏览阅读4.6k次,点赞2次,收藏4次。无_cipher cipher = cipher.getinstance("rsa");

分布式mapreduce开发的过程_static class wordcountmap extends mapper<longwrita-程序员宅基地

文章浏览阅读156次。分布式开发过程:1:创建一个maven project项目: 2:在pom.xml中导入依赖jar包:(这个jar包根据自己的是使用的hadoop版本去选择)&lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;org.apache.hadoop&lt;/groupId&gt; &lt;artifac..._static class wordcountmap extends mapper

推荐文章

热门文章

相关标签