打印
[ZLG-ARM]

转:arm指令 汇总

[复制链接]
2283|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
清晨咖啡|  楼主 | 2012-1-28 21:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MOVS r0, r1, LSL #4           ;[r0] ← [r1] *16, update
MVN r0, #0                         ;[r0] ←-1; then 1’s complement of 0 is 111…11
MVN r0, r0                         ;[r0] ←[r0], complement the bits of r0
MVN r0, #0xF                       ;[r0] ←0xFFFFFFF0
LDR r0, [r1]
STR r2, [r3]
LDR r0, [r1, #8]                    ;effective address = [r1]+8, r1 is unchanged
LDR r0, [r1, #8]!                ;effective address = [r1]+8, [r1] ←[r1]+8
LDR r0, [r1],#8                   ;effective address = [r1], [r1] ←[r1]+8

   常见操作举例:
  向量乘
    s=A?B=a1?b1+a2?b2+…+an?bn

MOV r4, #0              ;累加器清零
MOV r5, #24          ;向量长度为24
ADR r0, A             ; r0指向向量A的地址
ADR r1, B             ; r1指向向量B的地址
Next
LDR r2, [r0], #4
LDR r3, [r1], #4
MLA r4, r2, r3, r4     ;r4 = r4 + r2*r3,为乘加指令
SUBS r5, r5,#1       ;decrement loop counter
BNE Next



字符串比较:比较两个16-byte的串
       ADR r0, String1
       ADR r1, String2
       LDMIA r0, {r2-r5} ;get first 16-byte string in r2 to r5, 采用多寄存器寻址方
                                       ;式,一条指令可以完成多个寄存器值的般移
       LDMIA r1, {r6-r9}
       CMP r2, r6
       CMPEQ r3, r7
       CMPEQ r4, r8
       CMPEQ r5, r9
      BEQ Equal                ;if final 4 same then strings are equal
NotEq
      ….                            ;if end here then string not same
Equal
      …



堆栈是一种资料结构,按后进先出(First In Last Out, FILO)的方式工作,使用一个称为堆栈指针的专用寄存器指示当前的操作位置,堆栈指针(SP,Stack Pointer)总是指向堆栈顶。当堆栈指针指向最后压入堆栈的资料时,称为满堆栈(Full Stack),而当堆栈指针指向下一个将要存放资料的空位置时,称为空堆栈(Empty Stack)。根据堆栈的生成方式,分为递增堆栈(Ascending Stack)和递减堆栈(Descending Stack),当堆栈由低位向高位址生成时,称为递增堆栈;当堆栈由高位址向低位址生成时,称为递减堆栈。组合起来,一共有满递增堆栈,满递减堆栈,空递增堆栈和空递减堆栈。
子程序调用
SUB1
       …
       STMFD r13, (r0-r4, lr)       ;保存working registers and link register


BL SUB2


       LDMFD r13, (r0-r4, pc)             ;restore working registers and return

   …
SUB2
      …
      MOV pc, lr                                   ; return (copy link register to PC)
子程序调用通过带链接的分支指令BL实现,其返回地址保存在R14(LR)中,如果子程序需要调用另外的一个子程序,则必须在R14(LR)被覆盖之前,将其保存在堆栈中。


  • 连续资料载入/存储指令
ARM微处理器支持连续资料的载入/存储指令,可以一次将一片连续的**体单元和多个寄存器之间般移资料。连续载入指令用于将一片连续的**体中的资料般移到多个寄存器,连续资料存储指令则完成相反的操作。
      LDM           连续资料载入指令
      STM          连续资料存储指令
语法:
      LDM(STM) {条件}{类型}基址寄存器{!},寄存器列表{^}
该指令的常见用途是将多个寄存器的内容入堆栈或出堆栈。类型为非堆栈型寻址或堆栈型寻址。
非堆栈型寻址方式有:
       IA(Increment After) 基址寄存器在存取后才增加
       IB(Increment Before)基址寄存器在存取前即增加
       DA(Decrement After)基址寄存器在存取后才减少
       DB(Decrement Before)基址寄存器在存取前即减少
堆栈型寻址类型
   FD(Full Descending) 满递减
   FA(Full Ascending)满递增
   ED(Empty Descending)空递减
   EA(Empty Ascending)空递减
堆栈指令范例   
   STMFD R13!, {R0, R4-R12, LR} ;将寄存器列表中的寄存器存入堆栈
   LDMFD R13!, {R0, R4-R12, PC};将堆栈内容恢复到寄存器
基址寄存器不允许为R15,寄存器列表可以为R0~R14的任意组合。{!}为可选尾码,若选用该尾码,则当资料般移完毕之后,将最后的地址写入到基址寄存器。否则,基址寄存器的内容不改变。{^}为可选尾码,当指令为LDM且寄存器列表包含R15时,选用该尾码还表示除了正常的资料般移外,还将SPSR复制到CPSR;此外还表示传染或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。

相关帖子

沙发
davines| | 2012-2-15 14:46 | 只看该作者
帮顶了。

使用特权

评论回复
板凳
tylhc001| | 2012-2-15 20:37 | 只看该作者
1# 清晨咖啡

使用特权

评论回复
地板
xlhtracy| | 2012-2-20 12:10 | 只看该作者
在全面就更完美了 支持一下

使用特权

评论回复
5
julien| | 2012-2-20 16:14 | 只看该作者
ARM指令集
ADC 带进位的32位数加法
ADD 32位数相加
AND 32位数的逻辑与
B 在32M空间内的相对跳转指令
BIC 32位数的逻辑位清零
BKPT 断点指令
BL 带链接的相对跳转指令
BLX 带链接的切换跳转
BX 切换跳转
CDP CDP2 协处理器数据处理操作
CLZ 零计数
CMN 比较两个数的相反数
CMP 32位数比较
EOR 32位逻辑异或
LDC LDC2 从协处理器取一个或多个32位值
LDM 从内存送多个32位字到ARM寄存器
LDR 从虚拟地址取一个单个的32位值
MCR MCR2 MCRR 从寄存器送数据到协处理器
MLA 32位乘累加
MOV 传送一个32位数到寄存器
MRC MRC2 MRRC 从协处理器传送数据到寄存器
MRS  把状态寄存器的值送到通用寄存器
MSR 把通用寄存器的值传送到状态寄存器
MUL 32位乘
MVN 把一个32位数的逻辑“非”送到寄存器
ORR 32位逻辑或
PLD 预装载提示指令
QADD 有符号32位饱和加
QDADD 有符号双32位饱和加
QSUB 有符号32位饱和减
QDSUB 有符号双32位饱和减
RSB 逆向32位减法
RSC 带进位的逆向32法减法
SBC 带进位的32位减法
SMLAxy 有符号乘累加(16位*16位)+32位=32位
SMLAL 64位有符号乘累加((32位*32位)+64位=64位)
SMALxy 64位有符号乘累加((32位*32位)+64位=64位)
SMLAWy 号乘累加((32位*16位)>>16位)+32位=32位
SMULL 64位有符号乘累加(32位*32位)=64位
SMULxy 有符号乘(16位*16位=32位)
SMULWy 有符号乘(32位*16位>>16位=32位)
STC STC2 从协处理器中把一个或多个32位值存到内存
STM 把多个32位的寄存器值存放到内存
STR 把寄存器的值存到一个内存的虚地址内间
SUB 32位减法
SWI 软中断
SWP 把一个字或者一个字节和一个寄存器值交换
TEQ 等值测试
TST 位测试
UMLAL 64位无符号乘累加((32位*32位)+64位=64位)
UMULL 64位无符号乘累加(32位*32位)=64位

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

149

帖子

1

粉丝