zoukankan      html  css  js  c++  java
  • Arm汇编指令集

    跳转指令:1:使用专门的跳转指令
    2;直接修改PC寄存器的值为跳转地址值 ,从而实现跳转
    MOV LR PC //先把pc值保存起来到LR,返回的时候能找到
    MOV PC 0x232233

    跳转指令
    B 指令的格式: B{条件} 目的地址
    B指令是最简单的跳转指令
    B label 有去无回,不能返回
    BL 指令的格式
    BL的指令和B差不多,唯一不同的是,在跳转之前会在寄存器R14中保存当先pC的值
    和前面说的效果是一样的 ,比他简单。一个指令就实现了前面两条指令,能返回

    BLX 目标地址
    比BL多出的功能是,X是用来切换ARM指令集和Tumbe指令集,之间的切换

    数据处理指令分为几种 {}的意思是可以有可以没有 S的意思是可能会影响CPSR状态寄存
    器 一般不加S
    1,数据的传递指令 MOV {条件}{S} 目的寄存器 源操作数
    MOV R1,R0
    MOV PC,R14
    MOV R1,R0,LSL#3


    MVN指令 MVN {}{} 目的寄存器 源操作数
    MVN R0 , #0xff 把Oxff按位取反,之后放进R0里面去


    比较指令 CMP指令
    CMP{} 操作数1 操作数2
    比较指令 不存储结果 但是影响CPSP的状态


    TST指令 TST{}{}操作数1 操作数2
    两个操作数之间的安位与操作运算 根据结果去更新CPSR中条件标志位的值

    TST R1,#%1 %的意思是二进制的意思

    ADD{}{} 目的寄存器 操作数1 操作数2
    ADD R0,R1,R3


    SUB{}{}目的寄存器 操作数1 操作数2 操作数1减去操作数2


    AND{}{}目的寄存器 操作数1 操作数2
    用于在两个操作数之间做逻辑与

    ORR 逻辑或运算

    BIC指令 清零指令 把Rn的某些位清零
    BIC {}{} Rd,Rn,operand2
    Bic指令用于清除Rn中的某些位,并把结果存放在Rd中,operand2是掩码位,掩码位哪个位
    1.清除哪个


    MUL指令 乘法指令
    MUL{}{}目的寄存器 操作数1 操作数2

    ARM程序状态寄存器访问指令
    MRS指令 MOV不能访问程序状态寄存器 只能访问通用寄存器
    MRS{条件} 通用寄存器,程序状态寄存器(CPSR或者SPSR)
    MRS指令是值将程序状态寄存器的内容传送到通用寄存器当中去
    MRS R0,CPSR

    MSR指令和MRS正好相反 是值传到程序状态寄存器中去
    MSR CPSR ,R0
    有域的概念
    位31:24 条件标志位域 用f表示 23 16 位状态域 用s表示
    位15:8 位扩展位域 用x表示 7 0 位控制位域 用c表示

    MSR CPSR_c ,R0 ;传送R0的内容到SPSR,但仅仅修改CPSR的控制位域


    加载/存储指令 访问内存 内存和寄存器之间的通讯

    LDR {} 目的寄存器 <存储器地址>
    LDR用于从存储器中将一个32位的字数据传送到目的寄存器中,

    LDR R0 ,[R1] R1寄存器放的是内存的地址
    LDR R0 ,[R1,R2]
    LDR R0, [R1,#8]
    LDR R0 ,[R1,R2]! R1+R2放入到R0中,并且将新地址写入R1


    LDRB 这个是一个8位的数据取出来存放到寄存器中
    LDRH 是吧一个16位的数据取出来放在寄存器

    STR把寄存器中的数据存到内存当中的指令
    STR {}源寄存器 《存储器地址》

    STR R0,【R1】,#8


    上面的只是一次加载 存储一个单元 下面的是操作一片
    LDM{条件}{类型} 基址寄存器{!}, {^}

    STM{}{}基址寄存器{!},{^}
    这两个指令主要用于有基址寄存器所指示的一片连续存储器到寄存器列表所表示的多个寄存
    器之间传送数据

    STMFD R13!,{R0,R4-R12,LR}
    把这些寄存器的值存入堆栈
    LDMFD R13! ,{R0,R4-R12,LR}
    从堆栈内容恢复到寄存器中

    数据交换指令
    SWP 字数据的交换 SWP {条件}目的寄存器 ,源寄存器存器2】、
    就是交换
    例如
    SWP R0,R1,【R2】 先把R2放进R0 之后把R1放进R2


    SWPB 字节数据的交换


    LSL移位指令
    ROR移位指令,左端用右端移出的位填进去


    异常产生指令
    SWI 软件中断
    BKPT 断点中断指令


    ARM的伪指令

    符号定义伪指令
    GBLA GBLL GBLS 定义全局变量
    LCLA LCLL LCLS 局部变量
    SETA SETL SETS 对变量赋值

    语法格式
    GBLA GBLL GBLS 全局变量名
    数字变量 逻辑变量 字符串变量
    GBLA test1
    test1 SETA 0xaa 对变量赋值

    RLIST定义寄存器列表
    RegList RLIST {R0-R5,R8,R10}


    DCB指令
    分配一片连续的字节存储单元,并用伪指令中指定的表达式初始化
    标号 DCB 表达式
    Str DCB “this is a test”

    SPACE指令
    标号 SPACE 表达式
    分配大小
    Dataspace SPACE 100 分配一个连续空间100字节的空间


    MAP指令

    MAP 表达式 {, 基址寄存器}

    MAP 0x100,R0


    FILED指令
    分段用的和MAp使用
    MAP 0x100
    A FIELD 16
    B FIElD 32


    汇编控制伪指令

    IF指令
    IF逻辑表达式
    ELSE
    ENDIF

    WHILE指令

    AREA 段名 属性1 属性2
    AREA Init CODE ,READONLY 属性都有DATA CODE READONLY ALIGN


    CODE16 通知编译器 下面的代码为thumb指令
    CODE32

    ENTRY指令 是用于指定汇编程序 的入口点


    EQU指令
    EQU 表达式 {,类型} 类似于C语言的宏定义

    test ETU 50


    EXPORT指令
    EXPORT 标号
    用于程序中声明一个全局的标号,其他文件也能使用了,类似于extern C语言中的

    IMPORT指令
    导入 和EXPORT一起使用

    END指令 代表程序的结束

  • 相关阅读:
    (转)关于IBM小机P520的面板使用
    (转)mysql的sql_mode合理设置
    (转)Mysql技术内幕InnoDB存储引擎-事务&备份&性能调优
    杨辉三角
    异或的陷阱(转)
    通过数组看栈堆
    数组的一些知识点和插入选择冒泡排序
    运算符
    Java的变量相关
    有符号的数据表示法(原、反、补)
  • 原文地址:https://www.cnblogs.com/darren-715/p/3681002.html
Copyright © 2011-2022 走看看