历史上的今天
返回首页

历史上的今天

今天是:2025年02月04日(星期二)

2020年02月04日 | arm的汇编指令及特点

2020-02-04 来源:eefocus

指令和伪指令:前者编译后会生成一串1和0组成的机器码,后者帮助前者进行编译过程,不会生成机器码。


ARM汇编特点1:LDR/STR架构
ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中内容加载入CPU中通用寄存器中才能被CPU处理。


ldr(load register)指令将内存内容加载入通用寄存器。
str(store register)指令将寄存器内容存入内存空间中。
ldr/str组合用来实现 ARM CPU和内存数据交换  

(这两个指令只能在寄存器和内存之间进行)

 

ARM汇编特点2:8种寻址方式

寄存器寻址                mov r1, r2
立即寻址        mov r0, #0xFF00

寄存器移位寻址      mov r0, r1, lsl #3(r1先左移3位再赋给r0)
寄存器间接寻址      ldr r1, [r2]  (r2加一个[]后表示一个内存地址)
基址变址寻址         ldr r1, [r2, #4](r2加4的内存地址)
多寄存器寻址         ldmia r1!, {r2-r7, r12}(r1有初始值,将r2到r7,r12的值传入相应的地址,每次传输之后递增r1指向的存储地址,因为是32位,每次递增的地址应该是4bytes)
堆栈寻址               stmfd sp!, {r2-r7, lr}

相对寻址               beq flag

flag:(这是个标号)

ARM汇编特点3:指令后缀

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

ARM汇编特点4:条件执行后缀

如果后缀条件满足才执行。
例如: 
mov r0, r1     //r0 = r1 
moveq r0,r1  // if(eq) r0 =r1(上一条指令如果使cpsr中的标志位置或则进行这条语句)
条件后缀执行注意:条件后缀是否成立,不是取决于本句代码,而是取决于这句代码之前的代码运行后的结果。

ARM汇编特点5:多级指令流水线

 

n级就会有PC-2^n

 

数据处理指令

数据传输指令

mov (move)

mov r1, r0     @两个寄存器之间数据传递 r1 = r0
mov r1, #0xFF   @将立即数赋值给寄存器 r1 = 0xFF
mvn 用法和mov一样,区别是mvn是按位取反后传递

例如:r1 = 0xF0,执行mov r0, r1 后 r0 = 0xF0
         执行mvn r0, r1 后 r0 = 0x0F
算术指令

add 加法指令add r2, r0, r1     @(r2 = r0+r1) 
sub 减法指令sub r2, r0, r1     @(r2 = r0 - r1) 
rsb 逆向减法指令 rsb r2,r0,r1     @(r1 = r1 - r0)
adc 带进位加法指令

sbc 带借位减法指令 
rsc 带借位的逆向减法指令

逻辑指令

and 逻辑与 
orr 逻辑或         ORR   R0,R0,#3             @r0先与3相或,在把值赋给r0
eor 逻辑异或 
bic 位清除指令 (bic r0, r1, #0x1F @将r1中的数的bit0到bit4清零后赋值给r0 )

比较指令

cmp   cmp r0, r1   @(r0 - r1 = 0?) 
cmn   cmn r0, r1   @(r0 + r1 = 0?) 
tst     tst r0, 0x0f   @测试r0的bit0-bit3是否全为0 
teq      teq r0,r1     @P = r0 EOR r1 
比较指令不用后加S 就能影响CPSR中的标志位。

乘法指令

mvl mla umull umlal smull smlal 都不常用,这里只作为知识点罗列。

前导零计数

clz 计算返回操作数二进制编码中第一个1前0的个数

CPSR访问指令(不可用mov访问)

mrs & msr

mrs 用来读psr (cpsr&spsr) 
msr 用来写psr

mrs r0, cpsr     将cpsr的值读入到r0中 
……………… 处理r0的值 
msr cpsr, r0     将r0的值写入到cpsr中

cpsr : 程序状态寄存器,CPU中只有一个,记录程序运行状态 
spsr:CPU中有五个,分别在五种异常模式下,作用是从普通模式进入异常模式时,用来保存之前普通模式下的cpsr的,在返回普通模式时恢复原来的cpsr。

跳转指令

b & bl &bx

b 直接跳转 
bl (branch and link) 跳转前把返回地址存在lr寄存器中,以便返回。 
bx 跳转同时切换到ARM模式,一般用于异常处理的跳转。

访存指令

ldr/srt & ldm/stm & swp

单个字/半字/字节访问 ldr/str 
多字批量访问 ldm/stm 
swp r1, r2, [r0] 内存和寄存器交换指令,将r0所指向内存中的数据写入r1,并将r2中的数据写入到r0所指向的内存。 
swp r1, r1, [r0] 互换(将r0所指向内存中的数据写入第一个r1,将第二个r1中的数据写入到r0所指向的内存。)

软中断指令

swi (software interrupt) 用来实现操作系统中的系统调用。

汇编中的立即数

ARM指令都是32位,除了指令标记和操作标记外,本身只能附带很少位数的立即数,因此立即数有合法和非法之分。

合法立即数:经过任意位数的移位后非零部分可以用8位标识的即为合法立即数(非零部分少于等于8位,0x000000ff 是合法立即数,0x00ff0000是合法立即数,0xf000000f循环移位之后仍然是合法立即数,0x000001ff是非法立即数)

协处理器以及协处理器指令

什么是协处理器

Soc内部另一处理核心,协助CPU实现某些功能,被主CPU调用执行一定的任务。CP15 (cooperation processor)
协处理器和MMU、cache、TLB等处理有关,功能上和操作系统的虚拟地址映射、cache等的管理有关。

协处理器访问指令

mcr & mrc

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

Rd:ARM的普通寄存器,不能是r15/pc 
Crn:cp15的寄存器,合法值为c0 - c15 
Crm:cp15的寄存器,一般均为c0

举例:

mrc p15, 0, r0, c1, c0, 0 
mcr p15, 0, r0, c1, c0, 0    (查阅cp15协处理器的作用位,存入PC中的都是指令,不可以是内容)

例2:

此例子用于打开mmu(on,所有地址为虚拟地址;off,所有地址为实地址)
mrc p15, 0, r0, c1, c0, 0
orr r0, r0, #1
mcr p15, 0, r0, c1, c0, 0

ldm/stm与栈的处理

ldr/str每周期只能访问4个字节内存,如果需要批量读取,写入内存时太慢,这个时候就要用ldm/stm (load register mutiplt / store register mutiplt)

多寄存器访问举例 
stmia sp, {r0-r12}

将r0存入sp指向的内存处,然后地址+4,将r1存入内存,然后地址再+4……直到将r12内容存入内存。
栈类型

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

因此有四种栈类型:空增栈,空减栈,满增栈,满减栈。

八种后缀

后缀 意义
ia (increase after) 先传输,再地址+4
ib (increase before) 先地址+4,再传输
da (decrease after) 先传输,再地址-4
db (decreade before) 先地址-4,再传输
fd (full decrease) 满减栈
ed (empty decrease) 空减栈
fa 满增栈
ea 空增栈
操作栈的时候使用相同的后缀,就会避免出错。

!的作用

ldmia r0, {r2-r3} @把r0指向的内存中的数据读入到r2中,然后内存地址+4再将+4后地址中的数据读入到r3中。指令执行完毕后r0中的值不变。 
ldmia r0!, {r2-r3} @把r0指向的内存中的数据读入到r2中,然后内存地址+4再将+4后地址中的数据读入到r3中。指令执行完毕后r0中的值变化(为r3内容的地址)。

感叹号的作用就是r0的值在ldm过程中发生的增加或者减小最后写会到r0中。

^的作用

ldmfd sp!, {r0-r6, pc}  (操作了八个寄存器)
ldmfd sp!, {r0-r6, pc}^ (此项操作实际操作了9个寄存器,spsr->cpsr)
^:在目标寄存器中有pc时,会同时将spsr写入到cpsr,一般用在异常返回的时候。

GNU汇编伪指令

伪指令不是指令,伪指令和指令的根本区别是经过编译后会不会生成机器码。
伪指令的意义在于指导编译过程。
伪指令是和具体的编译器相关的,我们使用gnu工具链,因此学习gnu环境下的汇编伪指令。
GNU汇编中的一些符号

@ 行注释,可以在指令后边也可以在行首 
: 以冒号结束的是标号 
. 点号表示当前指令的地址 
立即数前面加#或者$,表示这是个立即数

常见的gnu汇编伪指令

伪指令 意义
.globl _start 给_start外部链接属性
.section .text 指定当前为代码段
.ascii .byte .short .long .word .quad .float .string 定义数据
.align 4 以16(2^4)字节内存地址对齐
.balignl 16,0xABCDEF 16字节对齐填充
.equ 类似于C中的宏定义
.end 汇编文件的结束,不加无所谓
.include 头文件包含
.arm或者.code32 声明以下的代码为arm指令不是thumb指令
.thumb或者.code16 声明以下的代码为thumb指令

eg.

.word 0xAABBFF 类似于C语言的 int AAAA = 0xAABBFF;

.align 4 @ 16字节对齐
.align 2 @ 4字节对齐

.balignl 16, 0xABCDEF 对齐+填充,b表示位填充,最后的l表示long,16表示16字节对齐,0xABCDEF表示填充的原料。 
0x00000008 : .balignl 16, 0xABCDEF,
0x0000000C: 0xABCDEF
0x00000010: 下一条指令

 

ldr 大范围的地址加载指令
adr 小范围的地址加载指令
adrl 中等范围的地址加载指令
nop 空操作

ARM中有一个ldr指令,还有一个ldr伪指令。两者的区别: 
ldr r0, #0xFF @ldr指令 
ldr r0, =0xFF @ldr伪指令 涉及到合法/非法立即数,还涉及到ARM文字池
adr 和 ldr的差别: 
- adr编译时会被1条sub或add指令替代,而ldr编译时会被一条mov指令替代或者文字池方式处理; 
- adr总是以PC为基准来表示地址,因此指令本身和运行地址有关,可以用来检测程序当前的运行地址在哪里 
-ldr加载的地址和链接时给定的地址有关,由链接脚本决定。


推荐阅读

史海拾趣

Altech公司的发展小趣事

为了适应市场的快速变化和公司业务的不断扩张,Altech公司决定将深圳工厂整体搬迁至广州南沙。这一搬迁不仅优化了公司的生产布局,还为公司提供了更加广阔的市场发展空间。搬迁后的工厂引进了先进的生产设备和技术,进一步提升了公司的生产效率和产品质量。

Allegro公司的发展小趣事

随着全球对可再生能源的日益关注,风电行业得到了迅速发展。Altech公司紧跟时代步伐,投入大量资源研发铝合金风电线导体。这种新型导体材料不仅具有优异的导电性能,还具备出色的耐候性和抗腐蚀性,极大地提高了风电设备的运行效率和稳定性。

CMD公司的发展小趣事

随着公司业务的不断拓展,CMD开始在全球范围内建立销售办事处。从最初的美国加利福尼亚州Irvine总部,逐渐扩展至加州、明尼苏达州、马萨诸塞州,甚至英国等地。这一布局不仅增强了公司的市场影响力,也为其提供了更多的商业合作机会。

EICHHOFF公司的发展小趣事

随着全球化趋势的加强,EICHHOFF公司意识到必须加快国际化步伐以拓展更广阔的市场。XX年代初,公司开始在欧洲其他国家设立销售和服务机构,并逐步将业务拓展到亚洲和北美地区。为了更好地适应不同地区的市场需求和文化差异,EICHHOFF公司积极招聘本地人才,并加强与当地企业和机构的合作。

通过实施国际化战略,EICHHOFF公司的品牌影响力得到了显著提升,市场份额也不断扩大。同时,公司也积累了丰富的国际运营经验和管理经验,为未来的发展奠定了坚实基础。

Caddock公司的发展小趣事

Caddock公司的发展可以追溯到1962年,当时公司推出了Micronox电阻系统。这一创新技术使电阻器在极端操作条件和恶劣环境下实现了高水平的稳定性和可靠性。这一重大突破为Caddock公司赢得了市场的广泛认可,并为后续的电阻材料技术发展奠定了坚实的基础。

Galil Motion Control Inc公司的发展小趣事

多年来,Caddock公司一直致力于电阻材料技术的研究与创新。通过不断的努力,公司的电阻器技术逐渐扩展到更低的温度系数、更高的稳定性、更好的瞬态处理以及更高和更低的电阻率。这些技术进步使得Caddock公司的电阻器和电阻器网络系列不断丰富,满足了市场的多样化需求。

问答坊 | AI 解惑

汽车电子面临的挑战

挑战一 新的传感需求 两项即将引入的传感器技术是雷达和摄像机系统。飞思卡尔对这两种技术的研究包括传感器和相应的计算机信号处理部分,目前的技术可以让成本减少4倍。没有哪种传感器是万能的,例如雷达可以精确测距,却无法进行物体识别,必 ...…

查看全部问答>

这电路用单片机会画换做ARM不知道怎么接了

我想用ARM7的STR750接收一串数据,在单片机上时接到RXD引脚!换成750的话接什么引脚比较适合啊? 在画电路的时候实在觉得ARM和单片机区别不大! 大家说下两者明显的区别吧! 我是新手刚刚接触嵌入式!除了知道嵌入式可以跑操作系统外,还不知道 ...…

查看全部问答>

比万用表还小的微型电子示波器

比万用表还小的微型电子示波器…

查看全部问答>

在发个4AD的,原理图需要的请回帖我在上传

这个板子采用了STC的2052AD,可以支持8路8位分辨率的AD输入,我设计的这个用了其中4路,其他的IO口作为现实和驱动继电器用,支持1路继电器输出,4位数码管,1路报警蜂鸣器,所有单片机的引脚全部引出可以为外部扩展使用。…

查看全部问答>

第14/15原创:事无巨细,单总线器件DS18B20

事无巨细,单总线温度传感器DS18B20终于来到最后一关,温度传感器DS18B20。 首先要知道什么是单总线: 目前常用的微机与外设之间进行数据传输的串行总线主要有I2C总线、SPI总线和SCI总线。其中I2C总线以同步串行2线方式进行通信(一条时钟线,一 ...…

查看全部问答>

电子工程师:改变了人们的生活体验,却降低了自己的社会地位

娱乐界的颁奖晚会、红地毯炒的沸沸扬扬,吸引N多媒体的目光,而为什么没有专门为科学家和工程师举办多一些这种活动? 美国《纽约时报》专栏作家Thomas L. Friedman提出建议,认为应该大力宣传像是“英特尔科学奖”颁奖晚会这样的活动,让其现场 ...…

查看全部问答>

TD-SCDMA模块网速测试的疑问

    我想用中国移动的TD-SCDMA模块传输视频,开发板是ARM平台。ARM将视频采集压缩之后通过USB口传给TD模块,现在正确配置之后,能成功拨号并传输视频。     但是,目前传输效果很差,分辨率为352*288的CIF格式视频每秒只能传 ...…

查看全部问答>

128x64液晶KS0108驱动程序

里面少几个 #include \".\\inc\\ASCII816.h\" //标准ASCII库 #include \".\\inc\\HZTable.h\" //汉字点阵库(自做) #include \".\\inc\\Menu.h\" //菜单库(自做) 这些文件我去那里找,怎么做请高手回答…

查看全部问答>

请教大虾。。。基于s3c2440的wince下的GPS接收系统

小弟目前正在做毕业设计,题目rt。 ============================================================ 目前硬件已经搭建了,rs232 gps模块+mini2440开发板,在wince 5.0下用串口调试助手和GPSViewer等软件调试过,可以收到6颗星左右,功能还行。 = ...…

查看全部问答>

(公司项目笔记及源码) QTOpia最新版本及Linux内核的arm移植

http://item.taobao.com/auction/item_detail.jhtml?x_id=0db2&item_id=fc0e4ae6d2507c66f0782f153aa43d4e…

查看全部问答>