(32位)arm 汇编学习(1)

来源:互联网 发布:网页软件游戏开发 编辑:程序博客网 时间:2024/06/03 20:37

arm基础

word大小

4字节(32位,这里暂不考虑64位情况)

内存

arm使用26位内存地址值,也就是最多2^26或者说64m字节。需要注意的是,内存中使用4的倍数的地址,因为取值是基于word的。

I/O

输入输出设备被映射到内存中,没有独立的IO地址空间的概念。所以在ARM中,内存被分为RAM,ROM,IO设备3个区域

寄存器

ARM有16个32位寄存器,都可以被不加限制的利用,只有一个寄存器有特殊的限制。

指令

ARM的指令特点:fast and simple

内存和地址取值

1.地址空间:0x0000000~0x3FFFFFF.

2.地址示例

arm地址
左边的地址是word的地址,最低两位始终为0,arm取指令时使用的就是这个地址。

3.在ARM芯片中有一个信号用来标志现在取值是以word为单位还是以byte为单位。

4.最开始的几个word在ARM中有特殊的作用,在一些事件发生的时候,比如ARM被重置或者出现了非法的指令的时候,处理器会自动跳到前几个位置中的一个。

5.关于逻辑地址和物理地址之间的对应,很多基于ARM的机器使用了一个叫做memc,即内存管理器的设备。

memc

上一节我们说到了memc,所以在这里简要的提及一下memc。当一个机器使用了memc,他的内存映射会被分为3个主要的区域:

  • bottom half,底部,32M字节,被称作逻辑RAM,是大多数程序运行时看到的内存。
  • 接下来的16M被分配给物理RAM,只有在superviser模式运行的程序才能看到
  • 顶部的16M字节被ROM和IO设备占用

    逻辑RAM和物理RAM实际上是同一个东西,数据被存在同一个RAM芯片中。但是物理RAM地址是连续的,逻辑RAM可以是分散的地址。物理RAM被分为128页,页大小和机器相关,比如1M字节的机器一页就是8k字节,MEMC可以处理的最大范围是32M,就是32K字节为一页。

在memc中,有一个表用来控制哪一个物理页在内存映射中出现。当一个程序进入一个逻辑内存的时候,MEMC就查到哪个物理RAM和这个地址对应,并且把这个地址传给RAM。

程序员的模型

  • 16个寄存器,都是32位的,除了两个特定用处,其余都是通用的。
  • 2个特定用处寄存器,一个一直都有特殊用处,即PC寄存器,是R15。R14是半特殊用途的,有时也可以用作通用寄存器。
  • R14在bl的时候用来存PC的值,即返回地址。(类似于8086汇编跳转的时候用来存返回地址的栈,只不过这里使用寄存器)
  • R15寄存器为PC寄存器。

R15 PC

被分为了两个部分:(图中的连字符仅仅用作占位)

|31|30|29|28|27|26|25—————————————-|——————2|1–|0-|
|N–|Z–|C—|V-|I—|F–|——-PROGRAM COUNTER (PC)——————–|S1|S0|

2到25位为PC,即下一个用来执行的命令的地址,只有24位,因为指令都是4bit对齐的,所以最后两位肯定是0,只需要24位就可以表示26位的指令地址了。在取指令地址的时候,S1和S0会被自动设置为0。

ARM被重置的时候,PC被设置为0,然后开始从这个位置开始取指令执行,一般来说,PC是在指令被取出之后增长的。

R15 状态寄存器

R15剩下的部分,S1,S0和26位到31位是一个8位的状态寄存器,保存了CPU执行时候的状态。

状态包括两种:

  • 结果状态:表示前一个命令执行结果的状态
  • 系统状态:表示ARM设置的4种操作模式,以及是否特定的中断事件被允许。
种类 位 名称 含义 结果状态 31 N 结果为负标志 结果状态 30 Z 结果为0标志 结果状态 29 C 进位标志 结果状态 28 V 溢出标志 系统状态 27 IRQ 禁用中断标志 系统状态 26 FIQ 快速中断禁用标志 系统状态 1 S1 处理器模式1 系统状态 0 S0 处理器模式0

结果标志

结果状态被寄存器到寄存器指令所影响,具体影响是由指令决定的,在指令中会有描述。这些状态位,1表示true和set,0表示false和cleared。

所有的指令都是可以被结果标志所影响的。

寄存器模式

寄存器模式是由两位数字S1和S0来确定的

S1 S0 模式 0 0 User,用户模式 0 1 FIQ或者快速中断模式 1 0 IRQ或者中断模式 1 1 SVC或者superviser,管理者模式

用户模式和其他模式的区别

管理者模式很大程度上和用户模式相似,但是特定寄存器,比如R13和R14在这个模式下会被替换成私有的一份拷贝,只在这个模式下拥有的一份,称为R13_SVC和R14_SVC,另外,IRQ也有相应的R13_IRQ和R14_IRQ,FIQ则有7个私有拷贝,R8_FIQ一直到R14_FIQ

FIQ和IRQ

用来开启和关闭两个处理器提供的中断。IRQ(interrupt request)将会使得程序只有在irq位被清空的时候才暂停,否则将会被忽略。FIQ(fast interrupt)用处类似,当FIQ被启用的时候,IRQ位会被自动置为1,也就是自动关闭IRQ中断,但是在IRQ启用时候,FIQ还是可以启用。

指令集

通用属性

  • 所有指令都是32位
  • 指令word可以被分为不同的区域,比如典型的条件部分,在有条件的情况下才执行指令

指令类型

  • 数据操作:16条指令,格式类似,比如ADD和CMP,这些指令的操作数都在寄存器中
  • 加载和存储:加载一个数据进寄存器或者存储寄存器数据,只有基于word的传输可以被执行。
  • 多重加载和存储:上一个类型的允许传输单个寄存器,这个类型可以传输多个,用处和上一个类似。
  • 跳转
  • SWI:软中断,使用户访问操作系统提供的功能。
  • 浮点数:最开始ARM是通过协处理器来处理浮点数,其本身是不处理浮点数的,不过现在这些指令已经由软件来实现了。(浮点数指令不是arm基本的指令集,之后不会直接讨论到它)
0 0