一. 数据处理汇编指令

  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. wpf socket 简单通讯示例

    源码下载地址:https://github.com/lizhiqiang0204/WPF-Socket 效果如下:

  2. Azure Messaging

    上篇博文中我们介绍了Azure ServiceBus Messaging的消息事务机制: Azure Messaging-ServiceBus Messaging消息队列技术系列7-消息事务(2017 ...

  3. DevExpress v19.1新版亮点——WinForms篇(二)

    行业领先的.NET界面控件DevExpress v19.1终于正式发布,本站将以连载的形式介绍各版本新增内容.在本系列文章中将为大家介绍DevExpress WinForms v19.1中新增的一些控 ...

  4. hadoop中yarn

    一.yarn的概述 Apache Yarn(Yet Another Resource Negotiator的缩写)是hadoop集群资源管理器系统,Yarn从hadoop 2引入,最初是为了改善Map ...

  5. java:集合输出之Iterator和ListIterator

    在调用Iterator集合输出时,如果想要删除某个元素,请直接使用Iterator来判断元素是否存在然后再删除(next()当前指针内容,remove()删除当前内容 );如果在将集合丢给Iterat ...

  6. 【bzoj2002】弹飞绵羊

    题目 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数k ...

  7. 【leetcode】K-th Symbol in Grammar

    题目如下: 解题思路:直接把每行的数据计算出来肯定是不行的,因为N最大是30,那个第N行长度就是2^30次方,这显然不可取.那么就只能找规律了,我采取的是倒推法.例如假如我们要求出第四行第七个元素的值 ...

  8. HDU-6705 Path

    Description You have a directed weighted graph with n vertexes and m edges. The value of a path is t ...

  9. CodeForces 1197D Yet Another Subarray Problem

    Time limit 2000 ms Memory limit 262144 kB Source Educational Codeforces Round 69 (Rated for Div. 2) ...

  10. Socket网络通信编程(二)

    1.Netty初步 2.HelloWorld 3.Netty核心技术之(TCP拆包和粘包问题) 4.Netty核心技术之(编解码技术) 5.Netty的UDP实现 6.Netty的WebSocket实 ...