历史上的今天
返回首页

历史上的今天

今天是:2025年01月11日(星期六)

2020年01月11日 | ARM-汇编指令集(总结)

2020-01-11 来源:eefocus

ARM汇编指令集

指令、伪指令

(汇编)指令:   是机器码的助记符,经过汇编器编译后,由CPU执行。 

(汇编)伪指令:用来指导指令执行,是汇编器的产物,最终不会生成机器码。


有两种不同风格的ARM指令

1).ARM官方的ARM汇编风格:指令一般用大写,Windows中的IDE开发环境。

2).GNU风格的ARM汇编:指令一般用小写。


ARM汇编的特点

1. LDR/STR架构

1).ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中内容加载入CPU中通用寄存器中才能被CPU处理。
2).ldr(load register)指令将内存内容加载入通用寄存器。
3).str(store register)指令将寄存器内容存入内存空间中。
4).ldr/str组合用来实现 ARM CPU和内存数据交换。

2. 至此8种寻址方式

1).寄存器寻址mov r1, r2。
2).立即(立即数)寻址 mov r0, #0xFF00。
3).寄存器移位寻址 mov r0, r1, lsl #3。
4).寄存器间接寻址 ldr r1, [r2] 表示内存,内存地址存在r2这个寄存器中,把内存地址里的值给r1。

5).基址变址寻址ldr r1, [r2, #4]内存地址在r2+4里面。

6).多寄存器寻址 ldmia r1!, {r2-r7, r12}一次访问多个寄存器。
7).堆栈寻址 stmfd sp!, {r2-r7, lr}。
8).相对寻址      beq flag。

3. 指令后缀

同一指令经常附带不同后缀,变成不同的指令。经常使用的后缀有:
B(byte)功能不变,操作长度变为8位
H(half word)功能不变,长度变为16位
S(signed)功能不变,操作数变为有符号
如 ldr ldrb ldrh ldrsb ldrsh
S(S标志)功能不变,影响CPSR标志位
如 mov和movs movs r0, #0

4. 条件执行后缀

条件后缀是否成立取决于当前代码的前面的代码。

条件后缀只影响当前代码的执行。

5. 多级指令流水线

为增加处理器指令流的速度,ARM使用多级流水线.,下图为3级流水线工作原理示意图。(S5PV210使用13级流水线,ARM11为8级)
允许多个操作同时处理,而非顺序执行。

1).PC指向正被取指的指令,而非正在执行的指令


数据传输与跳转指令详解

1. 数据处理指令

数据传输指令 mov mvn
算术指令 add sub rsb adc sbc rsc 
逻辑指令 and orr eor bic
比较指令 cmp cmn tst teq
乘法指令 mvl mla umull umlal smull smlal
前导零计数 clz


2. cpsr访问指令

mrs & msr
mrs用来读psr,msr用来写psr
CPSR寄存器比较特殊,需要专门的指令访问,这就是mrs和msr。

3. 跳转(分支)指令

b & bl & bx
b 直接跳转(就没打开算返回)
bl branch and link,跳转前把返回地址放入lr中,以便返回,以便用于函数调用
bx跳转同时切换到ARM模式,一般用于异常处理的跳转。

4. 访存指令

ldr/str & ldm/stm & swp
单个字/半字/字节访问 ldr/str
多字批量访问  ldm/stm
swp r1, r2, [r0]
swp r1, r1, [r0]

5. 软中断指令

swi(software interrupt)
软中断指令用来实现OS中系统调用

ARM汇编中的立即数

合法立即数与非法立即数
ARM指令都是32位,除了指令标记和操作标记外,本身只能附带很少位数的立即数。因此立即数有合法和非法之分。
合法立即数:经过任意位数的移位后非零部分可以用8位表示的即为合法立即数。


协处理器与协处理器指令集

6.协处理器cp15操作指令

mcr & mrc
mrc用于读取CP15中的寄存器
mcr用于写入CP15中的寄存器

7.arm寻址方式

1). 寄存器:    MOV R1,R2 ; R2->R1

2). 立即数:    SUBS R0,R1,#1; R0=R1-1

3). 寄存器移位:MOV R0,R2,LSL #3 ;R2左移三位->R0 

4). 间接寻址:  LDR R1,[R2] ; 装载R2指向的内存数值至R1

5). 基址寻址:  LDR R2,[R3,#0x0F] ;R3+0x0F作为地址,将所

 

指向的置装入R2.R3的值不改变

6). 多寄存器寻址: LDMIA R1!,{R2-R7,R12} ; 将R1所指向的内

 

存块依次装入{}中的寄存器。

STMIA R0!,{R3-R6,R10} ;将{}列出的寄存器里的值依次填入R0所指向的内存块。

