自学内容网 自学内容网

【嵌入式开发——ARM】2ARM汇编指令

intel和ARM公司都有自己的指令集,也就是说对应的汇编格式是不同的,不过好在目前基本很少在汇编语言层面编程了,最次也是在C语言级编程,要不说C语言是高级语言呢,很多人觉得难,无非是指针觉得头疼,但其实指针是个极其好用而且不难的工具,其本质就是地址,这也帮助C语言天然契合嵌入式,对指针有困惑的同学,可以翻看我之前的博客,专门有一篇介绍指针。

虽然我们编程用的是C语言,实际在编译代码时,最终还是要先转为汇编再最终得到相应的二进制执行码,不过我们不用感知,这是编译器做的工作,但懂些汇编语言还是很有必要的,无论是帮助深刻理解嵌入式芯片,还是未来有机会来波汇编和C的混合编程,都是很有帮助的;下面介绍ARM架构使用的汇编指令。

1 ARM汇编指令集

指令与伪指令(汇编)
指令:就是CPU机器指令助记符,经过变异后会得到一串10组组成的机器码,可以由CPU读取执行;汇编指令=操作码+操作数;
伪指令:本质上不是指令(只不过和指令一起写在代码中),它是编译环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码;
伪指令作用一般是:
仅在编译过程中起控制作用,不产生可执行目标代码;与机器指令代码无一一对应关系,只能被编译器识别,编译完成后,目标程序中不再出现伪指令。

宏指令
同样还是由编译器厂商提供
基本格式:label 指令;
label 是一个标签,要顶格写;指令 可以是汇编指令或伪指令;;是行注释
如 label EQU 数值
ARM官方指令风格一般大写,如LDR R0, [R1];GNU风格,指令一般用小写字母,Linux中常用,如:Idr r0, [r1]。

LDR/STR架构
ARM采用RISC架构,CPU本身不能直接读取内存,需要先将内存中内容加载到CPU通用寄存器中才能被CPU处理;
LDR指令将内存内容加载到通用寄存器;
STR指令将寄存器内容存到内存空间中;
LDR/STR组合用来实现ARM CPU和内存交换数据。

2 寻址方式

ARM指令格式
{}{s} , {, }
opcode: 操作码,是指令助记符,如MOV ADD SUB…
cond: condition条件,如果省略不写,表示该指令无条件(必须)执行
s: status表示该指令执行结果是否影响xPSR标志位
Rd: register destination 结果寄存器
Rn: 第一个运算操作寄存器
opcode2: 第二个运算操作数

立即数寻址
ADD R0, R0, #0x3F ; #后面的数值就是立即数
寄存器寻址
MOV R0, R1; R0=R1
寄存器移位寻址
MOV R0, R1, LSL #3; R1数值左移三位再赋给R0
寄存器间接寻址
LDR R0, [R1]; 相当于指针操作,把R1地址指向的内容,赋给R0
基址变址寻址
LDR R1, [R2, #4]; R2是基址,加上4,再取内容给R1,R1 = *(R2+4)
多寄存器寻址
LDMIA R1!, {R2-R7, R12}; 将R1指向的单元的数据依次读到R2-R7, R12中
STMIA R1!, {R2-R7,R12}; 将寄存器R2-R7, R12的值保存到R0指向的存储单元中
堆栈寻址
STMFD SP!, {R2-R7, LR}; 将寄存器列表中的寄存器(R2到R7,LR)存入堆栈
相对寻址(跳转相关)
BL NEXT

指令后缀
同一指令经常附带不同后缀,变成不同的指令,如:
B(byte)功能不变,操作长度变为8位;LDRB R1,R2;按Byte读取R2内容给R1
H(half Word)功能不变,长度变为16位;
!如果指令地址表达式中不含!后缀,则基址寄存器中的地址不会发生变化,指令中含有则变化

多指令流水线,为了加速处理器的执行效率,ARM采用多级流水线,以3级流水线为例:
PC ---- 取指
PC-4 ---- 译码
PC-8 ---- 执行

3 常用ARM指令

1.数据处理指令
数据传输:MOV MON
算数指令:ADD SUB RSB ADC SBC RSC
逻辑指令:AND OR EOR BIC
比较指令:CMP CMN TST TEQ
乘法指令:MVL MLA UMULL UMLAL SUMLL SMLAL
前导零计数:CLZ

2.CPSR访问指令
MRS用来读CPSR,MSR用来写CPSR

3.跳转指令
B & BL & BX
B:直接跳转
BL:跳转前把返回地址存到LR中
BX:跳转同时转换为ARM模式,一般用于异常处理的跳转

4.访存指令
LDR/STR & LDM/STM &SWP
单字/半字/字节访问 LDR/STR
多字节批量访问 LDM/STM
SWP R1, R2, [R0] 将R0指向的存储器中断 字数据传输到R1,同时将R2中的数据传输到R0所指向的内存单元
SWP R1, R1, [R0] 该指令将R0所指向的数据与R1中的数据互换

5.软中断指令
swi:一般用来实现操作系统中的系统调用


原文地址:https://blog.csdn.net/weixin_43472004/article/details/143648671

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!