ARM汇编编程基础(三) -- ARM汇编伪操作

本文介绍了ARM汇编编程中的伪操作,包括AREA、ENTRY、CODE32等,通过实例解析了如何在汇编程序中使用伪操作,并探讨了其在程序流程控制中的作用,如死循环的实现。此外,还提到了常见的汇编伪操作,如GBLA、SETA、DCD等,以及条件编译和宏替换的概念。
摘要由CSDN通过智能技术生成


本系列文章节选自本人所著《深入浅出嵌入式底层软件开发》

本系列文章,所需代码请从以下地址下载:

http://download.csdn.net/download/scyangzhu/4602585


1.3.1 汇编伪操作在汇编程序中的使用范例

掌握了基本的ARM汇编指令后,要写出简单的ARM汇编程序,还必须要掌握基本的ARM汇编伪操作(directive)。现在我们来看一个简单的汇编程序,该程序调用子程序完成了加法操作。

1 ;文件名:TEST.S

2 ;功能:实现两个寄存器相加

3         AREA Example,CODE,READONLY ;声明代码段Example

4         ENTRY ;标识程序入口

5         CODE32 ;声明32位ARM指令

6 START  MOV R0,#0 ;设置参数

7         MOV R1,#10

8              BL  ADD_SUB;调用子程序ADD_SUB

9  LOOP        B LOOP ;跳转到LOOP

10 ADD_SUB

11        ADD R0,R0,R1 ;R0 = R0 + R1

12        MOV PC,LR ;子程序返回

13        END ;文件结束

第 6、7行将传递给子程序的参数存放在r0和r1中,第8行调用子程序。第11、12行是子程序的代码,完成了2个参数相加,并将结果放在r0后返回主程序。第6、9、10行的START、LOOP、ADD_SUB是标号,最经常用于跳转指令B和BL,由于汇编语法要求的缘故,标号必须顶格写(即:不能在行首有空格),否则编译器会报错。与之对应的是,汇编指令一定不能顶格写。

很明显分号(;)在汇编程序中是注释符号,相当于C语言的// 号。除此之外,当然大家注意到了第3、4、5、13行是我们没学习过的符号,其实它们就是本文的重点——ARM汇编伪操作。首先我先来解释这几个伪操作, 第3行定义了一个代码段。汇编伪操作AREA表示定义一个段,其段名为Example,CODE表明是代码段(而不是数据段),属性为只读(READONLY),从而表示第6——12行是程序代码(而不是程序数据)。第4行的ENTRY表示整个程序的入口点(即:程序运行的第一条指令。注1)是第6行的MOV指令。第5行的CODE32表示第6——12行的程序代码是ARM指令,而不是thumb指令。第13行的END表示源代码文件结束,其背后的含义就是:如果程序员在第13行后还写有汇编指令,编译器也根本不会理会这些代码,更不会去编译它们,当然这些代码也就不可能出现在最后的可执行文件中。哈哈,所以请务必记住,在END伪操作的后面再写代码,那是无用功,写了也白写。不要不以为然哟,根据经验,初学者总是会犯这样的错误。

特别说明:第9行的含义是要让程序在运行结束后,在第9行进行死循环,从而让整个程序定格在第9行。这一点也许你很困惑:在写应用程序时,程序结束就结束了,源代码根本不需要再去写个死循环。但你现在要弄清楚:你写应用程序时,有OS为你处理程序结束后的若干事情。可是,你现在已经得不到OS服务。如果你不自己写第9行的代码,那么当你认为程序已经运行结束(第8行执行完成)的时候,CPU不会聪明地停下来,它会继续任劳任怨地去取指第11行,继续运行,这不是你所希望的。其实这还不是最糟糕的,最糟糕的是,如果你的程序没有11-13行,那么CPU任劳任怨取出的指令其实是内存中的随机数,但CPU却会把它当作指令来执行,那么,你认为此时会出现什么情况呢?哈哈,只有天知道!

注1:ENTRY的本意并非如此,此处的含义仅是ENTRY的副作用而以。关于其本意,后续章节将予以解释。

1.3.2

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值