7). 相对寻址: BL XXX ;跳转 

BEQ XXX ;条件跳转

协处理器解析:

SoC内部另一处理核心,协助主CPU实现某些功能,被主CPU调用执行一定任务。
ARM设计上支持多达16个协处理器,但是一般SoC只实现其中的CP15.(cp:coprocessor)
协处理器和MMU、cache、TLB等处理有关,功能上和操作系统的虚拟地址映射、cache管理等有关。


MRC & MCR的使用方法

mcr{}   p15, , , , , {}
opcode_1:对于cp15永远为0
Rd:ARM的普通寄存器
Crn:cp15的寄存器,合法值是c0~c15
Crm:cp15的寄存器,一般均设为c0
opcode_2:一般省略或为。

 

ldm/stm与栈的处理

为什么需要多寄存器访问指令

ldr/str每周期只能访问4字节内存,如果需要批量读取、写入内存时太慢,解决方案是stm/ldm
ldm(load register mutiple)
stm(store register mutiple)

举例(uboot start.S 537行)

stmia sp, {r0 - r12}
将r0存入sp指向的内存处(假设为0x30001000);然后地址+4(即指向0x30001004),将r1存入该地址;然后地址再+4(指向0x30001008),将r2存入该地址······直到r12内容放入(0x3001030),指令完成。
一个访存周期同时完成13个寄存器的读写


后缀的种类:

ia(increase after)先传输,再地址+4
ib(increase before)先地址+4,再传输
da(decrease after)先传输,再地址-4
db(decrease before)先地址-4,再传输
fd(full decrease)满递减堆栈
ed(empty decrease)空递减堆栈
fa(·······) 满递增堆栈
ea(·······)空递增堆栈


四种栈解析:

空栈:栈指针指向空位,每次存入时可以直接存入然后栈指针移动一格;而取出时需要先移动一格才能取出。
满栈:栈指针指向栈中最后一格数据,每次存入时需要先移动栈指针一格再存入;取出时可以直接取出,然后再移动栈指针。
增栈:栈指针移动时向地址增加的方向移动的栈。
减栈:栈指针移动时向地址减小的方向移动的栈。


!的作用:

ldmia r0, {r2 - r3}
ldmia r0!, {r2 - r3}

感叹号的作用就是r0的值在ldm过程中发生的增加或者减少最后写回到r0去,也就是说ldm时会改变r0的值。


^的作用:

ldmfd sp!, {r0 - r6, pc}
ldmfd sp!, {r0 - r6, pc}^


^的作用:在目标寄存器中有pc时,会同时将spsr写入到cpsr,一般用于从异常模式返回。


总结:批量读取或写入内存时要用ldm/stm指令。
各种后缀以理解为主,不需记忆,最常见的是stmia和stmfd。
谨记:操作栈时使用相同的后缀就不会出错,不管是满栈还是空栈、增栈还是减栈。

 

常用gun伪指令:

global _start @ 给_start外部链接属性
.section .text @ 指定当前段为代码段
.ascii .byte .short .long .word 
.quad .float .string @ 定义数据
.align 4 @ 以4字节对齐
.balignl 16 0xabcdefgh @ 16字节对齐填充
.equ @ 类似于C中宏定义


偶尔会用到的gun伪指令

.end @标识文件结束
.include @ 头文件包含
.arm / .code32 @声明以下为arm指令
.thumb / .code16 @声明以下为thubm指令

重要的几个伪指令

ldr 大范围的地址加载指令
adr 小范围的地址加载指令
adrl 中等范围的地址加载指令
nop 空操作
ARM中有一个ldr指令,还有一个ldr伪指令
一般都使用ldr伪指令而不用ldr指令

adr与ldr

adr编译时会被1条sub或add指令替代,而ldr编译时会被一条mov指令替代或者文字池方式处理;
adr总是以PC为基准来表示地址,因此指令本身和运行地址有关,可以用来检测程序当前的运行地址在哪里
ldr加载的地址和链接时给定的地址有关,由链接脚本决定。

 

@笔记记得有点不清晰,希望在学习ARM在座的各位指出哪有错,大家一起进步,共同学习。

推荐阅读

史海拾趣

Bivar公司的发展小趣事

随着技术的不断发展和市场的日益扩大,Bivar公司意识到国内市场的局限性,开始积极拓展国际市场。公司派遣专业团队前往海外进行市场调研,了解当地需求和竞争态势。通过定制化的产品和灵活的销售策略,Bivar成功打入多个海外市场,并获得了可观的收益。

Fastron公司的发展小趣事

