ARM常用汇编指令_gcc arm 汇编 定义4字节空间(1)

4.“.abort”

停止汇编

5.“.align”

.align absexpr1,absexpr2

以某种对齐方式,在未使用的存储区域填充值. 第一个值表示对齐方式,4, 8,16或32. 第二个表达式值表示填充的值

6.“.if .else .endif”

.if

.else

.endif:支持条件预编译

7.“.include”

.include “file”:包含指定的头文件, 可以把一个汇编常量定义放在头文件中

8.“.comm”

.comm  symbol, length:

在bss段申请一段命名空间,该段空间的名称叫symbol, 长度为length. Ld连接器在连接会为它留出空间

9.“.equ”

.equ symbol, expression: 把某一个符号(symbol)定义成某一个值(expression).该指令并不分配空间,相当于c语言中的#define。例如

.equ aaa,0x20000000

10.“.macro .endm”

.macro: 定义一段宏代码,.macro表示代码的开始,.endm表示代码的结束,.exitm跳出宏, 示例如下:

.macro SHIFTLEFT a, b.if \b < 0

mov \a, \a, ASR #-\b

.exitm

.endif

mov \a, \a, LSL #\b

.endm

11.“.req”

name .req register name: 为寄存器定义一个别名

12.“.code”

.code [16|32]: 指定指令代码产生的长度, 16表示Thumb指令, 32表示ARM指令

13.“.ltorg”

.ltorg: 表示当前往下的定义在归于当前段,并为之分配空间

二.带下滑线的

1._start

汇编程序的缺省入口,但是可以更改,想要更改其他标志,到相应的链接脚本中去用ENTRY指明其他入口标志。标号可以直接认为是地址。

三.不带点的

1.mov–数据传送指令

它的传送指令只能是把一个寄存器的值(要能用立即数表示)赋给另一个寄存器,或者将一个常量赋给寄存器,将后边的量赋给前边的量,比如

mov r1,r2

mov r1,#4096

这个立即数是小于0xff(65535)的数,如果大于65535,则用ldr指令赋值

2.b、bl–相对跳转指令

b只是跳转,而bl除跳转外还将返回地址(bl的下一条指令的地址)保存到lr寄存器中。其中跳转范围是当前指令的前后32M。

3.ldr、str–内存访问指令

ldr指令即可能是大范围的地址读取伪指令,也可能是内存访问指令,当它的第二个参数之前有“=”时,表示伪指令,否则是内存访问指令,比如

ldr r0, =0x53000000//r0=0x53000000

str r1, [r2, #4]         // 将r1的数据保存到地址为r2+4的内存单元中

str r1, [r2]                // 将r1的数据保存到地址为r2的内存单元中

str r1, [r2], #4         // 将r1的数据保存到地址为r2的内存单元中,然后r2=r2+4

ldr r1, [r2,#4]         // 将地址为r2+4的内存单元数据读取到r1中

ldr r1, [r2]             // 将地址为r2的内存单元数据读取到r1中

ldr r1, [r2], #4         // 将地址为r2的内存单元数据读取到r1中,然后r2=r2+4

作为变址方式有如下分类:

当ldr作为大范围地址读取伪指令,LDR伪指令用于加载32们的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或者MVN的范围,刚使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入字池,并使用一 条程序相对偏移的LDR指令从文字池读出常量。

作为寄存器的寻址,寄存器的间接寻址的3种方式

4.adr–小范围的地址读取(只有两个参数)

ADR指令将基于PC相对偏移的地址值读取到寄存器中,在编译源程序时ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,刚产生错误,编译失败。比如

**adr r0, delay//将标号delay的地址赋给r0**

5.ldmia–多寄存器寻址

一条指令可以完成多个寄存器值的传递,可以完成最多16个通用寄存器值的传递。比如

ldmia r0, [r1, r2, r3, r4]

;r1 <- [r0]

;r2 <- [r0+4]

;r3 <- [r0+4*2]

;r4 <- [r0+4*3]

6.nop–空操作指令

什么都不做,可以用作延时。

7.add,sub–加法减法指令

共三个参数,将后边的两个参数操作并赋给第一个参数,比如

add r1, r1, r0//r1=r1+r0

sub r1, r1, r2//r1=r1-r2

//这两句的结果就是r1=r1+r0-r2

8.asr,lsl,lsr,ror,rrx,type rs

对于arm指令的基本格式如下:

对于operand2参数,如果能灵活使用,代码效率会很高。

桶型一位寄存器操作

9.cmp–比较指令

cspr

10.eq,ne,ce等–指令的条件域

所有的ARM指令都可以条件执行:指令的执行与否取决于CPSR寄存器的N,Z,CandV

每一条ARM指令包含4位的条件码位于指令的最高4位[31:28],条件码共16种,每个条件码可以用2个字符表示,这两个字符可以添加在指令助记符的后边和指令同时使用。

指令最高4位代表的条件域如下表

条件码助记符后缀标志含义
0000EQZ置位相等
0001NEZ清零不相等
0010CSC置位无符号数大于或等于
0011CCC清零无符号数小于
0100MIN置位负数
0101PLN清零正数或零
0110VSV置位溢出
0111VCV清零未溢出
1000HIC置位Z清零无符号数大于
1001LSC清零Z置位无符号数小于或等于
1010GEN等于V带符号数大于或等于
1011LTN不等于V带符号数小于
1100GTZ清零且(N等于V)带符号数大于
1101LEZ置位或(N不等于V)带符号数小于或等于
1110AL忽略无条件执行

例如

cmp r0, r1

beq func//如果r1==r0,则跳转到func标志地址上去

cmp r0, r1

beq func//如果r1!=r0,则跳转到func标志地址上去

11.R13,R14寄存器–sp,lr

sp是堆栈指针,lr是链接地址寄存器。R13作为sp,R14作为lr。
对于链接地址寄存器,它的作用有两个:

【1】当使用bl指令调用子程序时,系统会自动将 bl指令的下一条指令的地址存入lr中。

执行过程如下图

①,程序A正常执行到BL Lable然后转到程序B中去
②,系统将BL Lable的下一句NEXT的地址放到LR中去
③,执行完B的程序后,执行一个MOV PC,LR将NEXT的地址给到当前pc值
④,继续执行程序A下面的语句

【2】当发生异常时,系统自动将异常的返回地址放入R14中(有些异常有一个小的固定的偏移量)。

12.逻辑运算指令–

;按位与

AND Rd, Rn                                 ; Rd &= Rn

AND.W Rd, Rn, #imm12           ; Rd = Rn & imm12

AND.W Rd, Rm, Rn                    ; Rd = Rm & Rn

;按位或

ORR Rd, Rn                                  ; Rd |= Rn

ORR.W Rd, Rn, #imm12            ; Rd = Rn | imm12

ORR.W Rd, Rm, Rn                     ; Rd = Rm | Rn

;按位清零

BIC Rd, Rn                                    ; Rd &= ~Rn

BIC.W Rd, Rn, #imm12             ; Rd = Rn & ~imm12

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

成体系的自学效果低效漫长且无助。**

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-MnhFD4rZ-1715539883713)]

[外链图片转存中…(img-V9kmWTfE-1715539883714)]

[外链图片转存中…(img-K1fLpBYp-1715539883714)]

[外链图片转存中…(img-OlxfFYqP-1715539883715)]

[外链图片转存中…(img-tAOgJKEn-1715539883715)]

[外链图片转存中…(img-rRxxQdkn-1715539883716)]

[外链图片转存中…(img-CXYgfGon-1715539883716)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

  • 29
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值