<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>ARM Instruction Formats and Timings</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta http-equiv="Content-Language" content="zh-cn">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<link rel="stylesheet" type="text/css" href="../global.css">
</head>
<body>
<!-- embest help header -->
<img src="../arm.gif" width=778 height=73 border=0>
<!-- embest help header -->
<h1 align="center"><font color="#202020">ARM 指令格式和时序</font></h1>
<hr>
<p>在整个文档中,‘字’指的是 32 位(4 字节)的内存。
<hr>
<a name="Contents">
<h2>目录</a> </h2>
<ul>
<li><a href="#Modes">处理器模式</a>
<li><a href="#Registers">寄存器</a>
<li><a href="#Pipeline">流水线</a>
<li><a href="#Timings">时序</a>
<li><a href="#Instructions">指令</a>
<ul>
<li><a href="#Condition">条件代码</a>
<li><a href="#Data">数据处理指令</a>
<li><a href="#Branch">分支指令</a>
<li><a href="#Multiplication">乘法</a>
<li><a href="#Long">长乘法(ARM7DM)</a>
<li><a href="#Transfer">单一数据传送</a>
<li><a href="#Block">块数据传送</a>
<li><a href="#Software">软件中断</a>
<li><a href="#CoproOp">协处理器数据操作</a>
<li><a href="#CoproTrans">协处理器数据传送和寄存器传送</a>
<li><a href="#Swap">单一数据交换(ARM 3 和以后,包括 ARM 2aS)</a>
<li><a href="#Status">状态寄存器传送(ARM 6 和以后)</a>
<li><a href="#Undefined">未定义指令</a></li>
</ul>
<li><a href="#Credits">贡献</a></li>
</ul>
<hr>
<a name="Modes">
<h2>处理器模式</h2>
</a>
<p>ARM 有一个用户模式和多个有特权的超级用户模式。它们是:
<dl>
<dt>IRQ
<dd>在触发中断请求(IRQ)时进入。
<dt>FIQ
<dd>在触发快速中断请求(FIQ)时进入。
<dt>SVC
<dd>在指令一个软件中断(SWI)时进入。
<dt>Undef
<dd>在执行了一个未定义的指令时进入(不存在于 ARM 2 和 3,在这里进入
SVC 模式)。
<dt>Abt
<dd>在一个内存访问尝试被内存管理器(例如,MEMC 或 MMU)所终止时进入,通常因为所做的尝试要访问不存在的内存或者在没有充足特权的模式下访问内存(不存在于
ARM 2 和 3,在这里进入 SVC 模式)。</dd>
</dl>
<p>在每种情况下还调用适当的硬件向量。
<p>
<hr>
<a name="Registers">
<h2>寄存器</h2>
</a>
<p>ARM 2 和 3 有 27 个 32
位处理器寄存器,在任何给定时间只有其中的 16 个是可见的(是哪十六个取决于处理器模式)。它们被引用为
R0-R15。
<p>ARM 6 和以后有 31 个 32
位处理器寄存器,在任何给定时间只有其中的 16
个是可见的。
<p>R15 特别重要。在 ARM 2 和 3,其中的 24
位用做程序计数器,而余下的 8
位用于保持处理器模式、状态标志和中断模式。所以 R15
经常被称做 PC。
<pre> R15 = PC = NZCVIFpp pppppppp pppppppp ppppppMM
</pre>
位 0-1 和 26-31 被称为 PSR (处理器状态寄存器)。位 2-25
给出被取回到指令流水线中的当前指令的(以字为单位)地址 (见后)。所以永远只能从字对齐的地址执行指令。 <! center BOXED ;
l VLINE l. >
<pre>M 当前处理器模式
0 用户模式
1 快速中断处理模式(FIQ 模式)
2 中断处理模式(IRQ 模式)
3 超级用户模式(SVC 模式)
</pre>
<! center BOXED ;
l l. >
<pre>名字 意思
N 负数(Negative)标志
Z 零(Zero)标志
C 进位(Carry)标志
V 溢出(oVerflow)标志
I 中断(Interrupt)请求禁用
F 快速(Fast)中断请求禁用
</pre>
<p>R14、R14_FIQ、R14_IRQ、和 R14_SVC
由于它们在带连接的分支指令期间的行为而有时被称为‘连接’寄存器。
<p>ARM 6 和以后的处理器核心支持 32
位地址空间。这些处理可以在 26 为和 32 位 PC
模式二者下操作。 在 26 位 PC 模式下,R15
表现如同在以前的处理器上,所以代码只能运行在地址空间的最低的
64M 字节中。在 32 位 PC 模式下,R15 所有 32
位用做程序计数器。使用独立的状态寄存器来存储处理器模式和状态标志。PSR
定义如下:
<pre> NZCVxxxx xxxxxxxx xxxxxxxx IFxMMMMM
</pre>
注意在 32-bit 模式下 R15 的底端两位总是零 -
就是说你仍然只能得到字对齐的指令。忽略对这两位写非零的任何尝试。
<p>当前定义了下列模式: <! center BOXED ;
l VLINE c VLINE l. >
<pre>M 名字 意思
00000 usr_26 26 位 PC Usr 模式
00001 fiq_26 26 位 PC FIQ 模式
00010 irq_26 26 位 PC IRQ 模式
00011 svc_26 26 位 PC SVC 模式
10000 usr_32 32 位 PC Usr 模式
10001 fiq_32 32 位 PC FIQ 模式
10010 irq_32 32 位 PC IRQ 模式
10011 svc_32 32 位 PC SVC 模式
10111 abt_32 32 位 PC Abt 模式
11011 und_32 32 位 PC Und 模式
</pre>
<p>推测自上面的表,可能期望还定义了下列两个模式: <! center BOXED ;
l VLINE c VLINE l. >
<pre>M 名字 意思
00111 abt_26 26 bit PC Abt Mode
01011 und_26 26 bit PC Und Mode
</pre>
实际上未定义它们(如果你确实向模式位写了 00111 或 01011,结果的芯片状态不会是你所希望的
- 就是说不会是有适当的 R13 和 R14 被交换进来的一个 26-bit
特权模式。
<p>下表展示在每个处理器模式下可获得那些的寄存器:
<pre>
+------+---------------------------------------+
| 模式 | 可获得的寄存器 |
+------+---------------------------------------+
| USR | R0 - R14 R15 |
+------+---------+-----------------------------+
| FIQ | R0 - R7 | R8_FIQ - R14_FIQ R15 |
+------+---------+----+------------------------+
| IRQ | R0 - R12 | R13_IRQ - R14_IRQ R15 |
+------+--------------+------------------------+
| SVC | R0 - R12 | R13_SVC - R14_SVC R15 |
+------+--------------+------------------------+
| ABT | R0 - R12 | R13_ABT - R14_ABT R15 | (ARM 6 和以后)
+------+--------------+------------------------+
| UND | R0 - R12 | R13_UND - R14_UND R15 | (ARM 6 和以后)
+------+---------------------------------------+
</pre>
<p>在 ARM6
和以后的处理器上有六个状态寄存器。一个是当前处理器状态寄存器(CPSR),持有关于当前处理器状态的信息。其它五个是保存的程序状态寄存器(SPSR):
每个特权模式都有一个,持有完成在这个模式下的例外处理时处理器必须返回的关于状态的信息。
<p>分别使用 MSR 和 MRS 指令来设置和读取这些寄存器。
<p>
<hr>
<a name="Pipeline">
<h2>流水线</h2>
</a>
<p>不同于微编码的处理器,ARM (保持它的 RISC 性)是完全硬布线的。
<p>为了加速 ARM 2 和 3 的执行使用 3
阶段流水线。第一阶段持有从内存中取回的指令。第二阶段开始解码,而第三阶段实际执行它。故此,程序计数器总是超出当前执行的指令两个指令。(在为分支指令计算偏移量时必须计算在内)。
<p>因为有这个流水线,在分支时丢失 2 个指令周期(因为要重新添满流水线)。所以最好利用条件执行指令来避免浪费周期。例如:
<pre>
...
CMP R0,#0
BEQ over
MOV R1,#1
MOV R2,#2
over
...
</pre>
可以写为更有效的:
<pre>
...
CMP R0,#0
MOVNE R1,#1
MOVNE R2,#2
...
</pre>
<p>
<hr>
<a name="Timings">
<h2>时序</h2>
</a>
<p>ARM 指令在时序上是 S、N、I 和 C 周期的混合。
<p>S 周期是 ARM 在其中访问一个顺序的内存位置的周期。
<p>N 周期是 ARM 在其中访问一个非顺序的内存位置的周期。
<p>I 周期是 ARM
在其中不尝试访问一个内存位置或传送一个字到/从一个协处理器的周期。
<p>C 周期是 ARM 在其中与一个协处理器之间在数据总线(对于无缓存的
ARM)或协处理器总线(对于有缓存的 ARM)上写传送一个字的周期。
<p>各种类型的周期都必须至少与 ARM
的时钟周期一样长。内存系统可以伸展它们: 对于典型的 DRAM
系统,结果是:
<ul>
<li>N 周期变成最小长度的两倍(主要因为 DRAM
在内存访问是非顺序时要求更长的访问协议)。
<li>S 周期通常是最小长度,但偶尔也会被伸展成 N
周期的长度(在你从一个内存“行”的最后一个字移动到下一行的第一个字的时候<a href="#Footnote1">[1]</a>)。
<li>I 周期和 C 周期总是最小长度。</li>
</ul>
<p>对于典型的 SRAM
系统,所有类型的周期典型的都是最小长度。
<p>在 Acorn Archimedes A440/1 使用的 8MHz ARM2 中,一个 S (顺序)
周期是 125ns 而一个 N (非顺序) 周期是 250ns。应当注意到这些时序不是
ARM 的属性,而是内存系统的属性。例如,一个 8MHz ARM2
可以与一个给出 125ns 的 N 周期的 RAM
系统相连接。处理器的速率是 8MHz
只是简单的意味着如果你使任何类型的周期在长度上小于
125ns 则它不保证能够工作。
<p>有缓存的处理器: 所有给出的信息依据 ARM
所见到的时钟周期。它们不按固定的速率发生:
缓�
ARM汇编指令集查看手册
需积分: 50 122 浏览量
2018-10-21
16:36:56
上传
评论
收藏 166KB ZIP 举报
Abc2149
- 粉丝: 13
- 资源: 32
最新资源
- Screenshot_20240427_031602.jpg
- 网页PDF_2024年04月26日 23-46-14_QQ浏览器网页保存_QQ浏览器转格式(6).docx
- 直接插入排序,冒泡排序,直接选择排序.zip
- 在排序2的基础上,再次对快排进行优化,其次增加快排非递归,归并排序,归并排序非递归版.zip
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
- 课设-内部排序算法比较 包括冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序和堆排序.zip
- Python排序算法.zip
- C语言实现直接插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序、归并排序、计数排序,并带图详解.zip
- 常用工具集参考用于图像等数据处理
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