在电感器领域取得成功后,Fastron并没有止步不前。相反,公司积极拓展业务领域,实现了多元化发展。除了电感器业务外,Fastron还成功运营了大型钣金生产业务,专门生产精密金属外壳和机电组件。此外,Fastron集团还拥有位于德国的Rapid Biomedical公司,为MRI扫描仪定制MR线圈,进一步拓宽了公司的业务范围。

HEC Inc公司的发展小趣事

Fastron公司深知产品质量对于企业的重要性。因此,公司建立了严格的质量控制体系,从原材料采购到产品生产、检测等各个环节都实行严格的质量控制和管理。Fastron还引进了先进的检测设备和技术手段,确保每一款产品都符合高标准的质量要求。这种对品质的执着追求使得Fastron的产品在市场上具有极高的竞争力。

福建国光公司的发展小趣事

Fastron公司非常重视与客户的合作关系。公司始终坚持以客户为中心的服务理念,为客户提供优质的产品和服务。Fastron不仅关注客户的需求和反馈,还积极与客户沟通合作,共同推动产品的升级和优化。这种紧密的合作关系使得Fastron与客户之间建立了长期稳定的信任关系,为公司的持续发展提供了有力保障。

Custom Electronics Inc公司的发展小趣事

随着公司规模的扩大和产品质量的提升,CEI开始寻求更广阔的市场空间。通过与全球知名电子产品制造商建立合作关系,CEI的产品逐渐进入国际市场。同时,CEI还积极参与国际电子行业的交流与合作,不断引进先进的生产技术和管理经验,为公司的长远发展奠定了坚实基础。

ATC [American Technical Ceramics]公司的发展小趣事

随着全球经济的日益一体化,国际合作成为许多公司拓展市场的重要途径。假设ATC在某次国际技术交流会上与一家欧洲知名电子企业达成了合作协议,双方共同开发了一款新型陶瓷电容器。这款电容器不仅性能卓越,而且成本相对较低,因此在全球市场上受到了广泛的欢迎。通过这次合作,ATC不仅提升了自身的技术实力,也进一步拓展了海外市场。

问答坊 | AI 解惑

电流放大电路

谁有电流放大电路的相关资料,拿出来分享一下。实用的电路最好,我找了好几个电路,但调试结果都不太理想。 …

查看全部问答>

继电器学习

本帖最后由 paulhyde 于 2014-9-15 09:10 编辑 继电器学习,资料分享!! [ 本帖最后由 open82977352 于 2010-2-10 16:47 编辑 ]  …

查看全部问答>

字符输出有误!

程序实现若输入“abcdefg”,则输出将其完全反向输出,应为“gfedcba”,但下面程序输出无结果,忘大家告知下!哪里有错误#include \"stdio.h\"#include \"string.h\"   int main(){char pstr[10];strcpy(pstr, \"abcdefg\");char tmp ...…

查看全部问答>

在EVC中如何给按钮贴图?

我想在EVC中如何给按钮贴图,可是setbitmap函数evc不能用,应该怎么办啊?麻烦哪位给解答一下,谢谢了~~~~~~…

查看全部问答>

求助关于MC35I模块的问题

我在使用MC35I模块时出现了一些疑问,紧急求助,不盛感谢! 1.请问六脚的SIM卡插座与MC35I模块应该如何硬件连接,SIM卡的VPP引脚需要使用吗? 2.我使用单片机控制该模块,每次模块启动后,当模块搜索网络时,模块就掉电了,我给模块提供的电压是4.2 ...…

查看全部问答>

SPI重映射

我现在碰到的问题是,SPI的NSS接到PA4,我又要用SPI又要用DAC,它们共用一个引脚,我该怎么配置, 用SPI的重映射可以实现吗?附板子电路图…

查看全部问答>

TCP UDP 调试软件

发几个下工具,没钱花了,希望大家多捧场啊。FPGA 调无线用的,在网上找得,感觉比较好用了的传上来了,希望能节省大家的时间………

查看全部问答>

静电对于运放的影响

最近在做一个对于不同的采集电路对于采集效果的影响,于是用不同的电路(相同的运放)实现。 可是我焊上去的运放总是会有坏掉的,大概焊9个就有4个是不同用的,而且焊上去的运放性能还有差别(这简直根本没法对比了。。。) 不知道是不是因为静电 ...…

查看全部问答>

烙铁温度测量工具有哪些?

如题,烙铁温度测量工具有哪些? \0\0\0eeworldpostqq…

查看全部问答>

单片机做正弦波发生器

我想用单片机输出2组方波,相位差180,之后想得到正弦波,用于给电感式传感器提供励磁信号,不知相敏这块怎么做 啊?…

查看全部问答>