博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
嵌入式开发学习(3)<ARM汇编指令集语法>
阅读量:5202 次
发布时间:2019-06-13

本文共 1794 字,大约阅读时间需要 5 分钟。

汇编指令分为指令和伪指令

指令:针对于CPU设计的指令。作用在CPU上。

伪指令:针对于编译器设计的指令。作用在编译器上,用来知道编译过程,经过编译后伪指令最终不会生成机器码。要知道,汇编指令是机器指令的助记符,最终要通过编译器翻译成CPU能直接识别的由01组成的代码(机器码)。

LDR/STR架构:

ARM采用RISC架构,CPU不能直接操作内存中的内容,而需要先将内存中的内容加载到CPU中的通用寄存器中才能被CPU处理。

LDR(load register)指令将内存中的内容加载的通用寄存器中。

STR(store register)指令与LDR指令相反,将寄存器中的内容存入到内存中。

CPU通过LDR指令和STR指令实现内存与寄存器之间的数据交换。

ARM的八种寻址方式:

1、寄存器寻址 直接用寄存器名称操作数据,与内存地址无关。如:MOV r1,r2 相当于mysql 的set r1=r2,即把r2寄存器的内容赋值给r1寄存器。

2、立即寻址 数据与寄存器之间内容传送。如MOV r0,#0xFF00 ,把16进制的数据0xFF00赋值给r0寄存器,相当于mysql的set r1=0xFF00,加#表示0xFF00是一个数字,不是地址。

3、寄存器移位寻址  数据在寄存器之间赋值的过程中还带有移位运算。如MOV r0,r1 lsl#3,把r1寄存器里的内容左移三位后再赋值给r0寄存器,lsl是左移指令。

4、寄存器间接寻址 寄存器与内存之间的数据操作。如MOV r1,[r2],将r2寄存器里所存地址的里的内容赋值给r1寄存器,r2寄存器类似于与c语言里的指针,存放的是内存的地址。中括号[]相当于c语言指针的取值运算。

5、基址变址寻址 在通过寄存器访问内存地址的时候还带有地址的移位。如ldr r1,[r2,#4] ,将r2寄存器里存放的地址+4后再取其内容赋值只给r1寄存器,是基于上一种寻址方式演变而来。

6、多寄存器寻址 从内存往寄存器加载内容。如ldmia r1!,{r2-r7,r12},将起始地址为r1寄存器所存的地址的后n个地址的内容对应的赋值给{}里对应的寄存器,n的大小取决于{}里寄存器数量。

7、堆栈寻址 从堆栈往寄存器加载内容。如stmfd sp!,{r2-r7,lr},跟上一种寻址非常类似,只不过这种的起始地址不是普通的寄存器里存放的地址,而是堆栈指针sp里存放的地址。stmfd 进栈,sdmfd 出栈。

8、相对寻址 与基址变址方式相类似。相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。如BL haha,BL是跳转指令,haha是程序中的一个标记点,相当于javaScipt中锚点跳转的锚点。

指令后缀:同一指令加上不同的后缀,变成了不同的指令。常用的后缀有:

B后缀(byte) 功能不变,操作长度变成8位。ARM默认处理的32位。

H后缀(half word)功能不变,操作长度变为16位。

S后缀 (signed)功能不变,操作数变为有符号。

如ldr指令,加载指令。从内存的加载四个字节到寄存器。衍生出来的指令有 ldrb(加载一个字节)、ldrh(加载两个字节)、ldrsb(加载一个有符号字节),ldrsh(加载两个有符号字节)。

S后缀(S标志)功能不变,影响CPSR标志位,一般用在数据传输指令,如MOV,MOV r1,#0 ,将数字0赋值给r1寄存器,不会影响CPSR里的零标志位,如果写成MOVS r1,#0,将会影响。

条件执行后缀:

先介绍一下CPRS程序状态寄存器的条件位:

N (negative)运算结果负标志位。Z(zero)运算结果是零。C(carried out)运算中有进位。V(verflowed)运算中有溢出,当条件成立时为1。

 如MOV r1,r0,写成条件执行指令为 MOVEQ r1,r0,表示如果上一条指令的执行结果使得CPSP(程序状态)寄存器的条件位Z(运算结果是零)的零标志位为1,则执行这条条件指令,否则不执行。

特点:条件后缀是否成立,取决于上一条语句或语句块所执行的结果。条件后缀只决定本句语句是否执行。

转载于:https://www.cnblogs.com/airduce/p/7499009.html

你可能感兴趣的文章
android smack MultiUserChat.getHostedRooms( NullPointerException)
查看>>
递归-下楼梯
查看>>
实用的VMware虚拟机使用技巧十一例
查看>>
Docker技术入门之---为镜像添加SSH服务(7)
查看>>
Docker技术入门之---网络配置(8)
查看>>
监控工具之---Prometheus 安装详解(三)
查看>>
Azure Iaas基础之---创建虚拟机
查看>>
Grafana Configuration 参数详解(1)
查看>>
监控工具之---Prometheus数据可视化Grafana(七)
查看>>
监控工具之---Prometheus表达式promQL生产中应用(五)
查看>>
使用POI操作Excel时对事先写入模板的公式强制执行
查看>>
centos7下python3和pycharm安装
查看>>
TypeScript从入门到Vue项目迁移
查看>>
不错的MVC文章
查看>>
JS 正则验证字符串中是否含有数字
查看>>
Js 更换html同一父元素下子元素的位置
查看>>
C#解析json字符串总是多出双引号的原因分析及解决办法
查看>>
js获取iframe的id
查看>>
NSThread 基本使用
查看>>
Window下安装Scala出现:此时不应有 \scala\bin\..\lib\jline-2.14.5.jar
查看>>