ARM汇编指令_u-boot

第一类 汇编中的常数

1)十进制数以非0数字开头,如:123和9876;
2)二进制数以0b开头,其中字母也可以为大写;
3)八进制数以0开始,如:0456,0123;
4)十六进制数以0x开头,如:0xabcd,0X123f;
5)字符串常量需要用引号括起来,中间也可以使用转义字符,如: “You are welcome!/n”;
6)当前地址以“.”表示,在汇编程序中可以使用这个符号代表当前指令的地址;
7)表达式:在汇编程序中的表达式可以使用常数或者数值, “-”表示取负数, “~”表示取补,“<>”表示不相等

第二类 汇编中的注释

1) @ 表示注释从当前位置到行尾的字符;
2) # 注释掉一整行;
3) ; 新行分隔符;

第三类 指令

MRS/MSR
MRS: 状态寄存器到通用寄存器的传送指令。
MSR: 通用寄存器到状态寄存器的传送指令。
BIC
BIC{条件}{S} 目的寄存器,操作数1,操作数2
BIC指令用于清除操作数1的某些位,并把结果放置到目的寄存器中。操作数1应是一个寄存器, 操作数2可以是一个寄存器、被移位的寄存器、或一个立即数。操作数2为32位的掩码,如果在掩码中置了某一位1,则清除这一位,未设置的掩码位保持不变。
举例:bic r0,r0,#0x1f => 0x1f=11111b
其含义:清除r0的bit[4:0]位。
ORR
ORR{条件}{S} 目的寄存器,操作数1,操作数2
ORR指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。操作数1应该是一 个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于设置操作数1的某些位。
举例:orr r0,r0,#0xd3
MCR/MRC
MCR指令将ARM处理器的寄存器中的数据传送到协处理器的寄存器中;
MRC指令将协处理器的寄存器中数值传送到ARM处理器的寄存器中;
MCR{<cond>} p15, 0, <Rd>, <CRn>, <CRm>{,<opcode_2>}
Rd不能为PC,当其为PC时,指令操作结果不可预知。
CRn作为目标寄存器的协处理器寄存器,其编号可能为C0,C1…C15。
CRm附加的目标寄存器或者原操作数寄存器,用于区分同一个编号的不同物理寄存器。当指令中不须要提供附加信息时,将C0指定为CRm,否则指令操作结果不可预知。
opcode_2提供附加信息,用于差别同一个编号的不同物理寄存器。当指令中指定附加信息时,省略opcode_2或者将其指定为0,否则指令操作结果不可预知。
LDR/STR
ARM是RISC结构,数据从内存(存储)到CPU(寄存器)之间的移动只能通过ldr/str指令来完成,注:X86中没有该条指令,用MOV就可以;
LDR r0, labelLDR r0, =label的区别:
LDR r0, =label 会把label表示的值加载到r0中,相当于直接赋值(绝对的地址,链接时决定);
LDR r0, label 会把label当做地址,把label指向的地址中的值加载到r0中,相当于指针操作;
STR R0,[R1],#8 将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1;
STR R0,[R1,#8] 将R0中的字数据写入以R1+8为地址的存储器中。
LDMIA/STMIA

ldmia   r0!, {r9-r10}           /* copy from source address [r0]    */
stmia   r1!, {r9-r10}           /* copy to   target address [r1]    */

多寄存器操作,“IA"每次传送后地址加4;”!":表示在操作结束后,将最后的地址写回Rn中。

ADR
adr r0, _start 得到的是_start的当前执行位置,由 pc+offset 决定的 得到有效地址
把_start的相对地址移到r0, 相对寻址以程序计数器PC 的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址,它是与位置无关的,主要看Boot在哪里运行,也就是PC指针在哪里 (假设_start偏移量为0);
例如这段代码在 0x02000000 (FLASH起始地址)运行,即此时PC=0x02000000,那么 adr r0, _start 得到 r0 = 0x02000000;如果在地址 0x81008000(Boot在RAM中加载地址)运行,即此时PC=0x81008000,那么r0就是 0x81008000 了。
MOV
只能在寄存器之间移动数据,或者把立即数移动到寄存器中,注:X86中可实现从存储到寄存器的数据转移;
BL
bl XXX 跳转执行XXX函数,并把"返回地址"(即下一条指令地址)保存在LR寄存器中;
B
B . " . “表示当前指令行(地址);” B ." 表示一直在当前指令处原地跳转,也就是死循环。
BX
BX{} <Rm> 跳转并切换指令集
当寄存器的bit[0]为0时,目标地址处的指令为ARM指令;当寄存器的bit[0]为1时,目标地址处的指令为Thumb指令;
ARM体系结构分为ARM状态和Thumb状态及Thumb-2状态。在ARM状态时执行32位长度的字对齐的ARM指令,Thumb状态时执行16位长度的半字对齐的Thumb指令。
ARM/Thumb状态切换是根据目标函数地址最后一位是否为0来进行判断,并用BX指令实现,程序状态切换可以用如下方式实现:
从ARM切换到Thumb:

LDR R0, =label + 1
BX R0

从Thumb切换到ARM:

LDR R0, = label
BX R0

上文中,label为符号的地址,因为字节对齐缘故,最后一位肯定为0。

BEQ
与条件判断(如cmp)搭配使用,若条件成立(CPSR寄存器的Z位),跳转到指定函数,执行完成后继续向下执行。

向前和向后跳转指令

1: ;A
cmp r0, #0
beq 1f ; r0==0那么向前跳转到B处执行
bne 1b ; 否则向后跳转到A处执行
1: ;B

PUSH/POP
PUSH {reglist[,LR]}
POP {reglist[,PC]
其中 reglist 入栈/出栈低寄存器列表,即R0~R7
LR 入栈时的可选寄存器;
PC 出栈时的可选寄存器;
寄存器入栈及出栈指令举例如下;
PUSH {R0-R7,LR} ;将低寄存器 R0~R7全部入栈,LR
也入栈;
POP {R0-R7,PC} ;将堆栈中的数据弹出到低寄存器 R0~R7及 PC中
nop
什么都不做,可以用作延时。

第四类 指令.XXX

.global
.global _start #定义 _start 为外部程序可以访问的标签

.text
代码段

.data
初始化数据段

.bss
未初始化数据段

.ascii
定义一个字符串,并为它分配空间

.quad
占八字节

.abort
停止汇编

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

.equ
.equ symbol, expression: 把某一个符号(symbol)定义成某一个值(expression),该指令并不分配空间,相当于C语言中的#define。例如 .equ aaa,0x20000000
.macro .endm .exitm
.macro: 定义一段宏代码,.macro表示代码的开始,.endm表示代码的结束,.exitm跳出宏。
.align
.align absexpr1,absexpr2
以某种对齐方式,在未使用的存储区域填充值. 第一个值表示对齐方式,4, 8,16或32. 第二个表达式值表示填充的值

.req
name .req register name: 为寄存器定义一个别名
.code
.code [16|32]: 指定指令代码产生的长度, 16表示Thumb指令, 32表示ARM指令

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

.weak
ARM示弱伪指令,声明其他的同名标号优先于该标号被引用,也就是说,如果有两个标号都是同一个名字,代码如下,那么第二个函数将被使用。

.weak func_a
FUNC func_a
END_FUNC func_a

.global func_a
FUNC func_a
END_FUNC func_a

.type

.type <name> STT_<TYPE_IN_UPPER_CASE>

STT_FUNC /function
Mark the symbol as being a function name.
STT_OBJEC /Tobject
Mark the symbol as being a data object.
STT_TLS /tls_object
Mark the symbol as being a thead-local data object.
STT_COMMON /common
Mark the symbol as being a common data object.

第五类 特殊

_start
汇编程序的缺省入口,但是可以更改,想要更改其他标志,到相应的链接脚本(.lds文件)中去用ENTRY指明其他入口标志。标号可以直接认为是地址
ENTRY() ENDPROC()
这两个宏定义在#include <linux/linkage.h>中;
ENTRY()展开后如下:

.globl  save_boot_params
.align  4
save_boot_params:
bx  lr

ENDPROC()展开后如下:
.type save_boot_params STT_FUNC; @查手册
.size save_boot_params, .-save_boot_params @查手册

attribute((noreturn))

https://www.cnblogs.com/sea-stream/p/11233641.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值