当前位置:首页 > 单片机 > 单片机
[导读]汇编指令和伪汇编指令汇编指令:CPU指令的助记符伪汇编指令:本质上不是指令,是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码ARM汇编的特点ARM汇编的特点1:LDR/STR架构ARM采用RI

汇编指令和伪汇编指令

汇编指令:CPU指令的助记符
伪汇编指令:本质上不是指令,是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码

ARM汇编的特点ARM汇编的特点1:LDR/STR架构

ARM采用RISC架构,CPU本身不能直接读取内存(CISC结构的可以直接读取内存),而需要先将内存中内容载入CPU中通用寄存器才能被CPU执行。
ldr (load register) 将内存内容加载进入通用寄存器
str (store register) 将寄存器内容存入内存空间

ARM汇编的特点2:8种寻址方式类别示例寄存器寻址mov r1, r2立即寻址mov r0, #0xFF00}寄存器移位寻址mov r0, r1, lsl #3 @(r0=r1<<3)寄存器间接寻址ldr r1, [r2]基址变址寻址ldr r1,[r2,#4] @r1 = r2+4多寄存器寻址ldmia r1!,{r2-r7,r12}堆栈寻址stmfd sp!, {r1-r7,lr}相对寻址beq flagARM汇编的特点3:指令后缀

同一指令经常附带不同后缀,变成不同的指令。经常使用的后缀有:

后缀功能B (byte)功能不变,操作长度变为8位H (half word)功能不变,长度变为16位S (signed)功能不变,操作数变为有符号 如 ldr ldrb ldrh ldrsb ldrshS (S标志)功能不变,影响CPSR标志位 如 mov和movsARM汇编的特点3:条件执行后缀


如果后缀条件满足才执行。

例如:
mov r0, r1 @r0 = r1
moveq r0,r1 @ if(eq) r0 =r1

条件后缀执行注意:条件后缀是否成立,不是取决于本句代码,而是取决于这句代码之前的代码运行后的结果。

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

S5PV210使用13级流水线。PC指向正被取值的指令,而非正在执行的指令。

数据处理指令数据传输指令

mov (move)

movr1,r0@两个寄存器之间数据传递r1=r0movr1,#0xFF@将立即数赋值给寄存器r1=0xFF

mvn 用法和mov一样,区别是mvn是按位取反后传递

r1=0xFF,执行movr0,r1后r0=0xFF执行mvnr0,r1后r0=0xffffff00
算术指令

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

逻辑指令

and 逻辑与
orr 逻辑或
eor 逻辑异或
bic 位清除指令 (bic r0, r1, #0x1F @将r1中的数的bit0到bit4清零后赋值给r0 0x1F = 0001 1111)

比较指令

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

乘法指令

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

前导零计数

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

CPSR访问指令

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] 互换

软中断指令

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

ldm/stm与栈的处理

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

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

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

空栈:栈指针指向空位,每次存入数据后,sp+4
满栈:栈指针指向满位,每次存入数据时,先sp+4然后再存入数据
增栈:栈指针移动时向地址增加的方向移动
减栈:栈指针移动时向地址减小的方向移动
因此有四种栈类型:空增栈,空减栈,满增栈,满减栈。

八种后缀后缀意义ia (increase after)先传输,再地址+4ib (increase before)先地址+4,再传输da (decrease after)先传输,再地址-4db (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中的值变化。

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

^的作用

ldmfd sp!, {r0-r6, pc}
ldmfd sp!, {r0-r6, pc}^
^:在目标寄存器中有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,0xABCDEF16字节对齐填充.equ类似于C中的宏定义

.end汇编文件的结束,不加无所谓.include头文件包含.arm或者.code32声明以下的代码为arm指令不是thumb指令.thumb或者.code16声明以下的代码为thumb指令

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

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

.balignl 16, 0xABCDEF 对齐+填充,b表示位填充,最后的l表示long,16表示16字节对齐,0xABCDEF表示填充的原料。

0x00000008 : .balignl 16, 0xABCDEF,

0x0000000C: 0xABCDEF

0x00000010: 下一条指令

ARM中有一个ldr指令,还有一个ldr伪指令。两者的区别:
ldr r0, #0xFF @ldr指令
ldr r0, =0xFF @ldr伪指令 涉及到合法/非法立即数,还涉及到ARM文字池

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


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