一. 数据处理汇编指令

  1.1. 数据传输指令

    1.1.1.  mov(Move) 指令

      示例:mov  r0, r0, LSL#3           ; r0 = r0* 8

         mov  pc, r14 ; 退出到调用者

         movs PC, r14 ; 退出到调用者并恢复标志位

    1.1.2. mvn(move negative)指令

      示例:mvn r0, #4 ; r0 = -5

           mvn r0, #0 ; r0 = -1

  1.2. 算术指令

    1.2.1. add 指令

      示例:add r0, r1, r2 ; r0 = r1 + r2

            add r0, r1, #256 ; r0 = r1 + 256

           add r0, r2, r3,lsl #1 ; r0 = r2 + (r3 << 1)

      ps:带进位的加法ADC

    1.2.2. sub指令

      示例: sub r0, r1, r2 ; r0 = r1 - r2

            sub r0, r1, #256 ; r0 = r1 - 256

         sub r0, r2, r3 , lsl , #1 ; R0 = R2 - (R3 << 1)

      ps:带进位的减法sbc

    1.2.3. mul指令

      示例:mul r0,r1,r2; r0=r1*r2

         mul r0,r1,#3 ;r0=r1*3

  1.3. 位操作指令

    1.3.1. and 位与

      示例:and  r0,r1,r2 ; r0=r1 & r2

         and  r0,r1,#0xFF  ;r0=r1 & 0xFF

    1.3.2. orr 位或指令

      示例:orr r0,r1,r2  ; r0=r1 | r2

           orr r0,r1,#0xFF ;r0=r1 | 0xFF

    1.3.3. bic 清位操作

      示例:bic   r0,r0,#0xF          ; 等同于 r0 &=~(0xF)

         bic   r0,r0,#%1011   ; 该指令清除 r0 中的位 0 1  3,其余的位保持;   %表示是二进制,0x表示十六进制

  1.4. 比较指令   

    1.4.1. cmp与cmn指令

      a. cmp和cmn比较两个操作数,并把结果存入cpsr供下一句语句使用。比较指令不用后加s后缀就可以影响cpsr中的标志位。   

      示例:cmp cmp r0, r1 等价于 subs r2, r0, r1 (r2 = r0 - r1)

         cmn cmn r0, r1 等价于 adds r2,r0, r1 (r2 = r0 + r1)

    1.4.2. tst指令

      a. tst测试某一位是否为1,并把结果写入cpsr,供下一句使用

        示例:tst r1,#0xffe;   等同于if(r1 & 0xffe)

           tst r1,#%1;测试最低位是否为1,%表示二进制

  1.5. cpsr访问指令

    1.5.1. mrs指令

      a. mrs指令用于将程序状态寄存器的内容传送到通用寄存器中。该指令一般用在以下两种情冴:

        Ⅰ.当需要改变程序状态寄存器的内容时,可用MRS将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。
        Ⅱ.当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存。

      示例:mrs r0,cpsr  @传送cpsr的内容到r0
           mrs r0,spsr  @传送spsr的内容到r0

    1.5.2. msr指令

      a. msr指令用亍将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存器或立即数。<域>用于设置程序状态寄存器中需要操作的位,32位的程序状态寄存器可分为4个域:
      位[31:24]为条件标志位域,用f表示;
      位[23:16]为状态位域,用s表示;
      位[15:8]为扩展位域,用x表示;
      位[7:0]为控制位域,用c表示;

      示例:msr cpsr,r0    @传送r0的内容到cpsr
         msr spsr,r0    @传送r0的内容到spsr
         msr cpsr_c,r0   @传送r0的内容到spsr,但仅仅修改cpsr中的控制位域

  1.6.跳转指令

    1.6.1. b指令

      a. b指令(Branch)表示无条件跳转(就没打开算返回)

      示例:b main ;跳转到标号为main地代码处.

    1.6.2. bl指令

      a. bl指令(Branch with Link)表示带返回值的跳转

      b. bl比b多做一步,在跳转前,bl会把当前位置保存在r14(即lr寄存器),当跳转代码结束后,用mov pc,lr指令跳回来,这实际上就是C语言执行函数的用法,

      汇编里调子程序都用BL,执行完子函数后,可以用mov pc,lr跳回来

      示例:bl delay ;执行子函数或代码段delay ,delay可以为C函数.

  1.7. 多寄存器语句传输指令

    1.7.1. ldm指令

      示例:ldmia r0! ,{r3-r9} ;加r0指向的地址上连续空间的数据,保存到r3-r9当中,!表示r0值更新,ia后缀表示按WORD递增

         ldmfd sp!,{r0-r7,pc}^;恢复现场,异常处理返回,^表示不允许在用户模式下使用。

    1.7.2. stm指令

      示例:stmia r1!,{r3-r9} ;将r3-r9的数据存储到r1指向的地址上,r1值更新。

         stmfd sp!,{r0-r7,lr}; 现场保存,将r0~r7,lr入栈

          stmfd sp!,{r8-r9},把sp寄存器对庆的地址的值存到r8,r9当中.!表示最后的值写入sp中。

  1.8. 其他指令

    1.8.1. swp指令

      a. 寄存器和存储器交换指令

        swp r1,r1,[r0] ;取出r0地址中的数据,放在r1中,并把r1中的数据放在r0中。

    1.8.2. swi指令

      a. 软中断指令用来实现操作系统中系统调用

  1.9. 合法立即数与非法立即数

    1.9.1. ARM指令都是32位,除了指令标记和操作标记外,本身只能附带很少位数的立即数。因此立即数有合法和非法之分

    1.9.2. 合法立即数:经过任意位数的移位后非零部分可以用8位表示的即为合法立即数

