9.ARM汇编指令集概述

来源:互联网 发布:攻壳机动队 电影 知乎 编辑:程序博客网 时间:2024/06/18 10:39

9.1.指令和伪指令及指令风格
(1)汇编指令是CPU机器指令的助记符,汇编指令经过编译后会得到由一串10组成的机器码,该机器码可以由CPU读取执行;汇编伪指令本质上不是汇编指令(它只是和指令一起写在代码中),它是编译器环境提供的,其目的是用来指导编译过程,汇编伪指令经过编译后最终不会生成机器码。
(2)ARM官方的ARM汇编风格:指令一般用大写、Windows中IDE开发环境(如ADS、MDK等)常用,譬如LDR R0, [R1];GNU风格的ARM汇编:指令一般用小写字母、linux中常用,譬如ldr r0, [r1]。


9.2.LDR/STR架构和8种寻址方式
(1)LDR/STR架构:ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中内容加载入CPU中通用寄存器中才能被CPU处理。ldr(load register)指令将内存内容加载入通用寄存器;str(store register)指令将寄存器内容存入内存空间中;ldr/str组合用来实现ARM中CPU和内存数据交换。
(2)8种寻址方式:寄存器寻址(mov r1, r2 将r2中的内容赋值给r1);立即数寻址(mov r0, #0xFF00 将立即数#0xFF00赋值给r0);寄存器移位寻址(mov r0, r1, lsl #3 将r1左移3位得到的内容赋值给r0);寄存器间接寻址(ldr r1, [r2] 注意r2中存放某个内存地址,将相应内存地址的内容赋值给r1,即指针的解引用);基址变址寻址(ldr r1, [r2, #4] 将r2中的内存地址加4得到新的内存地址,然后将新的内存地址经解引用得到的值赋值给r1);多寄存器寻址(ldmia r1!, {r2-r7, r12} 注意r1中存放某个内存地址,依次将r2~r7和r12中的值传入相应的地址,r1地址连续加1,压栈操作);堆栈寻址(stmfd sp!, {r2-r7, lr} 从栈内存中连续访问多个字节的内容依次赋值r2~r7和lr,弹栈操作);相对寻址(beq flag 注意flag:是标号,以当前PC做基址再加偏移量进行跳转)。


9.3.指令后缀和条件执行后缀
(1)指令后缀:同一指令经常附带不同后缀,变成不同的指令,经常使用的后缀有:B(byte)功能不变,操作长度变为8位;H(half word)功能不变,长度变为16位;S(signed)功能不变,操作数变为有符号;(譬如ldr ldrb ldrh ldrsb ldrsh);S(S标志)功能不变,影响CPSR标志位;(譬如mov和movs和movs r0, #0)。
(2)条件执行后缀:条件后缀是否成立,不是取决于本句代码,而是取决于这句代码之前的代码运行后的结果;条件后缀决定了本句代码是否被执行,而不会影响上一句和下一句代码是否被执行(见图1):
这里写图片描述


9.4.多级指令流水线
(1)为增加处理器指令流的速度,ARM使用多级流水线。S5PV210使用13级流水线,ARM11为8级。指令流水线允许多个操作同时处理,而非顺序执行(见图2)。
(2)注意:PC指向正被取指的指令,而非正在执行的指令。


这里写图片描述


这里写图片描述


0 0