ARM学习笔记_20140812

一、多寄存器寻址

例:LDMIA R0!, {R1-R4}

R1 <- [R0]

R2 <- [R0 + 4]

R3 <- [R0 + 8]

R4 <- [R0 + 12]

该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长度增加,因此指令可以将连续存储单元的值传送到R1到R4中。

摘自:《汇编语言程序设计——基于ARM体系结构(第2版)》P72


二、进栈出栈操作

ARM分别采用LDMFD和STMFD指令来支持POP操作(出栈)和PUSH操作(进栈),R13作为堆栈指针。堆栈寻址的例子如下:

STMFD R13!, {R0-R4}

LDMFD R13!, {R0-R4}

第一条指令将R0-R4中的数据压入堆栈,R13为堆栈指针;第二条指令将数据出栈,恢复R0-R4原先的值。

摘自:《汇编语言程序设计——基于ARM体系结构(第2版)》P73


三、BIC位清除指令

汇编格式:BIC{<cond>}{S} Rd, Rn, operand2

operand2可以看做一个32位的掩码,如果在掩码中设置了某一位,则清除Rn中相应的位。

摘自:《汇编语言程序设计——基于ARM体系结构(第2版)》P84


四、比较指令

比较指令根据结果更新CPSR中的标志位,但不影响其他的寄存器。对于比较指令,不需要使用S后缀就可以改变标志位的值

摘自:《汇编语言程序设计——基于ARM体系结构(第2版)》P84

4.1 CMP比较指令

该指令实质上是进行一次减法运算,但不存储结果,只更改条件标志位。

摘自:《汇编语言程序设计——基于ARM体系结构(第2版)》P85

4.2 CMN反值比较指令

该指令实际上是将操作数Rn和操作数operand2相加,并根据结果更改条件标志位。

摘自:《汇编语言程序设计——基于ARM体系结构(第2版)》P85


五、乘法指令

与前面的数据处理指令不同,指令中的源操作数、目的寄存器必须为通用寄存器不能对操作数使用立即数或被位移的寄存器。同时,目的寄存器Rd和操作数Rm必须是不同的寄存器。


乘法指令和乘加指令共有以下6条:

MUL、MLA、SMULL、SMLAL、UMULL、UMLAL。

有S后缀时执行结果影响CPSR中条件标志位N和Z值,在ARMv4及以前版本中,标志C和V不可靠,在ARMv5及其以后版本中不影响C和V标志(6条乘法和乘加指令对于S位的规定相同)。

摘自:《汇编语言程序设计——基于ARM体系结构(第2版)》P86

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值