ARM汇编2的更多相关文章

  1. 生成ARM汇编

    使用ndk即可生成arm汇编 1.首先写好hello.c 2.编写makefile #ndk根目录 NDK_ROOT=E:\Android\android-ndk-r10b #编译器根目录 TOOLC ...

  2. ARM汇编指令调试方法

    学习ARM汇编时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在 ...

  3. ARM汇编

    ARM汇编 ISA ISA即指指令集架构(Instruction Set Architecture)是与程序设计有关的计算机架构的一部分,包括本地数据类型.指令.寄存器.地址模式.内存架构.中断和意外 ...

  4. 3.1 ARM汇编编程概述

    1. 汇编编程 为什么要学习汇编 1). Bootloader初始化 2). Linux kernel 3). 高效 2. ARM汇编分类 1. ARM标准汇编:ARM公司得汇编器适合在Windows ...

  5. arm汇编进入C函数分析,C函数压栈,出栈,传参,返回值

    环境及代码介绍 环境和源码 由于有时候要透彻的理解C里面的一些细节问题,所有有必要看看汇编,首先这一切的开始就是从汇编代码进入C的main函数过程.这里不使用编译器自动生成的这部分汇编代码,因为编译器 ...

  6. GNU风格 ARM汇编语法指南

    汇编源程序一般用于系统最基本的初始化:初始化堆栈指针.设置页表.操作 ARM的协处理器等.这些初始化工作完成后就可以跳转到C代码main函数中执行. 1.  GNU汇编语言语句格式 任何Linux汇编 ...

  7. 入门 ARM 汇编(一)—— 知识铺垫

    我读着史铁生的散文,零碎的牵扯起我生命中不曾出现过的记忆,一如北方的黄山厚土之中悠忽而来的忧伤的信天游,那些灿若信仰一样的阳光以及阳光下虔诚的子民.我想有一次远行,于细碎流淌的时光与路途之中,观察所有 ...

  8. 常用ARM汇编指令

    常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区  作者:xuyuanfan77 [字体:大 中 小]     在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...

  9. ARM汇编编程概述

    1.为什么需要学些汇编指令 2.ARM汇编指令分类 3.汇编程序框架 4.编程准备 +++++++++++++++++++++++++++++++++++ 1.为什么需要学些汇编指令 bootload ...

  10. ARM 汇编的一些规范

    A.5.1  文件格式        ARM 源程序文件(即源文件)为文件格式,可以使用任一文本编辑器编写程序代码.         在一个项目中,至少要有一个汇编源文件或C 程序文件,可以有多个汇编 ...

随机推荐

  1. Percona Xtrabackup备份mysql大数据库(完整备份与增量备份)

    Percona Xtrabackup备份mysql大数据库(完整备份与增量备份)     文章目录 [隐藏] Xtrabackup简介 Xtrabackup安装 Xtrabackup工具介绍 inno ...

  2. C文件 CMakeList.txt编译器配置错误的问题 error:invalid conversion from 'int' to 'LAYER_TYPE' [-fpermissive]....

    在编译C工程时,遇到了如下错误: 一般看到类型错误,主要考虑是不是编译器错了. 以下引用:https://www.cnblogs.com/liushui-sky/p/7729838.html 后缀为. ...

  3. windows 删除文件或文件夹

    删除文件夹 rd 文件夹名 (只能删除空文件夹) 删除整个文件夹及子文件所有 rd /s 文件夹名(删除该文件及子文件) 删除文件 del 文件名(删除该文件)

  4. Redis分布式锁服务

    阅读目录: 概述 分布式锁 多实例分布式锁 总结 概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源.比如: object obj = new object(); lock (ob ...

  5. POJ 1380 Equipment Box (暴力枚举)

    Equipment Box 题目链接: http://acm.hust.edu.cn/vjudge/contest/130510#problem/B Description There is a la ...

  6. C++ Primer 第四版阅读笔记

    阅读笔记 初始化 变量定义指定了变量的类型和标识符,也可以为对象提供初始值.定义时指定了初始值的对象被称为是 已初始化的.C++ 支持两种初始化变量的形式:复制初始化和 直接初始化.复制初始化语法用等 ...

  7. MK66FN2M0VLQ18

    NXP Kinetis K66: 180MHz Cortex-M4F MCU, 2MB Flash, 256KB SRAM, Dual USBs (FS + HS), Ethernet, 144-LQ ...

  8. Linux安装nslookup命令

    做DNS的人都知道nslookup命令是做什么用的,windows系统自带的.但是linux系统是不自带这个命令的,需要人手动安装.如果您不记得这是哪个软件包提供这个命令的话,那您还真会有些麻烦了.下 ...

  9. Oracle 10046 event

    http://czmmiao.iteye.com/blog/1497509 10046事件概述Oracle的10046事件,可以跟踪应用程序所执行的SQL语句,并且得到其解析次数.执行次数,CPU使用 ...

  10. 图论&线性基(?)(8.12)

    边没有负权,最短路最多只有n条边 很暴力的思想: 先跑一遍最短路,找出最短路上的边,枚举每条边,翻倍,放进原图再跑一遍.取最大值 好熟悉啊 分层建图,建k层 每层内部是原图 若原图中u到v有连边,则由 ...