9.ARM汇编指令集概述


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指向正被取指的指令,而非正在执行的指令。


这里写图片描述


这里写图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值