内容简介:ARM汇编语言的伪操作、宏指令和伪指令ARM汇编语言源程序中语句一般由指令、伪操作、宏指令和伪指令构成。其中,伪操作是指ARM汇编程序中的助记符,在源程序转变为汇编程序的时候被处理,而不是在计算机运行期间被程序执行;宏指令是一段独立的程序代码,通过伪操作进行定义,可以进行宏替换,其仅仅在调用时用宏体插入到源程序中;伪指令也是一种特殊的指令助记符,但是其不是在处理器运行期间由及其运行,而是在汇编时被转换为合适的机器指令替换为ARM或者Thumb指令,从而实现真正的指令操作。
编辑推荐: |
本文来自于CSDN,讲解了ARM汇编语言的伪操作、宏指令和伪指令,ARM汇编语言程序设计等。 |
ARM汇编语言的伪操作、宏指令和伪指令
ARM汇编语言源程序中语句一般由指令、伪操作、宏指令和伪指令构成。
其中,伪操作是指ARM汇编程序中的助记符,在源程序转变为汇编程序的时候被处理,而不是在计算机运行期间被程序执行;宏指令是一段独立的程序代码,通过伪操作进行定义,可以进行宏替换,其仅仅在调用时用宏体插入到源程序中;伪指令也是一种特殊的指令助记符,但是其不是在处理器运行期间由及其运行,而是在汇编时被转换为合适的机器指令替换为ARM或者Thumb指令,从而实现真正的指令操作。
ADS编译环境下的伪操作和伪指令
相关内容属于手册的部分,因此需要时查阅相关手册即可。
ARM伪指令
ARM伪指令是为了编程的方便而设计出来的一种指令,其可以在源程序进行汇编时将相关指令转变为等效的ARM指令。
ARM伪指令共有四条,分别为ADR伪指令、ADRL伪指令、LDR伪指令、NOP伪指令。
ADR伪指令
通常,编译器通过一条ADD指令或者SUB指令来实现ADR伪指令的功能。若不能够用一条指令实现,则产生错误,编译失败。
其格式大致与ADD指令或者是SUB指令相同。
ADRL伪指令
其与ADR最大的区别是ADRL有更大的地址读取能力。其他都是相似的。因此,一条ADRL指令可能需要多条SUB或者ADD指令才能完成。因为ARM指令的第二操作数的地址范围比ADRL取址范围小。
LDR伪指令
LDR伪指令用于加载32位的立即数或者一个地址到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替代为一条合适的指令。若加载的常数未超出MOV或者MVN的范围,则使用MOV或者MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池中读出常量。
与ARM指令的LDR相比,伪指令的LDR的参数中有=号存在。
NOP伪指令
NOP伪指令的重要功能是用于延时操作。其在汇编时被代替成ARM中的空操作。例如MOV R1,R1 等。
ARM汇编语言程序设计
ARM汇编中的文件格式
ARM程序源文件主要有三种格式,具体的情况说明如下:
ARM汇编语言语句格式
值得注意的是,ARM汇编语言中的最开头是符号,接着是指令|伪操作|伪指令,末尾处可以添加注释。
只要将任何指令放在开头,ARM汇编都会认为其为符号。
ARM汇编语言程序格式
ARM汇编语言是以段为单位进行源文件组织的。
段又分为数据段和代码段。其中数据段至少要有一个,代码段可以有非负的若干整数。
在源程序经过汇编处理后生成一个可执行的映像文件。其包含三个部分的内容:
一个或者多个代码段,其通常是只读的;
零个或者多个包含初始值的数据段,这些数据段通常是可读写的;
零个或者多个不包含初始值的数据段,这些数据段通常也是可以读写的,值得注意的是,这类数据在经过编译之后只会在内存中保留地址,而不会被存储数据等其他信息。
嵌入式 C语言 程序设计技巧
变量定义
在变量声明的时候,为了节省空间的需要,最好把所有相同类型的变量放在一起定义,同时这样可以优化存储器布局。
同时,值得注意的是,对于局部变量类型的定义,使用short或者char来定义变量并不总是比int节省空间。由于ARM执行的是32位的运算,因此有时int类型的变量声明更加具有优势。
变量定义时,从精简程序的角度,程序眼总是竭力避免使用冗余变量。但是有时使用冗余变量可以减少存储器访问的次数,从而提高系统的性能。
参数传递
为了使C语言程序和汇编程序能够相互调用,因此定义了统一的函数过程调用标准ATPCS。ATPCS定义了寄存器组中的{R0-R3}作为参数传递和结果返回寄存器,如果参数数目超过4个,则要使用堆栈的方式进行函数或者参数的传递。
循环条件
不同的循环条件,通过汇编执行时,即使完成的是相同的任务,有时也会有不同的系统性能表现。
C与汇编语言混合编程
寄存器的使用规则
在ATPCS标准之下,寄存器的使用遵循以下规则:
数据栈的使用规则
ATPCS规定数据栈均为FD(满递减)类型,并且对数据栈的操作是8字节对其的。此句话如何理解?
参数的使用规则
当参数不超过4个时,可以使用寄存器R0-R3进行参数传递;当参数超过4个时,剩余参数使用数据栈来传递参数。入栈的顺序和参数顺序相反,即最后一个字数据先入栈。
(为何说此处是参数个数可变的参数传递)
而之后的存在参数个数固定的子程序参数传递??
当结果为一个32位的整数时,可以通过寄存器R0返回;结果为一个64位整数时,可以通过寄存器R0和R1返回,因此类推。那么如果是一个160位数呢?当然,如果可能的话
C和ARM汇编程序间相互调用
在C和ARM汇编程序之间的相互调用必须遵守ATPCS规则。
此注意相互调用主要有三个方面的内容:
1. 汇编程序对C全局变量的访问;
2. 在C语言程序中调用汇编程序;
3. 在汇编语言中调用C语言程序;
汇编程序对C全局变量的访问
可以通过使用IMPORT关键词在汇编语言中对全局变量的调用进行声明。
在C语言程序中调用汇编程序
一切胜在不言中:
在汇编语言中调用C语言程序
需要在汇编语言调用该程序之前,在汇编语言程序中使用IMPORT伪操作来声明该C程序。同时,在汇编程序中通过BL指令来调用子程序。
基于ADS环境的软件开发实例
详情根据实际内容进行ADS环境之下的软件开发。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 毕业设计(1)基于MicroPython的大棚监测控制系统的程序设计与模型设计
- Go程序设计语言
- Java程序设计环境概述
- c++ 程序设计学习笔记
- JavaScript高级程序设计(4)
- JavaScript高级程序设计(3)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
jQuery 技术内幕
高云 / 机械工业出版社 / 2014-1-1 / 99元
本书首先通过“总体架构”梳理了各个模块的分类、功能和依赖关系,让大家对jQuery的工作原理有大致的印象;进而通过“构造 jQuery 对象”章节分析了构造函数 jQuery() 的各种用法和内部构造过程;接着详细分析了底层支持模块的源码实现,包括:选择器 Sizzle、异步队列 Deferred、数据缓存 Data、队列 Queue、浏览器功能测试 Support;最后详细分析了功能模块的源码实......一起来看看 《jQuery 技术内幕》 这本书的介绍吧!