第一类 汇编中的常数

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

ARM汇编指令_u-boot相关推荐

  1. ARM汇编指令调试方法

    学习ARM汇编时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在 ...

  2. ida pro 反汇编 Android so 库后修改 arm 汇编指令的方法总结

    1 前言 最近博主在学习Android逆向的时候,参照吾爱破解论坛的<教我兄弟学Android逆向系列课程>学习的时候,学到第8章<教我兄弟学Android逆向08 IDA爆破签名验 ...

  3. arm汇编指令详细整理及实例详解

    目录 一.简介 二.ARM 汇编指令说明 2.1 32位数据操作指令 2.2 32位存储器数据传送指令 2.3 32位转移指令 2.4 其它32位指令 三.实例讲解 3.1 MRS 3.2 MSR 3 ...

  4. 1.15.ARM汇编指令3之逻辑指令

    ARM汇编指令之逻辑指令:and & orr & eor & bic * and 逻辑与操作指令,将operand2的值与寄存器Rn的值按位逻辑与操作,结果保存到Rd中. 指令 ...

  5. arm汇编指令——分析问题的利器

    文章目录 arm汇编指令为什么重要 1. 主导问题 2. arm汇编指令分类介绍 通用寄存器 状态寄存器 数据转移指令 寻址格式 运算指令 比较指令 跳转指令 3. 反汇编接口 4. 反汇编分析举例 ...

  6. ARM汇编指令学习---基于启动文件startup.S分析

    本文主要是基于启动文件startup.s对ARM汇编指令进行学习分析. 以 . 开头一般是伪汇编/操作指令,形如: .section伪操作来定义一个段,形如: .section .testsectio ...

  7. ARM 汇编指令 MOV32用法

    前言 移植基于ARM平台的RTOS时,需要掌握一些基本的汇编指令,只有熟悉了这些ARM 的汇编指令,才能真正的掌握RTOS的移植方法 MOV32 指令,字面意思是 MOVE 一个 32位 值的意思,具 ...

  8. 嵌入式工程师到底要不要学习ARM汇编指令?arm学习文章汇总

    嵌入式工程师到底要不要学习ARM汇编指令? 网上搜索这个问题,答案很多,大部分的建议是不要学汇编,只要学C语言. 而一口君作为一个十几年经验的驱动工程师,个人认为,汇编语言还是需要掌握的,想要搞精.搞 ...

  9. 常用的ARM汇编指令总结

    第一次写博客,请各路大神多多关照. 本人从事软件开发相关的工作,平时主要用c语言撸代码,前段时间因工作需要,接触到了ARM架构下的汇编指令,之前学过51单片机的汇编指令,早已经还给老师了,且ARM汇编 ...

  10. ARM 汇编指令对应的机器码和条件码

    一.ARM 汇编指令对应的机器码 二.条件码

最新文章

  1. 麦芒8能安装鸿蒙系统吗,首颗5G基带芯片麦芒8发布鸿蒙最新进展
  2. Django之路由系统
  3. JS 时间转化为几分钟前 几小时前 几天前
  4. 一文搞懂RSA算法原理及简单实现
  5. OpenStack(二)——Keystone组件
  6. 面试官 | 讲一下如何给高并发系统做限流?
  7. 关于记录每天”要完成的事项“和”未完成事项“,(尤其是周末时,对未完成事项的记录一定要全)-----工作方式
  8. 2019年浙大计算机专业前景,2019年浙大计算机专业一志愿录取.pdf
  9. [渝粤教育] 西南科技大学 单片机原理与应用 在线考试复习资料
  10. 21日请假一天陪妈妈去国博
  11. 关于分布函数连续性的运用
  12. python matplotlib pColor 网格线 消除
  13. You should consider either expiring and/or testing connection validity before use in your applicat
  14. Visio--用例图、类图、顺序图、活动图
  15. HNUST 计算机组成原理课设
  16. mysql 从data文件恢复数据库
  17. Linux系统网络服务——安全与防火墙笔记
  18. 如何辨别真假IPHONE4 , IPHONE 4S ?
  19. TFS二次开发系列:七、TFS二次开发的数据统计以PBI、Bug、Sprint等为例(一)
  20. WeTool 必须死(含最新动态)

热门文章

  1. 2023 苹果cms v10酷黑渐变自适应视频模板
  2. 回归分析模型优劣判断
  3. Android 长时间 卡顿,安卓手机用的久了会卡顿?这几点才最有用!
  4. html+css复刻NIKE官网静态页面(一)
  5. python网址正则表达式_python正则表达式验证ipv6地址
  6. echart地图下钻上钻 地图分级 省市区
  7. 二元函数对xy同时求导_一个二元最值问题
  8. 潍坊美丽街景智慧公厕,诠释智慧城市的公共厕所如何建设 | 中期科技ZONTREE智慧公厕@快讯
  9. MFC消息处理时,双击鼠标左键响应单击左键消息的处理
  10. BAT 批处理脚本 教程(较全)