Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1261592
  • 博文数量: 548
  • 博客积分: 7597
  • 博客等级: 少将
  • 技术积分: 4224
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-15 13:21
个人简介

嵌入式软件工程师&&太极拳

文章分类

全部博文(548)

文章存档

2014年(10)

2013年(76)

2012年(175)

2011年(287)

分类: LINUX

2011-03-06 20:40:57

  1. ARM指令系统

  2. 一、ARM指令的寻址方式:
  3.    1、数据处理指令寻址方式:
  4.       (1):立即数寻址方式:
  5.              ---指令中的立即数是由一个8bit的常数移动4bit偶数位得到的.eg:mov r0, #0 @将0赋给r0
  6.       (2):寄存器寻址方式:
  7.              ---寄存器的值可以被直接用于数据操作指令.eg:mov r2, r0 @将r0的值赋给r2
  8.       (3):寄存器移位寻址方式:
  9.              ---寄存器的值在被达到ALU之前,可以事先经过移位的处理.eg:add r2, r0, r1, lsr #5 @将r1中的值左移5位,再与r0中的值相加,将结果放到r2中.

  10.    2、内存访问指令寻址方式:
  11.       (1):字及无符号字节的Load/Store指令的寻址方式.
  12.       (2):杂类Load/Store指令的寻址方式.
  13.              ---使用该类寻址方式的指令包括(有符号/无符号)半字Load/Store指令、有符号字节Load/Store指令和双字Load/Store指令.
  14.       (3):批量Load/Store指令寻址方式.
  15.              ---将一片连续内存单元的数据加载到通用寄存器组中或将一组通用寄存器的数据存储到内存单元中(编号低的寄存器对应于内存中低地址单元,高对高).
  16.       (4):堆栈操作寻址方式:
  17.              ---它与上一个批量寻址方式类似,但对于堆栈的操作,数据写入内存各从内存中读出要使用不同的寻址模式,因为进/出栈要在不同的方向上调整堆栈.

  18. 二、ARM指令集:
  19.    在ARM状态下为32位的定长指令集(RISC).
  20.    ARM微处理器的指令集主要有6大类:
  21.    | 跳转指令
  22.    | 数据处理指令
  23.    | 程序状态寄存器传输指令
  24.    | Load/Store指令
  25.    | 协处理器指令
  26.    | 异常中断产生指令
  27.    常用指令:
  28.       (1):数据操作指令: mov:数据传送 ADD:加 CMP:比较 BIC:位清0 MUL:乘
  29.       (2):Load/Store指令:
  30.            1、单寄存器的Load/Store指令:
  31.                 ---这种指令用于把单一的数据传入或者传出一个寄存器,支持的数据类型有字节(8位)、半字(16位)和字(32位).
  32.                           LDR LDRB LDRBT LDRSB
  33.            2、多寄存器的Load/Store指令:
  34.                 ---它也叫批量加载/存储指令,它可以实现在一组寄存器和一块连续的内存单元之间传送数据.
  35.                           LDM:装载多个寄存器 STM:保存多个寄存器
  36.            3、单数据交换指令:
  37.                 ---它把一个寄存器单元的内容与寄存器内容交换,交换指令是一个原子操作.
  38.                           SWP:字交换 SWPB:字节交换
  39.       (3):跳转指令:
  40.              ---ARM一般按照字(32位)地址顺序执行指令。
  41.                    1、需要时使用跳转指令改变程序计数器(PC)指向一个新的地址.(向前或向后的32M地址空间的跳转)
  42.                           B:跳转 BL:带返回的连接跳转 BX:跳转并切换状态 BLX:带返回的跳转并切换状态
  43.                    2、另一种跳转方式是通过直接向PC寄存器中写入目标地址值,实现在4GB地址空间中任意跳转,这种称长跳转.
  44.                          
  45.                 (:)
  46.                     可以用下面3种指令实现子程序返回:
  47.                     1、BX 14
  48.                     2、MOV PC, R14
  49.                     3、当子程序在入口处使用了压栈指令:STMFD ,{<registers>,R14}
  50.                        可以使用指令:LDMFD ,{<registers>,PC}
  51.       (4):状态操作指令:
  52.              ---ARM指令集提供了两条指令,可直接控制程序状态寄存器:
  53.                    MRS:用于把程序状态寄存器(CPSR或SPSR)的值传送到一个寄存器.
  54.                    MSR:把通用寄存器的值送到程序状态寄存器或把一个立即数送到程序状态字

  55. 三、汇编规范:
  56.      .rodata ---只读数据段
  57.      .data ---已初始化数据段
  58.      .bss             ---未初始化数据段
  59.           .text ---代码段
  60.      .align 2 ---按照2的2次方对齐
  61.      .global func ---将本文件中的func程序标号定义为全局
  62.      @ ---表地注释
  63.      ;             ---语句分离符号(相当于C语言中的;)
  64.      #             ---立即数前缀

  65.     2、linux汇编中常数的使用:
  66.         十进制: 以非0的数字开头表示,:124
  67.         二进制: 以0b开头,:0b101001
  68.         八进制: 以0开头的数字,:05645
  69.         十六进制:以0x开头, 如0xab12
阅读(825) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~