完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近跟着南方的视频开始学习嵌入式linux,只是毕业多年,在学校学的汇编语言早忘了,汇编语言这本书要是从头再看到尾估计是不可能的,那就复习下常用的ARM指令吧。为了养成良好的习惯和以后查找复习方便就做个笔记写下自己复习的东西,当然里面很多资料都是网上参考的,不过自己动手输入的,主要是加深印象,虽然这种方法不一定管用呵呵 常用ARM指令的功能介绍 1.汇编伪指令 (1) ENTRY ENTRY 伪指令用于指定汇编程序的入口点。在一个完成的汇编程序中至少要有一个ENTRY,但在一个源文件里最多只能有一个ENTRY(也可以没有)。 (2) AREA 语法格式: AREA 段名 属性1,属性2 AREA伪指令用于定义一个代码段或数据段。其中,段名若以数字开头,则该段名 需要”|”括起来i,如|1_test|。 属性字段表示代码段(或数据段)的相关属性,多个属性用逗号分隔。常用的属性如下: >> CODE属性,用于定义代码段,默认为READONLY。 >> DATA属性,用于定义数据段,默认为READWRITE。 >> READONLY属性,指定本段只读,代码段默认为READONLY。 除了上面的属性,还有ALIGN属性和COMMON属性。 (3) EQU EQU伪指令用于为程序中的常量,标号等定义一个等效的字符名称,类似于C语言中的#define。其中EQU可用“*”代替。 语法格式: 名称 EQU 表达式{,类型} (4) END END伪指令用于通知编译器已经到了源程序的结尾。 2.加载/存储指令 ARM微处理器支持加载/存储指令,用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。常用的加载存储器指令有字数据加载指令LDR、字节数据加载指令LDRB、半字数据加载指令LDRH、字数据存储指令STR、字节数据存储指令STRB及半字数据存储指令STRH。 试验中主要用到了LDR和STR指令,下面将介绍两条指令的用法(其他指令的用法可度娘看下) (1) LDR指令 LDR指令的格式为: LDR{条件} 目的寄存器,<存储器地址> LDR指令用于从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。该指令在程序中比较常用,且殉职方式灵活多样。例如、
复制代码 (2) STR指令 STR指令的格式为: STR{条件} 源寄存器,<存储器地址> STR指令用于从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常用,且寻址方式灵活多样,使用方式可以参考LDR。例如: LED实验中的一段代码
复制代码 3.数据处理指令 数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。数据传送指令用于在寄存器和存储器之间进行数据的双向传输。算术逻辑运算指令完成常用的算术与逻辑运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中的相应条件标志位。比较指令不保存运算结果,只更新CPSR中对于得条件标志位。 (1) MOV指令 MOV指令的格式为: MOV{条件}{S} 目的寄存器,源操作数 MOV指令可完成从另外一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。其中S选项决定指令的操作是否影响CPSR中条件标志位的值,当没有S时,指令不更新CPSR中条件标志位的值。例如: MOV PC,LR //将寄存器LR的数据传送到PC(R15)寄存器中 (2) CMP指令 CMP{条件} 操作数1,操作数2 CMP指令用于吧一个寄存器的内容和另外一个寄存器的内容或立即数进行比较,同时更新CPSR中条件标志位的值。该指令进行一次减法运算,但不存储结果,只更改条件标志位。标志位表示的数是操作数1与操作数2的关系(大、小、想等)。例如,当操作数1大于操作数2,则此后又GT后缀的指令将可以执行。例如 SDRAM实验中的代码 //39行
复制代码 (3) 跳转指令 跳转指令用于实现持续流程的跳转,在ARM程序中有两种方法可以实现程序流程的跳转: >>使用专门的跳转指令。 >>直接向程序计数器PC写入跳转地址值 通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间任意跳转,在跳转之前结合使用。“MOV LR,PC” 等类似指令可以保存将来的返回地址,从而实现在4GB连续的线性地址空间的子字程序调用。ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB地址空间的跳转,包括以下4条指令: B 跳转指令; BL 带返回的跳转指令; BLX 带返回和状态切换的跳转指令; BX 带状态切换的跳转指令。 1) B指令 B指令是最简单的跳转指令。一旦遇到一个B指令,ARM处理器将立即跳转到给定的目标地址,从那里继续执行。注意,存储在跳转指令中的实际值是相对当前PC值得一个偏移量,而不是一个绝对地址,它的指由汇编器来计算(参考寻址方式中的相对寻址)。它是24位有符号数,左移两位后又符号扩展为32位,表示的有效偏移为26位(前32MB的地址空间)。例如:
复制代码 2) BL指令 BL指令的格式为: BL{条件} 目标地址 BL是另外一个跳转指令,但跳转之前,会在寄存器R14种保存PC的当前内容,因此,可以通过R14的内容重新加载到PC中来返回到跳转指令之后的那个指令处执行。该指令的实现程子程序条用的一个基本但常用的手段。例如:
复制代码 具体实例(在JZ2440开发板SDRAM实验中的head.S代码)
复制代码 后续再做个汇编与C语言的混合编程笔记 |
|
相关推荐
7个回答
|
|
:D好帖好帖
|
|
|
|
|
|
|
|
不错,支持
|
|
|
|
精华!
|
|
|
|
learing```
|
|
|
|
如何把任意一个数写入寄存器啊
|
|
|
|
mov指令传输256以大小的数据,大于256咋办了啊
|
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2156 浏览 6 评论
1962 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4520 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 21:27 , Processed in 0.654285 second(s), Total 88, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号