当前位置:   article > 正文

arm代码

arm代码

RISC精简指令集

长度和执行周期固定

长度为一条机器指令在计算机占用的内存大小

指令周期为CPU执行一条机器指令所发费的时间(时钟周期由CPU工作频率决定)

CISC复杂指令集

其架构一般用于PC端  X86和X64都是负载指令集CPU

更注重指令的功能性 指令周期和长度都不固定

arm的七种基本工作模式

user非特权模式  大部分任务执行在这种模式

FIQ当一个快速中断产生式将进入这种模式

IRQ当一个通用中断产生时会进入这种模式

Supervisor(svc)当复位或软中断指令执行时会进入这种模式

Abort 存取异常时会进入这种模式

Undef 当执行未定义指令时会进入这种模式

System 使用User相同的寄存器集的特权模式

Cortex-A 特有模式

Monitor 是为了安全而扩展出的用于执行安全监控代码的模式; 也是一种特权模式 

HYP 虚拟化模式,当一个硬件上运行两个OS内核时进入这个模式

R13寄存器  SP指针寄存器 栈中一般存放一些临时数据,也可以用于进行保护现场

R14寄存器 LR链接寄存器 当程序跳转后PC保存跳转后的指令的地址

R15寄存器 PC 程序计数器 始终保存马上就要执行的指令的地址,每次指令执行完毕后PC寄存器的值会自动向下+4  可以手动修改PC寄存器的数值

一条指令的执行过程

1.取址:cpu将PC寄存器的数值通过地址总线传输给存储器,存储器将PC存储的地址位置的指令传输到CPU内存,存放在IR寄存器中

2.译码:IR寄存器的指令交给译码器,对指令进行译码

3.执行:控制器把译码之后的指令交给运算器,运算器再进行对于的运算操作

.text @当前汇编里注释用‘@’ .test声明下面的内容属于文本段内容

.global _start @.global声明_start为一个全局标签

_start:@汇编里的标签,类似于c语言里的函数

mov r1,#1 @汇编命令 将1保存到r1寄存器

stop:     b stop @跳转到stop标签

map.lds是一个链接脚本文件       程序最终链接时,链接器读取链接脚本的内容,按照链接脚本指定的规则将指定的代码存放在内存的不同位置

伪操作  .text .global .end .if .else .endif .data  可以实现和指令类似的功能 占4字节 

数据搬移指令 =     数据移位指令 << >>      数据算数运算指令

+ - * / 位运算指令 & | ~ ^ 数据比较指令

2.跳转指令 3.内存读写指令 4.状态寄存器读写指令 5.软中断指令

<opcode>{<cond>}{s} <Rd>, <shifter_operand>   

<opcode>:指令码    {<cond>}:条件码 {s}:状态位,如果在指令后面加上s,运算结果会影响CPSR条件位 <Rd>:目标寄存器 <shifter_operand>:第一操作数,可寄存器,也可以是立即数

mov:将第一操作数的值保存在目标寄存器

mvn:将第一操作数的值按位取反,将结果保存在目标寄存器

LDR 目标寄存器,=数值     将指定的数据放在目标寄存器中

移位指令  格式:<opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand>

将第一操作寄存器的数值移位第二操作数指定的位数,将结果保存在目标寄存器中

LSL:左移运算 低位补0 LSR:右移运算 高位补0 ROR:循环右移:低位移出的值补到高位

位运算指令  格式:<opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand>

将第一操作寄存器和第二操作数进行位运算,将结果保存在目标寄存器中

and:与 与0清0 与1不变 orr:或 或1置1 或0不变 eor:异或 相同为0 不同为1

bic:按位清零指令,想将哪一位设置为0,只需要用bic指令给这一位运算一个1即可

算术运算指令 格式:<opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand>

将第一操作寄存器的值和第二操作数进行算数运算,结果保存在目标寄存器中

add:加法运算 adc:进行加法运算时需要考虑CPSR的条件位

sub:减法运算 sbc:进行减法运算时需要考虑CPSR的条件位 mul:乘法运算

比较指令 cmp 第一操作数,第二操作寄存器   用于比价数据

就是比较的两个数进行减法运算,并且减法运算的结果会影响到CPSR寄存器的条件位

跳转指令  <opcode>{<cond>} 标签 跳转到指定的标签下

指令码: b:跳转时不影响LR寄存器的值

指令码以及功能 

 向内存中写: str:向内存中写一个字(4字节)的数据 strh:写半个字(2字节)strb:一个字节

从内存读: ldr:从内存读取一个字的数据 ldrh:读取半个字的数据 ldrb:读取一个字节的数据

指令码{条件码} 目标寄存器 [目标地址]

str 目标寄存器 ,[目标地址]:将目标寄存器的数据写入到以目标地址为起始的内存中

ldr 目标寄存器 ,[目标地址]:从以目标地址为起始的内存中读一个字的数据到目标寄存器

向内存写: stm 目标地址,{寄存器列表} 将寄存器列表中每一个寄存器的值都写道目标地址指向的连续空间之中

从内存读 ldm 目标地址,{寄存器列表} 将目标地址指向的连续内存中的数据读到寄存器列表中的寄存器中

ia后缀 先写入然后地址向地址大的方向增长  ib先向地址大的方向增长然后写入数据

da后缀先向指向的内存中存数据,然后寄存器保存的地址往地址小的方向增长

DB后缀先将保存的地址往地址小的方向增长,再往保存的地址内存中存入数据

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/124351
推荐阅读
相关标签
  

闽ICP备14008679号