历史上的今天
返回首页

历史上的今天

今天是:2025年04月15日(星期二)

正在发生

2018年04月15日 | ARM 汇编 伪指令 MACRO及MEND

2018-04-15 来源:eefocus

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处执行


推荐阅读

史海拾趣

CTC Coils Ltd公司的发展小趣事

随着国内市场的逐渐饱和,CTC Coils Ltd公司开始将目光投向海外市场。公司首先在欧洲设立了销售分支机构,通过参加国际电子展会、与当地企业建立合作关系等方式,逐步打开了欧洲市场。随后,公司又进一步拓展到北美和亚洲其他地区,实现了业务的国际化布局。

Cadeka公司的发展小趣事

在竞争激烈的电子行业中,Cadeka公司为了增强自身实力,积极寻求并购与整合的机会。公司先后收购了几家具有技术优势和市场份额的小型电子企业,通过整合资源和技术,实现了优势互补和协同效应。这些并购不仅提升了Cadeka公司的技术实力和市场地位,还为公司带来了更多的发展机遇。

Cree(科瑞)公司的发展小趣事

随着全球LED市场的日益成熟,竞争也日趋激烈。面对这一形势,Cree通过收购和出售的方式,逐渐调整了其在LED市场的主要业务。这一战略调整使得Cree能够专注于更高端、更具技术含量的LED产品研发和生产,从而保持了其在行业内的领先地位。

DIALIGHT公司的发展小趣事

DIALIGHT公司的故事始于1938年的纽约布鲁克林,当时该公司专注于为飞机生产仪表板灯。随着技术的不断进步和市场的变化,公司在1971年,即LED推出仅一年后,推出了他们的第一个LED产品。这一举措标志着DIALIGHT正式从传统的飞机仪表板灯制造转向LED照明技术的研发和应用。从此,DIALIGHT彻底改变了LED的用途,将其广泛应用于世界各地的交通控制、指示灯、结构塔和工业场所,为全球提供了优质的照明解决方案。

Amplitronix LLC公司的发展小趣事

随着公司的发展,Amplitronix LLC逐渐在电子测量仪器领域站稳脚跟。然而,他们并没有满足于现状,而是继续投入研发,寻求技术突破。经过数年的努力,公司成功开发出一种具有颠覆性的新技术,显著提高了测量仪器的精度和稳定性。这一技术突破为公司赢得了更多的客户和市场份额,也为公司的未来发展奠定了坚实的基础。

Chino-Excel公司的发展小趣事

在发展过程中,Chino-Excel公司注重品牌建设和市场推广。公司投入大量资金进行品牌宣传和推广活动,提升品牌知名度和美誉度。同时,公司积极参加国际电子展会和行业交流活动,与国内外客户建立广泛的联系和合作,为公司的快速发展奠定了坚实基础。

问答坊 | AI 解惑

网络数字监控

一、概述 利用信息技术将视频与远程监控的功能,借由无所不再的互联网来实现,已成为当今安防市场经济激活的一支奇兵。其中网络摄像机与相关应用软件是此数字化监控领域重要一环。 网络摄像机的应用范围相当广泛,已逐渐成为安全防范、远程教学 ...…

查看全部问答>

C51使用技巧及实战.rar

C51使用技巧及实战.rar…

查看全部问答>

FPGA问题集锦, 基于FPGA的以太网控制器设计

上传个资料看看啥感觉 [ 本帖最后由 yuanhang8240 于 2009-4-28 07:56 编辑 ]…

查看全部问答>

哪种正弦波电路最为稳定可靠?

我用运放搭了个文氏电桥正弦波发生电路,结果不理想,电压稍一动,频率,波形就会变化,将电桥上的电阻反复调整,结果是尽是显示梯形波,形成正弦波的工作点很窄,而且表现不稳定,请有经验的大侠指点一下:哪种正弦波电路最为稳定可靠?…

查看全部问答>

各种电路图,够大家好好学了

各种电路图,够大家好好学了,下了就知道是好东西啊…

查看全部问答>

电子信息工程的女生该选择什么样的发展方向

   我是电子信息工程的在校大三女生,我想请教一下各位,我们这个专业的女生应该选择怎样的发展方向,或深入学些什么知识,明年毕业才能找到较理想的工作?本人的动手能力和编程能力都很一般,没有深入学习。有人提议我选择单片机,但是 ...…

查看全部问答>

纳米测量中屏蔽罩的重要作用

电缆的不当使用会造成测量时间过长的问题。共轴电缆提供了一个传输信号的内导体和屏蔽。内导体和屏蔽之间存在着可供漏电流流过的旁路电阻和电容通路[1](图4)。除了作为漏电流的通路之外,旁路的R和C还构成了一个RC电路,该电路将大大放慢弱电流 ...…

查看全部问答>

MSP430G2553的硬件IIC读写数据代码

哪位好心人能够发个MSP430G2553的硬件IIC的读写数据代码,我搞了好久了,时钟出不来呀,求救呀…

查看全部问答>