ARM 指令集(中文版) Assembly Instructions

User Manual:

Open the PDF directly: View PDF PDF.
Page Count: 80

1
ARM 指令集
寄存器和处理器模式(26-bit 体系)
寄存器和处理器模式(32-bit 体系)
程序状态寄存器和操纵它的指令
寄存器装载和存储指令
算术和逻辑指令
移位操作
乘法指令
比较指令
分支指令
条件执行
软件中断指令
APCS (ARM 过程调用标准)
编写安全的 32-bit 代码的基本规则
IEEE 浮点指令
汇编器伪指令
指令快速查找
ARM 指令格式
寄存器和处理器模式
ARM 处理器有二十七个寄存器,其中一些是在一定条件下使用的,所以一次只能使用十六
...
寄存器 0 到寄存器 7 是通用寄存器并可以用做任何目的。不象 80x86 处理器那样
要求特定寄存器用做栈访问或者象 6502 那样把数学计算的结果放置到一个
器中,ARM 处理器在寄存器使用高度灵活的。
寄存器 8 12 是通用寄存器,是在切换 FIQ 模式的时候,使用它影子
(shadow)寄存器。
寄存器 13 典型的用做 OS 用做一个通用寄存器。是一个操作系
统问题是一个处理器问题,所以如果你不使用,只要你后恢复它,可以
的代码中自由(corrupt)它。个处理器模式个寄存器的影子寄存
器。
寄存器 14 专职持返回点的地址便于子例程。当你执行带连接的分支的时候
把返回地址存储到 R14 中。同样在程序一次行的时候把退出地址保存在 R14
中。R14 的所有实例必须被保存到其寄存器中(实际上)一个中。
PDF created with pdfFactory trial version www.pdffactory.com
2
个寄存器在个处理器模式下影子寄存器。一旦已经保了连接地址个寄
存器可以用做通用寄存器
寄存器 15 是程序计数器。它除了持有指程序当前使用的地址的二十六位数之外
还持有处理器的状态。
为更清晰一些... 提供列图表:
User 模式 SVC 模式 IRQ 模式 FIQ 模式 APCS
R0 ------- R0 ------- R0 ------- R0 a1
R1 ------- R1 ------- R1 ------- R1 a2
R2 ------- R2 ------- R2 ------- R2 a3
R3 ------- R3 ------- R3 ------- R3 a4
R4 ------- R4 ------- R4 ------- R4 v1
R5 ------- R5 ------- R5 ------- R5 v2
R6 ------- R6 ------- R6 ------- R6 v3
R7 ------- R7 ------- R7 ------- R7 v4
R8 ------- R8 ------- R8 R8_fiq v5
R9 ------- R9 ------- R9 R9_fiq v6
R10 ------ R10 ------ R10 R10_fiq sl
R11 ------ R11 ------ R11 R11_fiq fp
R12 ------ R12 ------ R12 R12_fiq ip
R13 R13_svc R13_irq R13_fiq sp
R14 R14_svc R14_irq R14_fiq lr
------------- R15 / PC ------------- pc
最右侧 APCS 代码使用的名字 APCS 详情参见
程序计数构造:
31 30 29 28 27 26 25------------2 1 0
N Z C V I F S1 S0
R15 详细解释请参见 psr.html
想知道"模式",比如上"FIQ"模式。
模式,用程序的通模式。限制访问你不读取硬
设备
超级模式(SVC 模式) SWI(软件中断) OS(操作系)个模式有
特权允许步控制例如你必须进入超级模式来读取
(podule)这不能在用模式下完成
PDF created with pdfFactory trial version www.pdffactory.com
3
中断模式(IRQ 模式),用处理发起中断的个模式是有的。导致 IRQ
设备键盘、 VSync (发生屏幕刷新时候)IOC 、串口、硬盘、
盘、等等...
快速中断模式(FIQ 模式),用处理发起快速中断的个模式是有的。
导致 FIQ 设备有处理的软端口( 82C71x A5000)
Econet
IRQ FIQ 区别 FIQ 你必须快处理事情离开个模式。IRQ 可以
FIQ 所中断 IRQ 能中断 FIQ为了使 FIQ 快,所以有影子寄存器。FIQ
调用 SWIFIQ 还必须用中断。如果一个 FIQ 必须重新启用中断,则它太慢
IRQ FIQ Phew!
于如果处理器的模式的详情请参照 psr.html
32 位操作
许多信息取 ARM 汇编器手册我现 32 位处理器,只能文档...
文档 UMUL UMLA 只能在 32bit 模式下行是错误的。如果你的处理器(:
StrongARM)可以做,则它可以在 32bit 26bit ...
ARM2 ARM3 有一个 32 总线和一个 26 地址总线。在以本的 ARM
总线地址者都全的 32 解释了为什么一个32 位处理器 26
位。和指令/大小 32 位,并这样但地址总线只是 24 位。 PC
字对的,一个地址中的低两,所以在 ARM2/ARM3 处理器上这些位有处理器
模式实际上只使用 24 位,PC 的有 26 位。
上这问题4Mb 存是基准的。一些人升 8Mb 16Mb 是理限制
(Some people upgraded to 8Mb, and 16Mb was the theoretical limit.) RiscPC 使
用一个 26 位程序计数器是可能的, RiscPC 允许安装 258Mb 存, 26 位只
%11111111111111111111111100 ( 67108860 64Mb)解释
对应用任 28Mb 大小限制希望与老 RISC OS API 相容
个汇编器点的覆盖 32 位模式(如运行在 SVC32 下的一个
!)分是 26 位模式操作的,为了 RISC OS 当前获得
兼容( RISC OS 2 RISC OS 4)注意例子不 32 位。
RiscPCMicoRiscStationA7000 有能全的 32 位操作系实际上
ARMLinux 这样的一个操作系RISC OS 是, RISC OS 至少一个
保持本的兼容是个古老问题(dichotomy),有一个 32
本的 RISC OS 本是美妙的,但当你发现许多存软件继续(so much as load)
就不那么美妙!
PDF created with pdfFactory trial version www.pdffactory.com
4
RISC OS 全的 26 位。一些处理程序(handler)作在 32 位模式下限制它的
金钱( RISC OS 付钱;谁来重的代码的开发工具付钱(PD
RISC OS 强壮))必要(使用 Impression CC 再与们同
Impression 象不能在 RISC OS 作,所以如果的软件作,
他们不会认必要)
什么这如? ARM 处理器 26 位操作。一些融合(ARM6ARM7
StrongARM)数就要可以一个 26/32 位系杂性或者只用 32
简单的处理器。们要么随波逐流... 所以无选择
32 位体系
ARM 体系在 ARM6 。下面我将描述 26 32 位操作行不同
处。
ARM 6 中,程序计数 32 位。结果:
PSR PC 中分的寄存器 CPSR(当前的程序状态寄存器)中。
处理器模式的时候再与 PC PSR在是个有的模式
有一个的寄存器 - SPSR (存的程序状态寄存器) - 模式的
PSR
加了使用寄存器的指令。
除了允许 PC 使用全的 32 之外 PSR 加了的有
的模式。些模式用处理指令异常终止例外:
指令异常终止超级共享一个模式。去掉 ARM
在的对超级限制
ARM6 (和以的其兼容芯片)中通过控制寄存器
的可获得性。可以选择个处理器中的一个:
o 26 位程序和 ARM 26 地址行操作。
中只能获得 26 位模式(参照处理器模式描述)可能选择
任何 32 位模式。在所有当前 ARM6 7 上复(reset)时被置为
个模式。
o 26 位程序 32 除了地址例外来允许传送操作
访问 32 地址之外 26 位程序和地址
o 32 位程序和置把地址 32 位,并
理器模。在可以选择任何 26 位和 32 位处理器
模式(参见的处理器模式)
32 位程序和时候ARM6 ARM7 十个有所的处理器操
作模式:
模式: 正常的程序执行状态
User26 模式: 一个 26 本。
PDF created with pdfFactory trial version www.pdffactory.com
5
FIQ 模式: 一个传送处理
FIQ26 模式: 一个 26 本。
IRQ 模式: 通用中断处理
IRQ26 模式: 一个 26 本。
SVC 模式: 操作系模式
SVC26 模式: 一个 26 位模式。
异常终止模式(ABT 模式): 在一个指令异常终止(abort)时候进入
模式。
模式(UND 模式): 在执行一个的指令的时候进入的模式。
在一个 26 位处理器模式中的时候,编程模退 26 ARM 处理器。除了
列变之外,它的行 ARM2aS (macrocell):
只在 ARM 置为 26 位程序和时候,它生成地址例外。在其
OS 可以通过使用逻辑模地址例外的行,比用一个
64Mbyte 范围时候生成一个异常终止,并把这异常终止
用程序的一个地址例外
保持在通用寄存器和程序状态寄存器传送指令可操作。在调用包含
26 位的 ARM 进制代码的之后,操作系可以使用指令返回到一个 32
模式。
在一个 32 位程序和下的时候,所有例外(包括未指令和软件中
)处理器返回到一个 32 位模式,所以必须修改操作系处理它
如果处理器尝试写到在 &0 &1F 包括(例外向量)的一个位,则
写操作并生成一个异常终止允许操作系例外向量
向量到一些伪装(veneer)代码。在调用 26 例外处理程序之前
些伪装代码应该处理器置于一个 26 位模式中。
在所有其在一个 26 位模式下行操作的时候ARM 表现如同一个 26 ARM
CPSR 的位(incorporated) R15 中, I F 位在位 27 26
PC/PSR。指令表现如同加了 MRS MSR 指令的 ARM2aS
ARM 6(和以) 32 位模式下可获得的寄存器有:
User26 SVC26 IRQ26 FIQ26 User SVC IRQ ABT UND
FIQ
R0 ----- R0 ----- R0 ----- R0 -- -- R0 ----- R0 ----- R0 ----- R0 ----- R0 -----
R1
R1 ----- R1 ----- R1 ----- R1 -- -- R1 ----- R1 ----- R1 ----- R1 ----- R1 -----
R2
R2 ----- R2 ----- R2 ----- R2 -- -- R2 ----- R2 ----- R2 ----- R2 ----- R2 -----
R2
PDF created with pdfFactory trial version www.pdffactory.com
6
R3 ----- R3 ----- R3 ----- R3 -- -- R3 ----- R3 ----- R3 ----- R3 ----- R3 -----
R3
R4 ----- R4 ----- R4 ----- R4 -- -- R4 ----- R4 ----- R4 ----- R4 ----- R4 -----
R4
R5 ----- R5 ----- R5 ----- R5 -- -- R5 ----- R5 ----- R5 ----- R5 ----- R5 -----
R5
R6 ----- R6 ----- R6 ----- R6 -- -- R6 ----- R6 ----- R6 ----- R6 ----- R6 -----
R6
R7 ----- R7 ----- R7 ----- R7 -- -- R7 ----- R7 ----- R7 ----- R7 ----- R7 -----
R7
R8 ----- R8 ----- R8 R8_fiq R8 ----- R8 ----- R8 ----- R8 ----- R8
R8_fiq
R9 ----- R9 ----- R9 R9_fiq R9 ----- R9 ----- R9 ----- R9 ----- R9
R9_fiq
R10 ---- R10 ---- R10 R10_fiq R10 ---- R10 ---- R10 ---- R10 ---- R10
R10_fiq
R11 ---- R11 ---- R11 R11_fiq R11 ---- R11 ---- R11 ---- R11 ---- R11
R11_fiq
R12 ---- R12 ---- R12 R12_fiq R12 ---- R12 ---- R12 ---- R12 ---- R12
R12_fiq
R13 R13_svc R13_irq R13_fiq R13 R13_svc R13_irq R13_abt
R13_und R13_fiq
R14 R14_svc R14_irq R14_fiq R14 R14_svc R14_irq R14_abt
R14_und R14_fiq
--------- R15 (PC / PSR) --------- --------------------- R15 (PC)
---------------------
----------------------- CPSR
-----------------------
SPSR_svc SPSR_irq SPSR_abt
SPSR_und SPSR_fiq
32 位的 26 位的不同:
PC 全的 32 ,并只用做程序计数器。
PSR 包含在它的寄存器 CPSR 中。
个有的模式有一个有的 SPSR 寄存器,用 CPSR
模式,个有的模式 R13 R14 件。
CPSR SPSR 寄存器
CPSR 寄存器(存它的 SPSR 寄存器)中的位分:
31 30 29 28 --- 7 6 - 4 3 2 1 0
PDF created with pdfFactory trial version www.pdffactory.com
7
N Z C V I F M4 M3 M2 M1 M0
0 0 0 0 0 User26 模式
0 0 0 0 1 FIQ26 模式
0 0 0 1 0 IRQ26 模式
0 0 0 1 1 SVC26 模式
1 0 0 0 0 User 模式
1 0 0 0 1 FIQ 模式
1 0 0 1 0 IRQ 模式
1 0 0 1 1 SVC 模式
1 0 1 1 1 ABT 模式
1 1 0 1 1 UND 模式
NZCV IF 中断标请参见(26 ) PSR
这在实践中意味着什么?
ARM 代码正确作。作的是通过摆弄 R15 来设处理器状态的些操
作。的是,便问题一个有问题 9K 程序(
MODE 7 teletext frame viewer,用 C 写的),基本查找:
R15 目的寄存器的 MOVS 指令。
^为后并装载 R15 LDMFD 指令。
64 个指令
什么。基本...
统如知道个是个是代码。实际上,一个的基规则的程序能
以做非常猜测非常猜测足够?
简单的指令代。一个可以修补的指令并调(jiggle)周围的代
码,但这导致希望作用,比一个 ADR 指令(directive)范围(in
range)
技巧(It is incredibly hacky)重新修改源
代码。
的。这样(far-reaching)后果
PDF created with pdfFactory trial version www.pdffactory.com
8
程序状态寄存器
MRS
MSR
R15/PSR 32-bit 模式下的详情
寄存器 15 (26-bit 模式):
R15 构造:
Bit 31 30 29 28 27 26 25------------2 1 0
N Z C V I F S1 S0
:
N Negative 如果结果
Z Zero 如果结果
C Carry 如果发生进位则
O Overflow 如果发生
I IRQ 中断
F FIQ 快速中断
S1 S0 是处理器模式标:
S1 S0 模式
0 0 USR - 模式
0 1 FIQ - 快速中断模式
1 0 IRQ - 中断模式
1 1 SVC - 超级模式
R15 一个指令的一个操作时候,只有程序计数分是可以获得的。所以,
指令 PC 到一个寄存器中并个目标寄存器加上 256:
ADD R0, R15, #256
( BASIC 汇编器 R15 PC )
PDF created with pdfFactory trial version www.pdffactory.com
9
R15 为第二个操作时候,所有 32 是可以获得: 程序计数和状
态。下代码当前的处理器模式:
MOV R0, #3 ; 装载一个位(%11) R0
AND R0, R0, PC; R15 R0 做逻辑把结果放 R0到模式状态
CMP R0, #3 ; 模式 '3' 比较(SVC)
BEQ svc ; 如果 SVC 模式,分支到 'svc'
CMP R0, #2 ; 模式 '2' 比较 (IRQ)
BEQ irq ; 如果 IRQ 模式,分支到 'irq'
CMP R0, #1 ; 模式 '1' 比较(FIQ)
BEQ fiq ; 如果 FIQ 模式,分支到 'fiq'
CMP R0, #0 ; 模式 '0' 比较(USR)
BEQ usr ; 如果 USR 模式,分支到 'usr'
例子不遵从 32-bit 体系。何在 32-bit 当前的模式请参照
处理器的状态:
处理器模式或者任何标的标 EOR()状态标状态 =
状态 EOR (1 << 28) 可以 oVerflow 的伪码。们不能做简单
EORS 操作,导致个指令过。不要担心,指令 TEQ 做一个
EOR (结果不存储到任何) P 缀组,则把结果 01 26 31
写到 R15 01 26 31 位,的一个便
: TEQP R15, bit_mask
如果你处在允许一个标的一个模式中,则只可以个标
例子不遵从 32-bit 体系。何在 32-bit 模式请参照
可以处理器模式。例如进入 SVC 模式可以:
MOV R6, PC ; PC 状态存储到 R6
ORR R7, R6, #3 ; SVC 模式
TEQP R7, #0 ; ( R7 中的)模式标 PC
PDF created with pdfFactory trial version www.pdffactory.com
10
返回的模式是:
TEQP R6, #0 ; ( R6 中的)的模式写 PC
模式之后应该进行一个操作来允许个寄存器安定下。比 MOV R0, R0
东西可以。废弃使用 NV 的指令。
32 PSR
如同32 位操作描述那样ARM 3 之后的处理器提供一个 32 bit 地址,它
PSR R15 R15 32 位位,在其中存储当前地址。目
一些可能到的之外RISC OS 作在 26 位模式。
32 位模式是的, 26 ( PSR )把每用程序的可存的
限制 28Mb这就安装你不 28Mb 的下一个(drag the
Next slot beyond 28Mb)
CPSR 寄存器(存它的 SPSR 寄存器)中的位分:
31 30 29 28 --- 7 6 - 4 3 2 1 0
N Z C V I F M4 M3 M2 M1 M0
0 0 0 0 0 User26 模式
0 0 0 0 1 FIQ26 模式
0 0 0 1 0 IRQ26 模式
0 0 0 1 1 SVC26 模式
1 0 0 0 0 User 模式
1 0 0 0 1 FIQ 模式
1 0 0 1 0 IRQ 模式
1 0 0 1 1 SVC 模式
1 0 1 1 1 ABT 模式
1 1 0 1 1 UND 模式
PDF created with pdfFactory trial version www.pdffactory.com
11
典型的,处理器 User26FIQ26IRQ26 SVC26 下操作。可以进入一个 32 位模式,
但要RISC OS 希望这样,并如果发现在其中非常!
操纵 32 PSR 的指令
你不能在 32 位模式中使用 MOVS PC, R14 LDMFD R13!, {registers, PC}^
能使用 ORRS PC, R14, #1<<28 来设 V 使用 MRS MSR
一个寄存器到 PSR
MSR CPSR, R0 ; R0 CPSR
MSR SPSR, R0 ; R0 SPSR
MSR CPSR_flg, R0 ; R0 的标位到 CPSR
MSR CPSR_flg, #1<<28 ; (立即值)位到 CPSR
PSR 到一个寄存器中
MRS R0, CPSR ; CPSR R0
MRS R0, SPSR ; SPSR R0
指令格式
PSR - CPSR 当前的程序状态寄存器(Current Program Status Register)
SPSR 存的程序状态寄存器(Saved Program Status Register)(的处理器模式的
PSR)个有的模式 SPSR,可获得 PSR :
CPSR_all - 当前
SPSR_svc - 存的,SVC(32) 模式
SPSR_irq - 存的,IRQ(32) 模式
SPSR_abt - 存的,ABT(32) 模式
SPSR_und - 存的,UND(32) 模式
SPSR_fiq - 存的,FIQ(32) 模式
你不式的指定 CPSR 存到 SPSR 中,比 SPSR_fiq必须 FIQ
式并存到 SPSR句话只能在所在的模式中个模式的 SPSR。使用
_flg 允许不影控制位。
PDF created with pdfFactory trial version www.pdffactory.com
12
user(32) 模式中, CPSR 控制位,只能条件标。在其模式中,可获得
CPSR你不应该指定 R15 一个寄存器一个目标寄存器。,在 user(32)
式中,你不尝试访问 SPSR存在!
V :
MSR CPSR_flg, #&10000000
V 但不影控制位。
模式:
MRS R0, CPSR_all ; PSR
BIC R0, R0, #&1F ; 清除模式位
ORR R0, R0, #new_mode ; 模式位置为模式
MSR CPSR_all, R0 ; PSR模式
们要做的是进入 SVC32 模式并 Z 们返回 SVC26 模式并‘测试’
置了 Z
RISC OS 希望发现处在 32 位模式中,所以们要所有中断并保持们这样
(keep them that way)些代码应该执行的非常快,们不任何风险...
可能 32 位模式非常有用。在当前本的 RISC OS 下,实际上
我而32 位模式提供的只是:
访问 28Mb 。在 RISC OS 上这不,在个系 web 浏览适合
1 M 2 M而重术程序为那非常象提供们自存系
文档本,和 ARM 汇编器指包括...
StrongARM 提供了个指令(UMUL UMLAIIRC),它处理 64 位乘法。只能在 32
模式下获得
错误的。在 26 位模式下可以使用的乘法MP3 码器使用!
32 位模式的利益象不的处理器( Xscale) 26
位模式,所以 RISC OS 和它的用程序 32 作则必须经修改起来
如果所有/ R15 中的 PSR 位的都必须被更为 R15 中的
独立 PSR 用,这就变成一个非常问题了你不继续用一个指令
恢复 PSR 并分支到调用独立的指令。代码必须写。你不
的用一个指令修补...
PDF created with pdfFactory trial version www.pdffactory.com
13
寄存器装载和存储
LDM
LDR
STM
STR
SWP
可能是能获得有用的指令。其指令操纵寄存器,所以必须把数
存装载寄存器并寄存器中的存储到存中。
传送单一数据
使用传送指令(STR LDR)装载和存储/
存。非常灵活的。
首先让指令格式:
LDR{条件} Rd, <地址>
STR{条件} Rd, <地址>
LDR{条件}B Rd, <地址>
STR{条件}B Rd, <地址>
指令格式
些指令装载和存储 Rd /到指定的地址如果象后个指令那样还
B,则只装载存储一个一的节;装载,寄存器中
被置(zeroed)
地址可以是一个简单一个或者是一个移位的。可以
可以的有效地址到基寄存器(除了/操作的)
式的示例
中的 Rbase 寄存器,Rindex 寄存器,index
12 位的符号。用移位。标准
- AT&T 示为 disp(base, index, scale),用 Intel 示为
[base + index*scale + disp],中的(连带)兼得
STR Rd, [Rbase] 存储 Rd Rbase 包含的有效地址
PDF created with pdfFactory trial version www.pdffactory.com
14
STR Rd, [Rbase, Rindex] 存储 Rd Rbase + Rindex 的有
地址
STR Rd, [Rbase, #index] 存储 Rd Rbase + index 的有效地
index 是一个立即值
例如STR Rd, [R1, #16] Rd 存储到
R1+16
STR Rd, [Rbase, Rindex]! 存储 Rd Rbase + Rindex 的有
地址
把这地址 Rbase
STR Rd, [Rbase, #index]! 存储 Rd Rbase + index 的有效地
把这地址 Rbase
STR Rd, [Rbase], Rindex 存储 Rd Rbase 包含的有效地址
Rbase + Rindex 的有效地址
Rbase
STR Rd, [Rbase, Rindex, LSL #2]
存储 Rd Rbase + (Rindex * 4)
的有效地址
STR Rd, place 存储 Rd PC + place 的有效地址
你当可以在些指令使用条件执行。但要注意条件标,所以如果你
结果时候装载一个 用的指令是 LDREQB Rx, <address> (
LDRBEQ...)
如果你指定(的基址都方括),用是存在!
来控制操作。45例子中使用了这个标可以使用它
存中动正向。一个打印变成:
.loop
LDRB R0, [R1, #1]!
SWI "OS_WriteC"
CMP R0, #0
BNE loop
:
.loop
LDRB R0, [R1]
SWI "OS_WriteC"
ADD R1, R1, #1
PDF created with pdfFactory trial version www.pdffactory.com
15
CMP R0, #0
BNE loop
!(方括,比如上例子
6)的。
如同你到的那样可以移位之外,可以址上
。在下,可以使用下代码:
LDRB R0, [R1, #-1]
可以存储装载 PC但你不可以用装载存储指令修改 PSR装载
一个存储的状态正确恢复它,使用:
LDR R0, [Rbase]
MOVS R15, R0
如你在有的模式下,MOVS 导致 PSR 的位被更
PC 使用 MOVS 遵从 32-bit 体系,使用 MRS MSR 处理 PSR
ARM 汇编手册:
的是端字端字手册
门叙
如果提供地址在一个边界,则装载(LDRB)使用在 0 7
如果在一个地址加上一个,则使用 8 15 位,以选择
目标寄存器的 8 位中,并寄存器中其的位用填充
存储(STRB)总线寄存器的的 8 4 次。由外存系
存储
装载(LDR)存储(STR)生成一个字对地址。使用一个字对地址
明显规定的结果实际上提示的是你不能使用 LDR 一个地址
装载一个
传送多个数据
使用传送指令(LDM STM) 装载和存储/存。
LDM/STM 要保存的寄存器栈上到过的
STMFD R13!, {R0-R12, R14}
指令格式是:
xxM{条件}{} Rn{!}, <寄存器列表>{^}
PDF created with pdfFactory trial version www.pdffactory.com
16
xx LD 装载, ST 存储。
4 ‘类变成 8 个指令:
LDMED LDMIB 装载
LDMFD LDMIA 装载
LDMEA LDMDB 先减装载
LDMFA LDMDA 装载
STMFA STMIB 存储
STMEA STMIA 存储
STMFD STMDB 先减存储
STMED STMDA 存储
指令格式
汇编器关照映射助记符注意 ED 不同于 IB先减装载是
的。在存储的时候ED 是过的。
FDEDFA EA 指定是栈还,是栈还。一个
次写的一个一个。一
是在存中(用程序始反)
存中正向
简单描述指令的行是过(Increment After)
(Increment Before)(Decrement After)先减(Decrement
Before)
RISC OS 使用满降。在使用 APCS 规定的编器的时候,它通
把你用程序处并使用一个 FD (满降 - Full
Descending)如果你一个语言(BASIC C)作,无选择
(统上 R13)一个满降你必须继续个格式,
你自(如果你可能喜欢这样!)
包含地址的寄存器。在 RISC OS 下,它是 R13
但你可以使用除了 R15 之外的任何可获得的寄存器。
如果你把复操作后栈当前地址保存到中,可以寄存器
的编次序传送。并用指令
中的一个一的位来表存一个寄存器,可能指定个寄存器次。它
作用是能用下这样的代码:
STMFD R13!, {R0, R1}
LDMFD R13!, {R1, R0}
个寄存器的
PDF created with pdfFactory trial version www.pdffactory.com
17
提供了一个有用的写。包含一个范围的寄存器,可以简单的只写一个和
一个,并在其一个横杠例如 R0-R3 R0, R1, R2, R3,只是更加
和理...
R15 存储到存中的时候还保 PSR 位。在重新装载 R15 时候
你要求恢复 PSR 位。要求法是在寄存器列表一个^
STMFD R13!, {R0-R12, R14}
...
LDMFD R13!, {R0-R12, PC}
这保存所有的寄存器,做一些事情重新装载所有的寄存器。 R14 装载 PC ,它
一个 BL 指令所 PSR
STMFD R13!, {R0-R12, R14}
...
LDMFD R13!, {R0-R12, PC}^
这保存所有的寄存器,做一些事情重新装载所有的寄存器。 R14 装载 PC ,它
一个 BL 指令所 PSR
警告: 些代码遵从 32 bit 体系。使用 MRS MSR 处理 PSR 你不能使用
^
注意例子中,R14 装载到 PC 中。 MOV(S) R14
R15 中的
警告: 使用 MOVS PC... 遵从 32 bit 体系。使用 MRS MSR
PSR
SWP : 单一数据交换
(Swap)
SWP{条件}{B} <dest>, <op 1>, [<op 2>]
指令格式
SWP :
操作 2 所指存装载一个把这放置到目的寄存器中。
寄存器操作 1 存储到一个地址中。
如果目的和操作 1 一个寄存器,则寄存器的存位
如果提供了 B ,则传送一个传送一个
PDF created with pdfFactory trial version www.pdffactory.com
18
算术和逻辑指令
ADC
ADD
AND
BIC
EOR
MOV
MVN
ORR
RSB
RSC
SBC
SUB
指令格式
ADC : 带进位的加法
(Addition with Carry)
ADC{条件}{S} <dest>, <op 1>, <op 2>
dest = op_1 + op_2 + carry
ADC 个操作数加起来,并把结果放置到目的寄存器中。它使用一个位标位,
样就可以做比 32 法。下例子 128 位的
128 结果: 寄存器 0 12 3
一个 128 : 寄存器 4 56 7
二个 128 : 寄存器 8 910 11
ADDS R0, R4, R8 ;
ADCS R1, R5, R9 ; 下一个
ADCS R2, R6, R10 ; 加第
ADCS R3, R7, R11 ; 加高
如果如果要这样法,不要 S 位标
ADD : 加法
(Addition)
ADD{条件}{S} <dest>, <op 1>, <op 2>
PDF created with pdfFactory trial version www.pdffactory.com
19
dest = op_1 + op_2
ADD 个操作数加起来把结果放置到目的寄存器中。操作 1 是一个寄存器,操作
2 可以是一个寄存器,移位的寄存器,一个立即值:
ADD R0, R1, R2 ; R0 = R1 + R2
ADD R0, R1, #256 ; R0 = R1 + 256
ADD R0, R2, R3,LSL#1 ; R0 = R2 + (R3 << 1)
法可以在有符号符号数上行。
AND : 逻辑与
(logical AND)
AND{条件}{S} <dest>, <op 1>, <op 2>
dest = op_1 AND op_2
AND 个操作数上行逻辑把结果放置到目的寄存器中对屏你要
的位有用。 操作 1 是一个寄存器,操作 2 可以是一个寄存器,移位的寄存器,
一个立即值:
AND R0, R0, #3 ; R0 = 保持 R0 的位 1
的位。
AND 真值(者都 1 结果为 1):
Op_1 Op_2 结果
0 0 0
0 1 0
1 0 0
1 1 1
BIC : 位清除
(Bit Clear)
BIC{条件}{S} <dest>, <op 1>, <op 2>
dest = op_1 AND (!op_2)
BIC 是在一个清除位的一法, OR 的操作。操作 2 是一个 32
位位(mask)如果如果码中置了一位,则清除这一位。码位指
保持不
PDF created with pdfFactory trial version www.pdffactory.com
20
BIC R0, R0, #%1011 ; 清除 R0 中的位 01 3保持
BIC 真值 :
Op_1 Op_2 结果
0 0 0
0 1 0
1 0 1
1 1 0
逻辑 Op_1 AND NOT Op_2
EOR : 逻辑异或
(logical Exclusive OR)
EOR{条件}{S} <dest>, <op 1>, <op 2>
dest = op_1 EOR op_2
EOR 个操作数上行逻辑把结果放置到目的寄存器中定的位有用。
操作 1 是一个寄存器,操作 2 可以是一个寄存器,移位的寄存器,一个立即值:
EOR R0, R0, #3 ; R0 中的位 0 1
EOR 真值(者不同结果为 1):
Op_1 Op_2 结果
0 0 0
0 1 1
1 0 1
1 1 0
MOV : 传送
(Move)
MOV{条件}{S} <dest>, <op 1>
dest = op_1
MOV 一个寄存器移位的寄存器一个立即值装载一个到目的寄存器。可以
指定的寄存器 NOP 指令的效果你还可以移位一个寄存器:
MOV R0, R0 ; R0 = R0... NOP 指令
PDF created with pdfFactory trial version www.pdffactory.com
21
MOV R0, R0, LSL#3 ; R0 = R0 * 8
如果 R15 是目的寄存器,修改程序计数于返回到调用代码,法是把连
寄存器的传送 R15:
MOV PC, R14 ; 退出到调用
MOVS PC, R14 ; 退出到调用恢复
(遵从 32-bit 体系)
MVN : 传送取反的值
(Move Negative)
MVN{条件}{S} <dest>, <op 1>
dest = !op_1
MVN 一个寄存器移位的寄存器一个立即值装载一个到目的寄存器。不同之
处是在传送之前,所以一个传送到一个寄存器中。是逻辑操作
是算术操作, 1 是它的:
MVN R0, #4 ; R0 = -5
MVN R0, #0 ; R0 = -1
ORR : 逻辑或
(logical OR)
ORR{条件}{S} <dest>, <op 1>, <op 2>
dest = op_1 OR op_2
OR 个操作数上行逻辑把结果放置到目的寄存器中对设置特定的位有用。操
1 是一个寄存器,操作 2 可以是一个寄存器,移位的寄存器,一个立即值:
ORR R0, R0, #3 ; R0 中位 0 1
OR 真值(中存在 1 结果为 1):
Op_1 Op_2 结果
0 0 0
0 1 1
1 0 1
1 1 1
PDF created with pdfFactory trial version www.pdffactory.com
22
RSB : 反向减法
(Reverse Subtraction)
RSB{条件}{S} <dest>, <op 1>, <op 2>
dest = op_2 - op_1
SUB 用操作 two 操作 one把结果放置到目的寄存器中。操作 1 是一个寄存
器,操作 2 可以是一个寄存器,移位的寄存器,一个立即值:
RSB R0, R1, R2 ; R0 = R2 - R1
RSB R0, R1, #256 ; R0 = 256 - R1
RSB R0, R2, R3,LSL#1 ; R0 = (R3 << 1) - R2
法可以在有符号符号数上行。
RSC : 带借位的反向减法
(Reverse Subtraction with Carry)
RSC{条件}{S} <dest>, <op 1>, <op 2>
dest = op_2 - op_1 - !carry
同于 SBC换了个操作前后
SBC : 带借位的减法
(Subtraction with Carry)
SBC{条件}{S} <dest>, <op 1>, <op 2>
dest = op_1 - op_2 - !carry
SBC 个操作法,把结果放置到目的寄存器中。它使用位标来表位,
样就可以做 32 位的法。SUB SBC 生成进位标不同于规,如果
位则清除位标。所以,指令对进位标行一个操作 - 在指令执行
转此位。
PDF created with pdfFactory trial version www.pdffactory.com
23
SUB : 减法
(Subtraction)
SUB{条件}{S} <dest>, <op 1>, <op 2>
dest = op_1 - op_2
SUB 用操作 one 操作 two 把结果放置到目的寄存器中。操作 1 是一个寄存
器,操作 2 可以是一个寄存器,移位的寄存器,一个立即值:
SUB R0, R1, R2 ; R0 = R1 - R2
SUB R0, R1, #256 ; R0 = R1 - 256
SUB R0, R2, R3,LSL#1 ; R0 = R2 - (R3 << 1)
法可以在有符号符号数上行。
LSL
ASL
LSR
ASR
ROR
RRX
ARM 处理器可以处理指令(ADCADDANDBICCMNCMPEOR
MOVMVNORRRSBSBCSUBTEQTST)使用的式移位器(barrel shifter)
你还可以使用式移位器 LDR/STR 操作中的
移位操作在 ARM 指令的指令使用,它是指令格式中是一
,在汇编语言示为指令中的如果数处理指令的二个操作
或者传送指令中的是寄存器,则可以移位操作。如果
处理指令的二个操作立即值,在指令中用 8 立即值 4
来表它,所以 255 立即值,汇编器尝试通过在指令中
来表它,如果不生成一个错误。在逻辑指令中,逻辑算指
指令中 S 位的置或清除定是位标比较指令的 S
的。在传送指令中指定移位的只能用立即值能用寄存
器。
不同的移位的六个助记符:
LSL 逻辑
PDF created with pdfFactory trial version www.pdffactory.com
24
ASL 算术
LSR 逻辑
ASR 算术
ROR
RRX
ASL LSL 的,可以自由
可以用一个立即值( 0 31)指定移位包含 0 31
一个的寄存器指定移位
逻辑或算术左移
(Logical or Arithmetic Shift Left)
Rx, LSL #n or
Rx, ASL #n or
Rx, LSL Rn or
Rx, ASL Rn
Rx n在寄存器 Rn 中指定的量向方向移位。
填充除了概念 33 ()之外
位,如果逻辑指令中 S 置了,则式移位器退出时位标
考虑:
MOV R1, #12
MOV R0, R1, LSL#2
退出时R0 48 些指令和是 R0 = #12, LSL#2 同于 BASIC R0
= 12 << 2
逻辑右移
(Logical Shift Right)
Rx, LSR #n or
Rx, LSR Rn
它在概念所有位方向如果逻辑指令中 S
,则后被最右端放置位标中。它 同于 BASIC register =
value >>> shift
PDF created with pdfFactory trial version www.pdffactory.com
25
算术右移
(Arithmetic Shift Right)
Rx, ASR #n or
Rx, ASR Rn
LSR 使用要被移位的寄存器(Rx) 31 位的填充位,用护补
中的符号如果逻辑指令中 S 置了,则后被最右端放置
中。它同于 BASIC register = value >> shift
循环右移
(Rotate Right)
Rx, ROR #n or
Rx, ROR Rn
逻辑移,右侧的位放置如果逻辑指令中 S
置了,则同时放置位标中,这就是位的。一个移位 32 的操作导致
入完全一所有位都被移位 32 个位的位!
带扩展的循环右移
(Rotate Right with extend)
Rx, RRX
是一个 ROR#0 操作,它一个位 - 不同之处是,它使用处理器的
位标提供一个要被移位的 33 位的
Thanks to
Ian Jeffray
for the correction.
PDF created with pdfFactory trial version www.pdffactory.com
26
乘法指令
MLA
MUL
指令格式
个指令算术指令在操作限制有所不同:
1. 的所有操作和目的寄存器必须为简单的寄存器。
2. 你不操作 2 使用立即值或被移位的寄存器。
3. 目的寄存器和操作 1 必须不同的寄存器。
4. 你不能指定 R15 目的寄存器。
MLA : 带累加的乘法
(Multiplication with Accumulate)
MLA{条件}{S} <dest>, <op 1>, <op 2>, <op 3>
dest = (op_1 * op_2) + op_3
MLA 的行为同于 MUL操作 3 结果上有用。
MUL : 乘法
(Multiplication)
MUL{条件}{S} <dest>, <op 1>, <op 2>
dest = op_1 * op_2
MUL 提供 32 乘法。如果操作是有符号的,可以结果是有符号的。
PDF created with pdfFactory trial version www.pdffactory.com
27
比较指令
CMN
CMP
TEQ
TST
指令格式
CMP CMP 是算术指令,TEQ TST 是逻辑指令。
是它 S 的,,它位。
CMN : 比较取负的值
(Compare Negative)
CMN{条件}{P} <op 1>, <op 2>
status = op_1 - (- op_2)
CMN 同于 CMP允许与小(操作 2 )行比较,比用其
的用于结列表 -1 这样 -1 比较使用:
CMN R0, #1 ; R0 -1 行比较
详情参照 CMP 指令。
CMP : 比较
(Compare)
CMP{条件}{P} <op 1>, <op 2>
status = op_1 - op_2
CMP 允许一个寄存器的一个寄存器的立即值行比较,状态标
允许进行条件执行。它行一次法,但不存储结果正确。标的是
操作 1 比操作 2 (大小)如果操作 1 操作操作 2 ,则的有 GT
的指令可以执行。
明显的,你不式的指定 S 状态标... 如果你指定它则忽略
PDF created with pdfFactory trial version www.pdffactory.com
28
TEQ : 测试等价
(Test Equivalence)
TEQ{条件}{P} <op 1>, <op 2>
Status = op_1 EOR op_2
TEQ TST区别概念算是 EOR AND 这提供了
个操作不影位标(不象 CMP 那样)法。加上 P TEQ
可用 R15 中的标( 26-bit 模式中)详情请参照 psr.html,在 32-bit 模式下
请参见
TST : 测试位
(Test bits)
TST{条件}{P} <op 1>, <op 2>
Status = op_1 AND op_2
TST CMP放置到目的寄存器中的结果是在个操作数上行操
作并把结果反映到状态标。使用 TST 查是置了特定的位。操作 1
据字而操作 2 是一个位码。测试如果 Zero
它。 CMP 那样你不指定 S
TST R0, #%1 ; 测试 R0 中是置了 0
分支指令
B
BL
指令格式
B : 分支
(Branch)
B{条件} <地址>
B 简单的分支。一到一个 B 指令,ARM 处理器立即跳定的地址
继续执行。注意存储在分支指令中的实际当前 R15 的一个
PDF created with pdfFactory trial version www.pdffactory.com
29
是一个地址。它的汇编器算,它是 24 位有符号符号
32 位,的有 26 (+/- 32 M)
在其处理器可能这样的指令:
OPT 1
LDA &70
CMP #0
BEQ Zero
STA &72
.Zero RTS
( Acorn Electron User Guide issue 1 page 213)
ARM 处理器,它变成东西:
OPT 1
ADR R1, #&70
LDR R0, [R1]
CMP #0
BEQ Zero
STR R0, [R1, #2]
.Zero
MOV PC, R14
这不是一个很好例子但你可以构想条件执行是分支。如果
的代码或者你的代码使用状态标可以使用条件执行分支:
一个一的简单条件执行指令可以代在其处理器中存在的所有些分支和指令。
OPT 1
ADR R1, #&70
LDR R0, [R1]
CMP R0, #0
STRNE R0, [R1, #2]
MOV PC, R14
BL : 带连接的分支
(Branch with Link)
BL{条件} <地址>
BL 一个分支指令。在分支之前,在寄存器 14 中装载 R15 可以重新
装载 R14 R15 返回到在个分支之后个指令,它是子例程的一个基本强力
。它的作用在屏幕装载器 2 ( 例子 4) 很好...
.load_new_format
PDF created with pdfFactory trial version www.pdffactory.com
30
BL switch_screen_mode
BL get_screen_info
BL load_palette
.new_loop
MOV R1, R5
BL read_byte
CMP R0, #255
BLEQ read_loop
STRB R0, [R2, #1]!
...里我到在装载器之前调用子例程。,一
件执行中调用
read_byte
子例程。
条件执行
条件执行
指令格式
ARM 处理器的一个非常是它的条件执行。指的是基本的如果位则分
支,ARM 使个逻辑深化为如果位则 XXX - XXX 是任何东西
为了,下 Intel 8086 处理器分支指令的一个列表:
JA Jump if Above
JAE Jump if Above or Equal
JB Jump if Below
JBE Jump if Below or Equal
JC Jump if Carry
JCXZ Jump if CX Zero (CX is a register that can be used for loop counts)
JE Jump if Equal
JG Jump if Greater than
JGE Jump if Greater than or Equal
JL Jump if Less than
JLE Jump if Less Than or Equal
JMP JuMP
JNA Jump if Not Above
JNAE Jump if Not Above or Equal
JNB Jump if Not Below
JNBE Jump if Not Below or Equal
JNC Jump if No Carry
PDF created with pdfFactory trial version www.pdffactory.com
31
JNE Jump if Not Equal
JNG Jump if Not Greater than
JNGE Jump if Not Greater than or Equal
JNL Jump if Not Less than
JNLE Jump if Not Less than or Equal
JNO Jump if Not Overflow
JNP Jump if Not Parity
JNS Jump if Not Sign
JNZ Jump if Not Zero
JO Jump if Overflow
JP Jump if Parity
JPE Jump if Parity Even
JPO Jump if Parity Odd
JS Jump if Sign
JZ Jump if Zero
80386 加了:
JECXZ Jump if ECX Zero
比,ARM 处理器只提供了:
B 分支
BL 带连接的分支
ARM 提供了条件执行,可以表面上不灵活式的限制:
BEQ Branch if EQual
BNE Branch if Not Equal
BVS Branch if oVerflow Set
BVC Branch if oVerflow Clear
BHI Branch if HIgher
BLS Branch if Lower or the Same
BPL Branch if PLus
BMI Branch if MInus
BCS Branch if Carry Set
BCC Branch if Carry Clear
BGE Branch if Greater than or Equal
BGT Branch if Greater Than
BLE Branch if Less than or Equal
BLT Branch if Less Than
BLEQ Branch with Link if EQual
....
BLLT Branch with Link if Less Than
个代码,
AL - ALways缺省条件所以不须指定
NV - NeVer非常有用。无论不要使用个代码...
PDF created with pdfFactory trial version www.pdffactory.com
32
当你发现所有 Bxx 指令实际上一个指令的时候如果
可以在一个分支指令上加上所有些条件,一个寄存器装载指令能加上?
是可以。
是可获得的条件代码的列表:
EQ :
如果一次比较之后置了 Z
NE :
如果一次比较之后清除了 Z
VS :
如果在一次算术操作之后置了 V 算的结果不适合一个 32bit 目标
寄存器中。
VC : 出清除
如果清除了 V VS
HI : 高于(符号)
如果一次比较之后置了 C 清除了 Z
LS : 于或同于(符号)
如果一次比较操作之后清除了 C 置了 Z
PL :
如果一次算术操作之后清除了 N 出于的目的,是它
...
MI :
如果一次算术操作之后置了 N
CS :
如果一次算术操作移位操作之后置了 C ,操作的结果不示为 32bit
可以 C 结果 33 位。
CC : 清除
CS
GE : 于或(符号)
如果一次比较之后...
置了 N 置了 V
或者...
清除了 N 清除了 V
PDF created with pdfFactory trial version www.pdffactory.com
33
GT : (符号)
如果一次比较之后...
置了 N 置了 V
或者...
清除了 N 清除了 V
并且...
清除了 Z
LE : 于或(符号)
如果一次比较之后...
置了 N 清除了 V
或者...
清除了 N 置了 V
并且...
置了 Z
LT : (符号)
如果一次比较之后...
置了 N 清除了 V
或者...
清除了 N 置了 V
AL :
缺省条件,所以明显
NV :
有用,它永远执行个指令。是 NOP
包含 NV 为了( AL )你不应该的代码中使用它。
有一个在的条件代码 S它以作。一个指令的时候导致
态标这不发生 - 些指令的目的是状态。例如:
ADD R0, R0, R1
ADDS R0, R0, R1
ADDEQS R0, R0, R1
一个例子是一个基本的( R1 R0) ,它不影状态寄存器。
二个例子一个法,只过它导致状态寄存器。
一个例子一个法,状态寄存器。不同它是一个有条件的指令。
只有一个操作的结果 EQ (如果置了 Z )时候执行。
是条件执行的一个作中的例子你把寄存器 0 存储在寄存器 10
容相比较。如果不 R10,则调用一个软件中断,它并分支次做
些。清除 R10 返回到调用它的分代码(它的地址存储在 R14)
PDF created with pdfFactory trial version www.pdffactory.com
34
\ 条件执行的一个例子
.loop ;
CMP R0, R10 ; R0 R10 比较
SWINE &40017 ; : 调用 SWI &40017
ADDNE R0, R0, #1 ; R0 1
BNE loop ; 分支到 'loop'
MOV R10, #0 ; : R10
LDMFD R13!, {R0-R12,PC} ; 返回到调用
:
SWI 就象写的这样。在 RISC OS 下,它是 Econet_DoImmediate 的编
不要字面它,只是一个例子!
可能以 LDMFD中装载个寄存器。在例子中,一个
式的中装载 R0 R12 R14 寄存器装载和存储的多信息请参
str.html
装载 R14 什么要把 PC ? R14 存储的包含
返回地址可以:
LDMFD R13!, {R0-R12,R14}
MOV PC, R14
接恢复 PC 中可以省略 MOV 语句
些寄存器有可能一个 SWI 调用所(在调用执行的代
),所以把你的寄存器中,以恢复
SWI 指令
SWI : 软件中断
(Software Interrupt)
SWI{条件} <24 位编>
指令格式
是一个简单可能是用的。操作系是用 SWI 提供的。
SWI RISC OS 的。
Nava Whiteford 解释 SWI 作的( Frobnicate issue 12½)...
PDF created with pdfFactory trial version www.pdffactory.com
35
SWI 是什么?
SWI Software Interrupt 。在 RISC OS 中使用 SWI 访问操作系统例或第三方
的模许多应用使用模提供访问
SWI 例子:
件器 SWI ,它盘、设
打印 SWI ,用使用打印并行端口
FreeNet/Acorn TCP/IP 协议 SWI ,用 TCP/IP 协议 Internet
在以式使用的时候SWI 允许操作系有一个模
的操作系的所的代码可以成许多()和一个模
处理程序(handler)
SWI 处理程序定的程编的一个时候,它找到程的
并执行它,并()任何
它是如何工作的?
首先一下何使用它。一个 SWI 指令(汇编语言)起来:
SWI &02
SWI "OS_Write0"
些指令实际上的,汇编的指令。一的不同二个指令使用一个
串来表 SWI &02 。在使用的程序的时候,在执行之前首先查找
里我们不处理什么的一个。它
一个程序的清晰但不实际执行的指令。
一下一个指令:
SWI &02
什么意? 字面进入 SWI 处理程序并 &02 。在 RISC OS
执行编 &02 程。
它是作的? SWI 进入 SWI 处理程序?
如果你存的 32 ( 0-&1C)汇编它(实际 ARM
指令):
PDF created with pdfFactory trial version www.pdffactory.com
36
地址 汇编
00000000 : 0..å : E5000030 : STR R0,[R0,#-48]
00000004 : .óŸå : E59FF31C : LDR PC,&00000328
00000008 : .óŸå : E59FF31C : LDR PC,&0000032C
0000000C : .óŸå : E59FF31C : LDR PC,&00000330
00000010 : .óŸå : E59FF31C : LDR PC,&00000334
00000014 : .óŸå : E59FF31C : LDR PC,&00000338
00000018 : .óŸå : E59FF31C : LDR PC,&0000033C
0000001C : 2?ã : E3A0A632 : MOV R10,#&3200000
一下。
除了第一个和一个指令之外()到的一个
载到 PC (程序计数)的指令,它告诉执行下一个指令。
示了这存中的一个地址接的。(可以在 !Zap 使用
Read Memory”选一下。)
起来 SWI 系,下
一个 SWI 所做的一切就模式变成超级 PC 执行在地址 &08
处的下一个指令! 处理器超级模式切换个寄存器 r13
r14 并用 r13_svc r14_svc
进入超级模式的时候还把 r14_svc 置为 SWI 指令之后
实际上就象一个连接地址 &08 的分支指令(BL &08)但带有用一些
(SWI )
过的那样地址 &08 包含一个地址的一个指令,实际 SWI
程序的地址!
时你可能! SWI ?实际上处理器忽略
SWI 处理程序使用 r14_svc 它。
完成它的(在存储寄存器 r0-r12 之后):
1. r14 4 获得 SWI 指令的地址
2. 把这个指令装载到一个寄存器。
3. 清除这个指令的 8 位,去掉 OpCode 下的 SWI
4. 使用找到要被执行的代码的程的地址(使用查找表等)
5. 恢复寄存器 r0-r12
6. 使处理器离开超级模式。
7. 程的地址
! ;)
PDF created with pdfFactory trial version www.pdffactory.com
37
是一个例子 ARM610 datasheet:
0x08 B Supervisor
EntryTable
DCD ZeroRtn
DCD ReadCRtn
DCD WriteIRtn
...
Zero EQU 0
ReadC EQU 256
WriteI EQU 512
; SWI 包含程在位 8-23 中和(如果有的)在位 0-7 中。
; R13_svc 一个合适
STMFD R13, {r0-r2 , R14}
; 作寄存器和返回地址
LDR R0,[R14,#-4]
; SWI 指令。
BIC R0,R0, #0xFF000000
; 清除高 8 位。
MOV R1, R0, LSR #8
;
ADR R2, EntryTable
; 入口表(EntryTable)地址
LDR R15,[R2,R1,LSL #2]
; 分支到正确
WriteIRtn
; R0 中的位 0 - 7 中的
.............
LDMFD R13, {r0-r2 , R15}^
; 恢复,并返回恢复处理器模式和标
这就 SWI 指令的基本处理
:
The ARM610 datasheet by Advanced Risc Machines
The ARM RISC Chip - A programmers guide by van Someren Atack published
by Addison Wesley
PDF created with pdfFactory trial version www.pdffactory.com
38
APCS 简介
(ARM 过程调用标准)
寄存器
关键
实际
数退出
栈回
APCS 标准
编码有用的东西
介绍
APCSARM 过程调用标准(ARM Procedure Call Standard)提供了紧凑的编写程的一
机制,定程可以他例在一的一点是
限制。它可以编 C Pascal 、也可以是用汇编语言的。
APCS :
寄存器使用的限制
使用
调用/返回
可以的基于栈的格式,用提供失败点到程序入口(
)列表
APCS 一个一的定标准,是一系定条件下有所区别的标准。
例如APCS-R ( RISC OS)规定在进入的标必须数退出时
位。在 32 位标准下,并知道进入( USR_CPSR),所以
要恢复如你那样,在不同相容性希望恢复
的代码在它被恢复时候可能表现...
如果你开发一个基 ARM 的系不要求你 APCS你实它,
可以使获得种利益是,如果要写用 C
的汇编代码,则必须使用 APCS。编期望定的条件,在(add-in)
代码中必须。一个例子 APCS a1 a4 可以破坏 v1
PDF created with pdfFactory trial version www.pdffactory.com
39
v6 必须被保挠头a 什么? v
?。所以首先 APCS-R 寄存器定...
寄存器命名
APCS 对我 R0 R14 的寄存器了不同名字。使用汇编器处理
器的能,可以定 R0 等名字修改写的代码的时候
使用 APCS 名字
寄存器名字
Reg #
APCS
R0 a1 作寄存器
R1 a2 "
R2 a3 "
R3 a4 "
R4 v1 必须保
R5 v2 "
R6 v3 "
R7 v4 "
R8 v5 "
R9 v6 "
R10 sl 限制
R11 fp
R12 ip
R13 sp
R14 lr 连接寄存器
R15 pc 程序计数
ip 是指令指写。
名字标准的 Acorn objasm( 2.00)所定的, objasm
本,和其汇编器( Nick Robert ASM)
个寄存器名字典型的,你要在程序最开使用 RN 指令(directive):
a1 RN 0
a2 RN 1
a3 RN 2
......
PDF created with pdfFactory trial version www.pdffactory.com
40
r13 RN 13
sp RN 13
r14 RN 14
lr RN r14
pc RN 15
例子示了一些东西:
1. 寄存器可以定名字 - 可以定r13sp
2. 寄存器可以定自前的寄存器 - lrr14的寄存器。
( objasm 正确的,其汇编器可能这样)
设计关键
调用()
可以妥善处理
写可重入和可定位的代码通过可写的代码分离来
最重的是,它简单这样汇编编程可以非常的使用它的
够非常程序。
一致性
程序的 APCS 分在调用数时被。在程序执行的所有时候都
APCS ( 典型的,生成的程序)格一协议如你正确
进入退出可以在你自范围的任何事情保持
在有些时候必须的,比在写 SWI 伪装(veneers)时候使用许多实际 SWI
用的寄存器。
起来的一个列表,通过一个东西
储在地址次序分。寄存器 sp 是指当前
的使用的地址统上满降。在 APCS-R 中,寄存器 sl 有一个
sp 它。在当前栈当前栈之应该有任何其 APCS
东西,在调用的时候可以为自一个
PDF created with pdfFactory trial version www.pdffactory.com
41
可以有(chunk)。它可以位存中的任何地址提供
典型的,在可重入式下执行的时候于为的代码提供
比是 FileCore,它通过简单状态信息和并要求调用
的代码,当前获得 FileCore 件系(ADFSRAMFSIDEFSSCSIFS )
提供
回溯结构
寄存器 fp ()或者是指栈回列表中的一个提供了
程序的式,调用的
:
地址高
存代码指 [fp] fp
返回 lr [fp, #-4]
返回 sp [fp, #-8]
返回 fp [fp, #-12] 下一个
[存的 sl]
[存的 v6]
[存的 v5]
[存的 v4]
[存的 v3]
[存的 v2]
[存的 v1]
[存的 a4]
[存的 a3]
[存的 a2]
[存的 a1]
[存的 f7]
[存的 f6]
[存的 f5]
[存的 f4]
地址
包含 4 27 ,在方括中的是可如果存在,则
定的次序存在(例如,在存中存的 a3 可以是存的 f4
a2-f5 能存在)。浮点值按格式存储并(12 )
PDF created with pdfFactory trial version www.pdffactory.com
42
fp 寄存器指当前执行的栈回返回 fp 或者是指
调用了这当前栈回的一个指中的
返回 fp 是指调用调用了这当前栈回的一
个指并以一个
数退出时候把返回连接返回 sp 返回 fp 装载到 pcsp
fp 中。
#include <stdio.h>
void one(void);
void two(void);
void zero(void);
int main(void)
{
one();
return 0;
}
void one(void)
{
zero();
two();
return;
}
void two(void)
{
printf("main...one...two\n");
return;
}
void zero(void)
{
return;
}
它在屏幕时候
APCS :
fp ----> two_structure
return link
PDF created with pdfFactory trial version www.pdffactory.com
43
return sp
return fp ----> one_structure
... return link
return sp
return fp ----> main_structure
... return link
return sp
return fp ----> 0
...
所以,可以 fp 看给two,它指向给one,它指向给
main,它指。在式下,可以个程序并
何到当前崩溃点的。zero已经被执行并退出了
在做它打印,所以它中,定代
可能生成象上那样的一个 APCS 调用任何其数不
要求全的 APCS
为了更细致的理,下是代码是 Norcroft C v4.00 为上代码生成...
AREA |C$$code|, CODE, READONLY
IMPORT |__main|
|x$codeseg|
B |__main|
DCB &6d,&61,&69,&6e
DCB &00,&00,&00,&00
DCD &ff000008
IMPORT |x$stack_overflow|
EXPORT one
EXPORT main
main
MOV ip, sp
STMFD sp!, {fp,ip,lr,pc}
SUB fp, ip, #4
CMPS sp, sl
BLLT |x$stack_overflow|
BL one
MOV a1, #0
LDMEA fp, {fp,sp,pc}^
DCB &6f,&6e,&65,&00
DCD &ff000004
PDF created with pdfFactory trial version www.pdffactory.com
44
EXPORT zero
EXPORT two
one
MOV ip, sp
STMFD sp!, {fp,ip,lr,pc}
SUB fp, ip, #4
CMPS sp, sl
BLLT |x$stack_overflow|
BL zero
LDMEA fp, {fp,sp,lr}
B two
IMPORT |_printf|
two
ADD a1, pc, #L000060-.-8
B |_printf|
L000060
DCB &6d,&61,&69,&6e
DCB &2e,&2e,&2e,&6f
DCB &6e,&65,&2e,&2e
DCB &2e,&74,&77,&6f
DCB &0a,&00,&00,&00
zero
MOVS pc, lr
AREA |C$$data|
|x$dataseg|
END
例子不遵从 32 体系。APCS-32 规定只是简单要被保存。所以
LDM ^,并在 zero MOVS S。则代码遵从 32-bit
生成的一样了
存代码指包含置回的指令(STMFD ...)地址加上 12
26-bit 代码,其中的 PSR 实际的代码地址
进入时候:
pc 包含下一个要被执行的指令的位
lr ()包含退出时要装载到 pc 中的。在 26-bit 位代码中它包含 PSR
sp 当前(chunk)限制它的是用于复时数据、寄存器和
东西到其中的。在 RISC OS 下,有可选择至少 256 它。
PDF created with pdfFactory trial version www.pdffactory.com
45
fp 当前分。
数实()描述那样
实际参数
APCS 有定的格这样语言可以自由的定
是,如果你自实际上不 APCS 精神么将允许来自你的编器的代
器的代码连接在一典型的,使用 C 语言
4 数实(或者更!)装载到 a1 - a4
4 个浮点(或者更!)装载到 f0 - f3
任何(如果有的)存储在存中,用进入数时 sp 字来
句话,其数被。所以简单 4 或更
函数退出
通过把返回连接传送到程序计数器中退出,并:
如果数返回一个一个大小,则把这放置 a1 中。
如果数返回一个浮点,则 f0 中。
spfpslv1-v6 f4-f7 当被恢复(如果被改动)包含进入数时它所
有的
测试破坏寄存器,结果(在程序不同)希望
故障
iplra2-a4f1-f3 可以破坏
32 位模式下, PSR 跨越调用的。在 26 位模式下必须这样
并通过传送 lr pc (MOVS LDMFD xxx^) 恢复必须 lr 重新装载 N Z
C V 跨越数保些标足够的。
建立栈回溯结构
一个简单(定个重入)可以用下指令一个栈回:
function_name_label
MOV ip, sp
STMFD sp!, {fp,ip,lr,pc}
SUB fp, ip, #4
PDF created with pdfFactory trial version www.pdffactory.com
46
片段(自上的程序)基本的式。如果你要破坏他不破坏的寄存器,
应该 STMFD 指令中包含
下一个任如果不( 256 )可以使用:
CMPS sp, sl
BLLT |x$stack_overflow|
C 4.00 处理式。在以本中,你要调用
|__rt_stkovf_split_small|
你自事情...
通过下的指令完成退出:
LDMEA fp, {fp,sp,pc}^
有,如果你栈了寄存器,则里重新装载它选择简单 LDM 退出
机制是它比分支到一个数退出处理器(handler)理。
用在中的协议的一个名字到代码中。
( MOV ip, sp)应该:
DCD &ff0000xx
xx名字(包括填充)字对填充的,
且应当被接放置 DCD &ff....
所以一个栈回代码:
DCB "my_function_name", 0, 0, 0, 0
DCD &ff000010
my_function_name
MOV ip, sp
STMFD sp!, {fp, ip, lr, pc}
SUB fp, ip, #4
CMPS sp, sl ; 如果你不使用
BLLT |x$stack_overflow| ; 则可以省略
...处理...
LDMEA fp, {fp, sp, pc}^
使它遵从 32-bit 体系,只简单省略一个指令的^注意你不能在一个编
26-bit 代码中使用个代码。实际上可以它,但这不事情
PDF created with pdfFactory trial version www.pdffactory.com
47
如果你不使用,并你不要保存任何寄存器,并你不调用任何东西,则
必要 APCS (在调问题是有用的)。在
:
my_simple_function
...处理...
MOVS pc, lr
(次, 32 APCS 使用 MOV MOVS 不要冒险 26 位代码连接)
APCS 标准
,有本的 APCS ( 实际上 16 ) RISC OS 可能到的。
APCS-A
APCS-Arthur Arthur 所定。它已经被废弃是它有不同
的寄存器定(熟练 RISC OS 程序它是异类)。它用 USR 模式
行的 Arthur 用程序。应该使用它。
sl = R13, fp = R10, ip = R11, sp = R12, lr = R14, pc = R15
PRM (p4-411) r12 sp是在体系上更自 r13,是历史
Arthur RISC OS
是分的并可
26-bit 程序计数器。
FP 寄存器中浮点
重入。标必须被恢复
APCS-R
APCS-RISC OS。用 RISC OS 用程序在 USR 模式下行操作 SVC
模式下的模/处理程序。
sl = R10, fp = R11, ip = R12, sp = R13, lr = R14, pc = R15
它是一的通用的 APCS 本。所有编 C 程序使用 APCS-R
式的限制查。
26-bit 程序计数器。
FP 寄存器中浮点
重入。标必须被恢复
APCS-U
APCS-UnixAcorn RISCiX 使用它。它用 RISCiX 用程序(USR
)(SVC 模式)
PDF created with pdfFactory trial version www.pdffactory.com
48
sl = R10, fp = R11, ip = R12, sp = R13, lr = R14, pc = R15
式的限制(使用 sl)
26-bit 程序计数器。
FP 寄存器中浮点
重入。标必须被恢复
APCS-32
它是 APCS-2(-R -U)的一个允许 32-bit 程序计数器,并执行在
USR 模式下的一个退出时允许不被恢复。其事情同于 APCS-R
Acorn C 5 生成 32-bit 代码在用广 32 工具中,它
最完开发发行。一个简单测试要求你的编汇编(
作目标代码)你不应该找到:
MOVS PC, R14
或者
LDMFD R13!, {Rx-x, PC}
^
对编码有用的东西
首先考虑的是 26/32 问题 简单弯抹角本的
APCS 汇编一个通用代码。这不问题APCS 标准然改RISC OS
32 。所以些,可以本的
远远 APCS RISC OS 32 使用 MSR 处理状态和模式位,
是使用 TEQP 许多现存的 API 实际上不要保位。所以在 32 本中
可以通过 MOVS PC,... 变成 MOV PC,...,和 LDM {...}^ 变成 LDM {...},并
重新造来解objasm 汇编器(v3.00 和以)有一个 {CONFIG} 可以是 26 32
可以使用它...
my_function_name
MOV ip, sp
STMFD sp!, {fp, ip, lr, pc}
SUB fp, ip, #4
...处理...
[ {CONFIG} = 26
LDMEA fp, {fp, sp, pc}^
|
LDMEA fp, {fp, sp, pc}
]
未测试个代码。它(东西)保持与两本的 APCS 相兼容式,
RISC OS 不同本,26 本和 32 本的法。
PDF created with pdfFactory trial version www.pdffactory.com
49
测试 32 ? 如果你要求你的代码有,有一个简单
定处理器的 PC 状态
TEQ PC, PC ; 32 位是 EQ 26 位是 NE
使用它可以:
26 PC ,可能是 APCS-R APCS-32
32 PC APCS-R 。所有 26-bit 代码(TEQP )失败!
32 位规则
不要使用有 P 测试指令: TEQPTSTPCMPPCMNP
PC R14 BIC ORR 这样的指令,和一个寄存器 PC
指令。例如ORRS PC, R14, #1<<28 作。实际上不要使用 S
的写到 PC 的任何指令。
处理操作中不要使用 R15 (PC) 移位寄存器。
LDR/STR 中,不要使用 PC 寄存器不要到它。
在过 LDR/STR 中,Rm() Rn( )能是一个寄存器。的,
的任何指令,Rm Rn 应该不同的寄存器。
LDM/STM 在用模式下使用 S 位。不要使用^(例如 LDMFD
R13!, {PC}^)
BL 不保存状态寄存器。这必须式的行,这样的代码能在 ARM2
ARM3 上运行,们不 MRS/MSR 指令。
还要注意不可能调用的标,所以应该恢复你不知道其状态的标
能做的是在进入时候保
任何 S 的到 R15 32-bit (MOVSORRSTEQPLDM...^) 传送
当前模式的 SPSR CPSR 中。例如 irq_32 模式下:
MOVS PC, R14
R14 PC ,并 SPSR_IRQ32 CPSR
USR 模式下非常有用 SPSR!
浮点指令
PDF created with pdfFactory trial version www.pdffactory.com
50
指令索引
ABS
ACS 反余
ADF
ASN
ATN
CMF 比较浮点
CNF 比较的浮点
COS
DVF
EXP
FDV 快速
FIX 浮点
FLT 浮点
FML 快速乘法
FRD 快速
LDF 装载浮点
LFM 装载个浮点
LGN
LOG
MNF 传送
MUF 乘法
MVF 传送/浮点寄存器到一个浮点寄存器
NRM 规格
POL
POW
RDF
RFC FP 控制寄存器
RFS FP 状态寄存器
RMF
RND 入成
RPW
RSF
SFM 存储个浮点
SIN
SQT
PDF created with pdfFactory trial version www.pdffactory.com
51
STF 存储浮点
SUF
TAN
URD 规格
WFC FP 控制寄存器
WFS FP 状态寄存器
文档部 ARM 汇编器手册
ARM 可以最多 16 处理器(interface)ARM3 和以的处理器在
ARM 处理器处理控制能。获得一个处理器是浮
点处理器。芯片处理 IEEE 标准的浮点算。定一个标准的 ARM 浮点
指令,所以编码可以跨越所有 RISC OS 器。如果不存在实际件,则
些指令浮点模器模(FPEmulator)执行。程序知道
FP 处理器。不同的是执行速
RISC OS BASIC 汇编器,作标准,任何的浮点指令。可以
浮点并用它(最普通的定点)基本数学运算,
但你不浮点处理器并以有的’方事情是,
编器能的包含 FP 指令。
ARM IEEE FP 统由 8 FP 寄存器(F0 F7)。寄存器的格式是
的,为你不接访问这些寄存器,寄存器只在它传送 ARM
存器。在存中,一个 FP 寄存器 FP
重新装载到的寄存器中,的格式是的。有一个 FPSR
(浮点状态寄存器),它 ARM PSR用程序可能的状态
信息。可获得个标有一个‘陷允许应用程序来启
错误FPSR 允许 FP 不同实区别
有一个 FPCR (浮点控制寄存器)。它用程序应该访问信息,比开启
FP 的标典型的,件有 FPCR 软件有。
FP 可以软件 FPEmulator FP 芯片(和支
)。二例子 Warm Silence Software ,它
ARM FP 操作 PC 处理器 80x87 一个浮点
理器。
算的结果如同入成要求式有
向正(P), 向负(M), 缺省的是如果不
,则 80 位,其 64 15
位指,和一个符号位。在一些作的指令提供了更
- 全基软件的
PDF created with pdfFactory trial version www.pdffactory.com
52
FPSR 包含 FP 的状态。提供 IEEE 只在一次 FP 比较操
之后获得结果
浮点指令应该用在 SVC 模式下。
FPSR 例外
6 4 3 2 1 0
FPSR: INX UFL OFL DVZ IVO
一个例外条件的时候在位 0 4 中的累计(cumulative)例外置为
1如果置了位,则操作系指定的一个例外送给程序。(注意
在下下,用位的状态定在什么条件下) 只能用 WFS 指令
清除这些标
IVO - invalid operation 操作
行的操作的一个操作效时 IVO操作有:
在一个(trapping) NaN (not-a-number )行任何操作。
(magnitude)例如 (+ ) + (-)
乘法 0 *
/ x/0
x REM y x = y = 0
(REM 是浮点法操作的)
任何 0
操作 NaN 时候数或进制
如果上使换不可能,则生成最负整(操作符号)并通
(signal)一个 IVO
比较(Unordered)操作数例外
ACSASNSINCOSTANLOGLGNPOW RPW /错误
DVZ - division by zero
如果除数被除数是一个有 DVZ 如果
返回一个正确的有符号还为 LOG(0) LGN(0) 置这个标
如果返回
OFL - overflow
结果目的格式时候 OFL 结果是指范围
(unbounded) 结果被之后检测,在一些操作之后
发生模式。如果返回一个有正确符号
返回这个格式的的有模式和使用的浮点系
UFL - underflow
个有:
(tininess) - 结果于这个格式的规格
PDF created with pdfFactory trial version www.pdffactory.com
53
- 规格导致的准可能入导致的准
UFL 用位的,以不同 UFL 如果,则
有准,在检测时就 UFL 如果,则在检测
和准者时 UFL ( INX )返回一个
正确符号结果被之后检测,在一些操作之后发生
模式。
INX - inexact
如果操作的结果(不同于可用度计算的)或者
OFL 发生或者 UFL 发生,则 INX
OFL UFL 阱优 INX。在 SIN COS 时候也设 INX
SIN(0) COS(1) 例外 FPE FPPC 在处理 INX 可能不同
由于这你不要 INX
:
S -
D - 双精
E -
P - (packed)进制
EP - 进制
模式:
- ()
P -
M -
Z -
LDF{条件}<> <fp 寄存器>, <地址>
装载浮点
地址可以是下:
[Rn]
[Rn], #offset
[Rn, #offset]
[Rn, #offset]!
个调用 LDR
的汇编器可能允许使用LDFS F0, [浮点]
STF{条件}<> <fp 寄存器>, <地址>
PDF created with pdfFactory trial version www.pdffactory.com
54
存储浮点
地址可以是下:
[Rn]
[Rn], #offset
[Rn, #offset]
[Rn, #offset]!
个调用 STR
的汇编器可能允许使用STFED F0, [浮点]
LFM and SFM
LDM STM一些本的 FPEmulator 们就不
描述最新本的 RISC OS 3.1x (2.87) 中的 FP 如果你
的软件只在支 SFM 的系统上操作使用它 STF 的一个序
它。LFM/LDF
FLT{条件}<>{} <fp 寄存器>, <寄存器>
FLT{条件}<>{} <fp 寄存器>, #<>
浮点一个 ARM 寄存器一个
FIX{条件}{} <寄存器>, <fp 寄存器>
浮点
WFS{条件} <寄存器>
用指定 ARM 寄存器的写浮点状态寄存器。
RFS{条件} <寄存器>
浮点状态寄存器到指定的 ARM 寄存器中。
WFC{条件} <寄存器>
用指定 ARM 寄存器的写浮点控制寄存器。
超级模式,并只存在它的
RFC{条件} <寄存器>
浮点控制寄存器到指定的 ARM 寄存器中。
超级模式,并只存在它的
PDF created with pdfFactory trial version www.pdffactory.com
55
浮点处理器操作指令的格式是:
目操作{条件}<>{} <目的浮点寄存器>, <浮点寄存器>, <浮点
寄存器>
目操作{条件}<>{} <目的浮点寄存器>, <浮点寄存器>, #<>
目操作{条件}<>{} <目的浮点寄存器>, <浮点寄存器>
目操作{条件}<>{} <目的浮点寄存器>, #<>
<>常量 01234510 0.5
目操作有...
ADF -
DVF -
FDV - 快速 - 只定
FML - 快速乘法 - 只定
FRD - 快速 - 只定
MUF - 乘法
POL -
POW -
RDF -
RMF -
RPW -
RSF -
SUF -
目操作有...
ABS -
ACS - 反余
ASN -
ATN -
COS -
EXP -
LOG -
LGN -
MVF - 传送
MNF - 传送
NRM - 规格
RND -
SIN -
SQT -
TAN -
URD - 规格
PDF created with pdfFactory trial version www.pdffactory.com
56
CMF{条件}<>{} <fp 寄存器 1>, <fp 寄存器 2>
FP 寄存器 2 FP 寄存器 1 行比较。
CMFE 比较例外
CNF{条件}<>{} <fp 寄存器 1>, <fp 寄存器 2>
FP 寄存器 2 FP 寄存器 1 行比较。
CNFE 比较例外
提供带例外不带例外的比较,如果操作(中的一个
个是)可以例外为了 IEEE 754CMF 指令只测试
(使用 BEQ BNE) 测试未( V )所有
测试使用 CMFE 指令( BGTBGEBLTBLE)
FPSR 中的 AC 清除了时候,在比较之后ARM NZCV :
N =
Z =
C =
V =
FPSR 中的 AC 置了时候,在比较之后些标:
N =
Z =
C = 于或
V =
在使用 objasm APCS 代码中,存储一个浮点可以使用指令
(directive) DCFS双精D
伪指令
ADR
ADRL
ALIGN
DCx
EQUx
OPT
RISC OS BASIC 汇编器提供了伪指令。它们不是处理器实际上能理
指令,可以它能理种东西。它的存在能使的程序更加简单
PDF created with pdfFactory trial version www.pdffactory.com
57
ADR : 装载地址
(load Address)
ADR{} <寄存器>, <>
参照地址装载到定寄存器中:
00008FE4 OPT l%
00008FE4 E28F0004 ADR R0, text
00008FE8 EF000002 SWI "OS_Write0"
00008FEC E1A0F00E MOV PC, R14
00008FF0 .text
00008FF0 EQUS "Hello!" + CHR$13 + CHR$10 +
CHR$0
00008FFC ALIGN
代码有效果:
00008FE4 OPT l%
00008FE4 E28F0004 ADD R0, R15, #4
00008FE8 EF000002 SWI "OS_Write0"
00008FEC E1A0F00E MOV PC, R14
00008FF0 .text
00008FF0 EQUS "Hello!" + CHR$13 + CHR$10 +
CHR$0
00008FFC ALIGN
实际上,它汇编:
*MemoryI 8FE4 +18
00008FE4 : E28F0004 : .. : ADR R0,&00008FF0
00008FE8 : EF000002 : ...? : SWI "OS_Write0"
00008FEC : E1A0F00E : .? : MOV PC,R14
00008FF0 : 6C6C6548 : Hell : STCVSTL CP5,C6,[R12],#-&120 ; =288
00008FF4 : 0A0D216F : o!.. : BEQ &003515B8
00008FF8 : 00000000 : .... : DCD &00000000
ADR 是一个有用的指令,你不 R15 (例如们为什么
4?)在一代码上计。可以简单的使用 ADR Rx, label
汇编器为你使用 ADDSUBMOV MVN 个指令。限制
范围只能是在 4096 (全是的,它典型 ADD
SUB 使用移的立即值为了的一范围 4K)
PDF created with pdfFactory trial version www.pdffactory.com
58
ADRL : 装载长地址
(load Address Long)
ADRL{} <寄存器>, <>
BASIC 汇编器它,一些它。
ADRL 指令使用 ADR ADD ADR SUB 的一个来生成一个广
可以到地址范围是它是使用个指令,所以可以尝试更加做的
来重新些可以使用通的 ADR 代码。
有,在一些汇编器中,用使用个指令的 ADRX 定位地址
ALIGN : 齐指针
(ALIGN pointers)
ALIGN
ALIGN 指令 P% (如果 O%)在一个边界。通要求
或者一个,并的代码汇编之前使用它。
BASIC 汇编器非常如果你,它能为你处理问题...
00008FF4 OPT l%
00008FF4 E28F0004 ADR R0, text
00008FF8 EF000002 SWI "OS_Write0"
00008FFC EA000004 B carryon
00009000 .text
00009000 EQUS "unaligned text!!!" + CHR$0
00009012 .carryon
00009014 E1A0F00E MOV PC, R14
DCx : 初始化数据存
DCx <>
DCx 指令。x一个可能的范围。它:
DCB 一个(8 )
DCW 一个(16 )
DCD 一个(32 )
PDF created with pdfFactory trial version www.pdffactory.com
59
DCS 要求备直 255 个的
例如:
.start_counter
DCB 1
.pointer
DCD 0
.error_block
DCD 17
DCS "Uh-oh! It all went wrong!" + CHR$0
ALIGN
EQUx : 初始化数据存
EQUx <>
EQUx 指令,x一个可能的范围。它:
EQUB 一个(8 )
EQUW 一个(16 )
EQUD 一个(32 )
EQUS 要求备直 255 个的
简单的理除了名字不同之外() DCx 全一可以使用= EQUB
写。
OPT : 置汇编器选项
(set assembler Options)
OPT <>
置各汇编器
PDF created with pdfFactory trial version www.pdffactory.com
60
ARM 指令格式和时序
文档中,指的是 32 (4 )存。
目录
处理器模式
寄存器
线
指令
o 条件代码
o 处理指令
o 分支指令
o 乘法
o 乘法(ARM7DM)
o 传送
o 传送
o 软件中断
o 处理器操作
o 处理器传送和寄存器传送
o (ARM 3 和以包括 ARM 2aS)
o 状态寄存器传送(ARM 6 和以)
o 指令
贡献
处理模式
ARM 有一个用模式和个有超级模式。它:
IRQ
中断(IRQ)进入
FIQ
快速中断(FIQ)进入
SVC
在指令一个软件中断(SWI)进入
PDF created with pdfFactory trial version www.pdffactory.com
61
Undef
在执行一个的指令进入(存在 ARM 2 3 ,在里进入 SVC
)
Abt
在一个访问尝试理器(例如MEMC MMU) 终止进入,通
所做的尝试要访问不存在的或者的模式下访问(存在
ARM 2 3 ,在里进入 SVC 模式)
调用向量
寄存器
ARM 2 3 27 32 位处理器寄存器,在任何只有其中的 16
是可(十六个处理器模式)。它们被 R0-R15
ARM 6 和以 31 32 位处理器寄存器,在任何只有其中的 16
是可的。
R15 别重。在 ARM 2 3,其中的 24 位用做程序计数器,下的 8
于保持处理器模式状态标和中断模式。所以 R15 PC
R15 = PC = NZCVIFpp pppppppp pppppppp ppppppMM
0-1 26-31 PSR ( 处理器状态寄存器)。位 2-25 出被到指令线中的
当前指令的()地址 ( )。所以永远只能字对地址执行指令。
M 当前处理器模式
0 模式
1 快速中断处理模式(FIQ 模式)
2 中断处理模式(IRQ 模式)
3 超级模式(SVC 模式)
名字
N (Negative)
Z (Zero)
C (Carry)
V (oVerflow)
I 中断(Interrupt)
F 快速(Fast)中断
PDF created with pdfFactory trial version www.pdffactory.com
62
R14R14_FIQR14_IRQ R14_SVC 由于带连接的分支指令的行
时被连接寄存器。
ARM 6 和以的处理器 32 地址些处理可以在 26 32
PC 模式二下操作。 26 PC 模式下,R15 表现如同在以的处理器
,所以代码只能行在地址 64M 中。在 32 PC 模式下,
R15 所有 32 位用做程序计数器。使用独立的状态寄存器存储处理器模式和状
态标PSR :
NZCVxxxx xxxxxxxx xxxxxxxx IFxMMMMM
注意 32-bit 模式下 R15 - 只能字对的指令。
位写的任何尝试
当前模式:
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 模式
自上,可能期望个模式:
M 名字
00111 abt_26 26 bit PC Abt Mode
01011 und_26 26 bit PC Und Mode
实际上(如果你模式位写 00111 01011 结果芯片状态
希望 - 是有 R13 R14 进来的一个 26-bit 模式。
个处理器模式下可获得些的寄存器:
+------+---------------------------------------+
| 模式 | 获得的寄存器 |
+------+---------------------------------------+
| USR | R0 - R14 R15 |
+------+---------+-----------------------------+
PDF created with pdfFactory trial version www.pdffactory.com
63
| 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 和以)
+------+---------------------------------------+
ARM6 和以的处理器有六个状态寄存器。一个是当前处理器状态寄存器
(CPSR)于当前处理器状态的信息。其它个是存的程序状态寄存器
(SPSR): 模式有一个,完成个模式下的例外处理处理器
须返回状态的信息
使用 MSR MRS 指令来设读取些寄存器。
流水线
不同于编码的处理器,ARM (保持它的 RISC )线的。
为了加 ARM 2 3 的执行使用 3 线存中
的指令。码,实际执行它。,程序计数
出当前执行的指令个指令。(分支指令时必须计算在)
线,在分支丢失 2 个指令(为要重新线)。所
用条件执行指令避免浪费例如:
...
CMP R0,#0
BEQ over
MOV R1,#1
MOV R2,#2
over
...
可以写为更:
...
CMP R0,#0
PDF created with pdfFactory trial version www.pdffactory.com
64
MOVNE R1,#1
MOVNE R2,#2
...
时序
ARM 指令在 SNI C
S ARM 在其中访问一个序的存位
N ARM 在其中访问一个序的存位
I ARM 在其中尝试访问一个存位置或传送一个/一个处理
器的
C ARM 在其中一个处理器总线(存的 ARM)
处理器总线(存的 ARM)传送一个
都必须至少与 ARM 存系可以:
于典型 DRAM 结果:
N 变成最( DRAM 访问时要求更
访问协议)
S 偶尔 N (一个
一个到下一行的一个时候[1])
I C 期总
于典型 SRAM ,所有典型
Acorn Archimedes A440/1 使用的 8MHz ARM2 中,一个 S ()
125ns 一个 N () 250ns注意 ARM
存系例如,一个 8MHz ARM2 可以一个 125ns N
RAM 连接。处理器的速 8MHz 只是简单如果你使任
度上 125ns 则它不保作。
存的处理器: 所有信息 ARM 到的。它们不
的速发生: 控制逻辑在 cache 中的时候提供 ARM
典型的,有存的 ARM : 快速 FCLK
MCLK cache 中的时候ARM 使用 FCLK 的速所有
PDF created with pdfFactory trial version www.pdffactory.com
65
: cache 效果上 SRAM。在 cache
发生时候ARM MCLK MCLK cache
(在处理器中 cache 行的使用 N+3S N+7S )
ARM 被同 FCLK
发生内访问时候ARM 操作(be clocked): 是,可以使用一个
NWAIT 入来导致到的 ARM 做任何事情正确存中
,并在下的时候做任何事情(为了避免 cache
重新填充 cache 行的时候)。有存的 ARM 可以
使用 FCLK MCLK (所以 FCLK 是准 MCLK ,并
MCLK 期与一个 FCLK 同时)( FCLK
MCLK 期相可以有任何)使更加复
非常些行描述是,在一个 cache 发生时候
它所用以 MCLK 位的 cache 填充(例如N+3S
N+7S) N S 可能 DRAM 描述那样被加上一些
重新详情到所的处理器的
datasheet
1: 控制使用简单: 如果一个 N ,则把访
为不一行来对如果一个 S 效果上行的
一个(可以快速检测)把访问为同来对结果是一些 S
期将续与 N 期相如果正确,在 Archimedes S
访问 16 Archimedes 代码的实际后果: (a)
4 S 中的 1 变成一个 N ,所有地址都地址 4
(b) 细关照对代码避免效果到一些
能。)
指令
ARM 指令 32 ,下详细解释于每个指令
指令位(bitmap),和典型汇编器使用的法的例子
一定注意助记符定的它是汇编器的 ARM 器编
码的。
PDF created with pdfFactory trial version www.pdffactory.com
66
条件代码
个指令的分是一个条件代码,所以可以有条件的一的 ARM
指令。
条件
指令位 条件代码
:
0000xxxx xxxxxxxx xxxxxxxx xxxxxxxx 0 EQ(Equal) Z
0001xxxx xxxxxxxx xxxxxxxx xxxxxxxx 1 NE(Not Equal)
~Z
0010xxxx xxxxxxxx xxxxxxxx xxxxxxxx 2 CS(Carry Set)
C
0011xxxx xxxxxxxx xxxxxxxx xxxxxxxx 3 CC(清除Carry Clear)
~C
0100xxxx xxxxxxxx xxxxxxxx xxxxxxxx 4 MI(MInus)
N
0101xxxx xxxxxxxx xxxxxxxx xxxxxxxx 5 PL(PLus)
~N
0110xxxx xxxxxxxx xxxxxxxx xxxxxxxx 6 VS(oVerflow Set) V
0111xxxx xxxxxxxx xxxxxxxx xxxxxxxx 7 VC(出清除oVerflow Clear)
~V
1000xxxx xxxxxxxx xxxxxxxx xxxxxxxx 8 HI(高于HIgher)
C and ~Z
1001xxxx xxxxxxxx xxxxxxxx xxxxxxxx 9 LS(于或同于Lower or Same)
~C and Z
1010xxxx xxxxxxxx xxxxxxxx xxxxxxxx A GE(Greater or equal)N
= V
1011xxxx xxxxxxxx xxxxxxxx xxxxxxxx B LT(Less Than)
N = ~V
1100xxxx xxxxxxxx xxxxxxxx xxxxxxxx C GT(Greater Than)
(N = V) and ~Z
1101xxxx xxxxxxxx xxxxxxxx xxxxxxxx D LE(Less or equal) (N
= ~V) or Z
1110xxxx xxxxxxxx xxxxxxxx xxxxxxxx E AL(是,Always)
1111xxxx xxxxxxxx xxxxxxxx xxxxxxxx F NV(Never)
PDF created with pdfFactory trial version www.pdffactory.com
67
汇编器中,插入条件代码到助记符代码(stub)省略条件
代码缺省使用 AL
在一些汇编器中 HS (高于或同于) LO () 用做 CS CC
条件 GTGELTLE 符号比较, HSHILSLO 符号
较。
一个条件代码 1 的条件的代码。
NB: ARM 废弃使用 NV 条件代码 - 使用 MOV R0,R0 一个指令
是以 MOVNV R0,R0 的处理器可能重新使用 NV 条件做其
条件的指令执行 1S ,使一个指令有条件执行
数据处理指令
xxxx000a aaaSnnnn ddddcccc ctttmmmm 寄存器
xxxx001a aaaSnnnn ddddrrrr bbbbbbbb 立即
典型的汇编:
MOV Rd, #0
ADDEQS Rd, Rn, Rm, ASL Rc
ANDEQ Rd, Rn, Rm
TEQP Pn, #&80000000
CMP Rn, Rm
在操作 a 下, Rn Op2放置结果 Rd 中。
如果使用寄存器式,则 Op2 置为描述 t 移位的 Rm
如果使用立即式,则 Op2 = #b, ROR #2r
t 汇编器 解释
000 LSL #c 逻辑
001 LSL Rc 逻辑
010 LSR #c for c != 0 逻辑
LSR #32 for c = 0
011 LSR Rc 逻辑
100 ASR #c for c != 0 算术
ASR #32 for c = 0
101 ASR Rc 算术
PDF created with pdfFactory trial version www.pdffactory.com
68
110 ROR #c for c != 0
RRX for c = 0 移一位
111 ROR Rc
在寄存器式中,用位 8-11 Rc如果使用 Rc 则位 7 必须清除(如果
编码 1将得到一个乘法SWP 的指令是一个处理指
令。)
有,只使用 Rc 端字 - 如果 Rc = 256, 则移位
MOV[S] Ra,Rb,RLX 可以通过 ADC[S] Ra,Rb,Rb 来完成 RLX
移一位。
汇编器允许使用 ASL LSL 算术移是什么不同
使用术 LSL
通过在 MOVMVN 逻辑指令中 S 位,(在寄存器立即式中)
置为一位。
如果不做移位,则不影位标
如果立即有可选择(例如#1 可以示为 1 ROR #04 ROR #2
16 ROR #4 64 ROR #6),则汇编器希望使用移位的式,如果
获得。所以,如果 0 <= const <= 255,则 MOVS Rn,#const 保持位标
它。
aaaa 汇编器 P-Code
0000 AND 逻辑 Rd = Rn AND Op2
0001 EOR 逻辑 Rd = Rn EOR Op2
0010 SUB Rd = Rn - Op2
0011 RSB Rd = Op2 - Rn
0100 ADD Rd = Rn + Op2
0101 ADC 位的 Rd = Rn + Op2 + C
0110 SBC 位的 Rd = Rn - Op2 - (1-C)
0111 RSC 位的 Rd = Op2 - Rn - (1-C)
1000 TST 测试 Rn AND Op2
1001 TEQ 测试 Rn EOR Op2
1010 CMP 比较 Rn - Op2
1011 CMN 比较 Rn + Op2
1100 ORR 逻辑 Rd = Rn OR Op2
1101 MOV 传送 Rd = Op2
1110 BIC 清除 Rd = Rn AND NOT Op2
1111 MVN 传送 Rd = NOT Op2
注意 MVN CMN 表面MVN 使用(bitwise)操作,
PDF created with pdfFactory trial version www.pdffactory.com
69
Rn 置为 Op2 1 ()CMN Rn Op2 2 行比较。
些指令可 4 :
MOV, MVN
Rn 忽略,并且应 0000 如果置了 S 位,则在结果上 N Z
如果使用移位器,则 C 置为被一位。不影 V
CMN, CMP, TEQ, TST
Rd 不被指令所,并且应 0000 必须 S (汇编器完成
如果它,则个指令 MRS MSR一个的指令。)
算术操作(CMN, CMP)结果上 N Z ALU C V
逻辑操作(TEQ, TST)结果上 N Z 如果使用移位器则
C (下它变成一位)不影 V
有一个( ARMs >= 6,只 26 位模式)dddd 1111
导致结果的位(在用模式下) 26 PSR (
模式下)这由指令的 P - CMNP CMPPTEQPTSTP
TEQP PC,#(模式编) 模式。在 32 位模式,使用 MSR
( TEQP 再工)
ADC, ADD, RSB, RSC, SBC, SUB
如果置了 S 位,则在结果上 N Z ALU C V
AND, BIC, EOR, ORR
如果置了 S 位,则在结果上 N Z 如果使用移位器则 C
(下它变成一位)不影 V
可以使用 ADD SUB 式使寄存器指例如 ADD
R0,PC,#24有用,一些汇编器有一个 ADR 指令(directive)
生成 ADD SUB 指令。(ADR R0, fred 典型 fred 地址放
R0 中, fred 范围)
26-bit 模式下,在 R15 是使用的寄存器一的时候发生:
如果 Rn = R15 则使用的 R15 所有 PSR 位。
如果 Op2 R15 ,则使用所有的 32 位。
32-bit 模式下,使用 R15 的所有的位。
26-bit 模式下,如果 Rd = R15 :
PDF created with pdfFactory trial version www.pdffactory.com
70
如果 S 位,则只 PC 24 位。
如果置了 S 位,则 PC PSR (模式下,
式位I F 位。)
32-bit 模式, 如果 Rd=15,则 PC 的所有的位,包括
个有位,它如果 S 位,则只如果置了 S 位,
把当前模式的 SPSR CPSR 中。在 32-bit 模式下,你不应该执行
PC 目的寄存器并置了 S 位的指令,模式 SPSR(便
你这样断处理器 - 这样做的结果只是不同的处
理器可能不同)
执行些指令使用下目的: 1S + (1S 如果使用寄存器控制的移位) +
(1S + 1N 如果 PC)
分支指令
xxxx101L oooooooo oooooooo oooooooo
典型的汇编:
BEQ 地址
BLNE 子例
使用些指令到一个地址,用执行个指令 PC 的以
位的量给出这地址
线PC 存储个指令的地址 2 个指令(8 ),所以
分支的 = ( 0-23 的有符号):
目的地址 = 当前地址 + 8 + (4 * )
26-bit 模式下,清除目的地址 6 位。
如果置了 L 位,则在个分支之前把 PC 当前 R14。所以
R14 有在个分支的指令的地址调用的程可以用 MOV PC,R14
26-bit 模式下,使用 MOVS PC,R14 一个带连接的分支返回,在返回时
可以恢复 PSR 32-bit 模式下 MOVS PC,R14 的行不同的,
并只适合例外返回
执行分支和带连接的分支二者都使用 2S+1N
PDF created with pdfFactory trial version www.pdffactory.com
71
乘法
xxxx0000 00ASdddd nnnnssss 1001mmmm
典型汇编:
MULEQS Rd, Rm, Rs
MLA Rd, Rm, Rs, Rn
些指令做个操作的乘法,并可以选择加上第个操作把结果放置
一个寄存器中。
如果置了 S 位,则在结果 N Z C 不影 V
如果置了 A 位,则操作的效果 Rd = Rm*Rs + Rn则是 Rd = Rm*Rs
目的寄存器应该操作寄存器 Rm R15 应该操作数或目的寄存
器。
执行些指令在下使用 1S + 16I ,并于实际
实际时 Rs :
Rs 范围
&0 - &1 1S + 1I
&2 - &7 1S + 2I
&8 - &1F 1S + 3I
&20 - &7F 1S + 4I
&80 - &1FF 1S + 5I
&200 - &7FF 1S + 6I
&800 - &1FFF 1S + 7I
&2000 - &7FFF 1S + 8I
&8000 - &1FFFF 1S + 9I
&20000 - &7FFFF 1S + 10I
&80000 - &1FFFFF 1S + 11I
&200000 - &7FFFFF 1S + 12I
&800000 - &1FFFFFF 1S + 13I
&2000000 - &7FFFFFF 1S + 14I
&8000000 - &1FFFFFFF 1S + 15I
&20000000 - &FFFFFFFF 1S + 16I
些乘法 ARM7DM ARM7DM :
PDF created with pdfFactory trial version www.pdffactory.com
72
MLA/
Rs 范围 MUL SMULL SMLAL UMULL UMLAL
&0 - &FF 1S+1I 1S+2I 1S+3I 1S+2I 1S+3I
&100 - &FFFF 1S+2I 1S+3I 1S+4I 1S+3I 1S+4I
&10000 - &FFFFFF 1S+3I 1S+4I 1S+5I 1S+4I 1S+5I
&1000000 - &FEFFFFFF 1S+4I 1S+5I 1S+6I 1S+5I 1S+6I
&FF000000 - &FFFEFFFF 1S+3I 1S+4I 1S+5I 1S+5I 1S+6I
&FFFF0000 - &FFFFFEFF 1S+2I 1S+3I 1S+4I 1S+5I 1S+6I
&FFFFFF00 - &FFFFFFFF 1S+1I 1S+2I 1S+3I 1S+5I 1S+6I
长乘法(ARM7DM)
xxxx0000 1UAShhhh llllssss 1001mmmm
典型的汇编:
UMULL Rl,Rh,Rm,Rs
UMLAL Rl,Rh,Rm,Rs
SMULL Rl,Rh,Rm,Rs
SMLAL Rl,Rh,Rm,Rs
些指令做寄存器 Rm Rs 的乘法并获得一个 64-bit
清除了 U 位的时候乘法是符号(UMULL UMLAL)则是有符号
(SMULL, SMLAL)。在清除了 A 位的时候把结果存储在 Rl
它的存储到 Rh 中。在置了 A 位的时候把结果加
Rh,Rl
应该使用程序计数 R15RhRl Rm 应该不同
如果置了 S 位,则在 64-bit 结果 N Z C V
序可以在的乘法中找到。
单一数据传送
xxxx010P UBWLnnnn ddddoooo oooooooo Immediate form
xxxx011P UBWLnnnn ddddcccc ctt0mmmm Register form
典型的汇编:
PDF created with pdfFactory trial version www.pdffactory.com
73
LDR Rd, [Rn, Rm, ASL#1]!
STR Rd, [Rn],#2
LDRT Rd, [Rn]
LDRB Rd, [Rn]
些指令装载/存储存的一个/到一个寄存器。在指定地址时使用的一个
寄存器在术做基寄存器。
如果置了 L 位,则行装载,行存储。
如果置了 P 位,则使用则使用过
如果置了 U 位,则被加到基寄存器 -
如果置了 B 位,传送存的一个传送一个在汇编器中
助记符加上后缀‘B
W 位的解释使用的地址模式:
W 用做地址地址寄存器中。
(例如传送作用是 Rn := Rn +/- offset 在汇编器中示为指令加上后
!)
地址是写 W 位指传送之前地址
在汇编器中示为指令加上后T
地址导致芯片知内存系统这是一个用模式传送管此芯片是处
模式中是处于特模式中。是有用的,例如在写模器的时候:
个用模式程序一个执行一个 STF 指令,模式代码可以写
如果由一个 FPA 指令它,它异常终止如果由一个 FPE
执行它,它也应该异常终止 FPE 行在一个模式下,所以如果它使
通存储指令,则它异常终止为了使异常终止正确作,在一个
式调用它使用 STRT 通存储指令,使其如同调用模式。
如果使用个指令的立即式,o 段给一个 12-bit 如果使用
寄存器式,则处理指令那样码它,限制允许使用寄存器指令移
如果 R15 用做 Rd修改 PSRPC 应该用在 Op2 中。
限制:
在基寄存器是 PC 时候不要使用写回或
不要使用 PC LDRB STRB Rd
在使用有寄存器的过址时不要 Rn Rm 一个寄存器(这样
导致可能从异常终止恢复)
PDF created with pdfFactory trial version www.pdffactory.com
74
装载使用 1S + 1N + 1I + (1S + 1N 如果 PC)存储使用 2N
块数据传送
xxxx100P USWLnnnn llllllll llllllll
典型的汇编:
LDMFD Rn!, {R0-R4, R8, R12}
STMEQIA Rn, {R0-R3}
STMIB Rn, {R0-R3}^
使用些指令同时装载/存储个寄存器/存。使用的地址在基
寄存器 Rn 有的指定的地址要么增加要地址(可以存储基
寄存器),并且最地址可以到基寄存器中。些指令适合于实
,在进入/退出一个子例存储/恢复寄存器的
U 位指个寄存器地址 +4 ()修改 -4 (清除)修改
W 是指
如果置了 L 位,则指行一个装载操作,如果清除了,则指存储。
使用 P 位指次装载/存储之前还之后/寄存器(参见
)
如果这个操作装载/存储 Rl l
汇编器典型的用条件代码助记符,并代码指 U W
P U
DA 次存储/装载之后 Rn 0 0
DB 次存储/装载之前 Rn 1 0
IA 次存储/装载之后 Rn 0 1
IB 次存储/装载之前 Rn 1 1
时候更清:
PDF created with pdfFactory trial version www.pdffactory.com
75
EA
ED
FA
FD 满降
在一个中,下一个。在一个
存储的寄存器的寄存器在存中在地址可以
代码。例如如果我想 R1-R4 中,中的个装载
使它们回原先的寄存器,:
STMFD R13!,{R1,R2,R3,R4} ;放置 R1
LDMFD R13!,{R1,R2}
LDMFD R13!,{R3,R4}
则是:
STMFA R13!,{R1,R2,R3,R4} ; 放置 R4
LDMFA R13!,{R3,R4}
LDMFA R13!,{R1,R2}
的代码:
代码 装载 存储
EA DB IA
ED IB DA
FA DA IB
FD IA DB
S 控制能,它们被汇编器指示为在指令的放置^:
如果置了 S 位,并指令是 LDM R15 在寄存器列表中,则:
o 26-bit 模式下,装载 R15 的所有 32 位。
o 26-bit 模式下,装载 R15 4 个标位和 24 PC 位。忽略
的位 27 261 0
o 32-bit 模式下,装载 R15 的所有 32 位,但要注意
所以忽略装载到它的任何东西之外把当前模式的 SPSR 传送
CPSR;因模式 SPSR 的指令应该用在 32-bit
模式下。
如果置了 S 位,并指令是 STM R15 在寄存器列表中,则传送
模式的寄存器当前模式的寄存器。在用模式下应该使用个指令。
发生在基寄存器存在于要传送的寄存器列表中的时候
PDF created with pdfFactory trial version www.pdffactory.com
76
寄存器是可以装载有任何问题是,如果寄存器装载则
指定写 - 你不同时把和装载写到基寄存器中!
如果不使用写则可以存储基寄存器有任何问题
如果在存储包含寄存器的一个寄存器列表时候使用,则只有在基
存器是列表一个的下,在写回之前写基寄存器的存。其
写到存中的
发生在程序计数器存在于要装载和存的寄存器列表中。
( 26 位模式下) PSR PC ((在所有模式下) PC 出当前
行的指令的地址 12 是通 8 )
在装载,只有在置了 S 位的时候 PSR 的在当前模式下可的位。
PC 应该寄存器。
装载使用 nS + 1N + 1I + (1S + 1N 如果 PC )存储使用
(n-1)S + 2N n传送目。
软件中断
xxxx1111 yyyyyyyy yyyyyyyy yyyyyyyy
典型的汇编:
SWI "OS_WriteI"
SWINE &400C0
到软件中断的时候ARM 切换 SVC 模式中, R15 当前存到
R14_SVC 中,并存中的位 8,它定在可以找到一个 SWI 处理
来解执行的 SWI 指令的 24 位,并以操作系式做
SWI 事情
ARM 写的操作系统典型的使用 SWI 编程者提供各程。
执行 SWI 指令使用 2S + 1N (加上 SWI 和执行当例程使用的
)
协处理器数据操作
xxxx1110 oooonnnn ddddpppp qqq0mmmm
典型的汇编:
CDP p, o, CRd, CRn, CRm, q
PDF created with pdfFactory trial version www.pdffactory.com
77
CDP p, o, CRd, CRn, CRm
把这个指令处理器 p告诉它在处理器寄存器 CRn CRm
操作 o,并把结果放置 Crd 中。
可以使用 qqq 提供操作有信息
些指令的准使用的定的处理器只是的位的用法
(实际上 FPA 就不) 分是 pppp 必须处理器编:
处理器计者自由 oooonnnnddddqqq mmmm
如果处理器以不同式使用些位,可能使用汇编器来对
的指令正确 CDP 指令。对最使用的处理器 FPA
汇编器有助记符(例如,汇编 MUFEZ F0,F1,#10
成等 CDP 1,1,CR0,CR9,CR15,3)
当前处理器编包括:
1 2 浮点
15 Cache 控制
如果处理器的一个调用处理器(存在!),则
调用指令向量(同于后描述指令) FPA
提供 FP
执行些指令使用 1S + bI b 处理器在指令之前导致
ARM : 处理器控制下。
协处理器数据传送和寄存器传送
xxxx110P UNWLnnnn DDDDpppp oooooooo LDC/STC
xxxx1110 oooLNNNN ddddpppp qqq1MMMM MRC/MCR
们还使用的处理器 p
N D 处理器寄存器编n d ARM 处理器编o 处理器
使用的操作。 M 处理器自由使用的位。
式中,如果 L=1 LDC则是 STC些指令分表现
LDR STR,在立即下,有下例外
4*(oooooooo) 是通 12-bit
如果指定 P=0 ( ),则 W 必须 1 W 1 只是指示要求
告诉存系 是一个用模式传送 P=0 W=0 的指
令。
PDF created with pdfFactory trial version www.pdffactory.com
78
在装载存储一个或更处理器寄存器处理器 DDDD N
存储个寄存器: ARM 所做的传送一个/地址
一个到/地址 + 4 传送一个到/地址 + 8 ,以
处理器告诉
DDDD 示要装载存储的(一个)处理器寄存器, N
,使用 N=1 一个式。处理器计者可以自由忽略...
是汇编:
LDC p,CRd,[Rn,#20] ; (N=0),
STCL p,CRd,[Rn,#-32]! ; (N=1),
LDCNEL p,CRd,[Rn],#-100 ; (N=1),
式中,如果 L=1 MRC, 则是 MCRMRC 传送一个处理器
寄存器到一个 ARM 寄存器, MCR 方向传送(起来是写
ARM 汇编器中目的通写在)
MCR 传送 ARM 寄存器 Rd 处理器。处理器基 oooddddqqq
MMMM 自由的做它做的任何事情有一个标准的解释:
写到处理器寄存器 CRN,使用操作 ooo,用 CRM qqq 提供可能的控制
汇编法是:
MCR p,o,Rd,CRN,CRM,q
MCR 指令的 Rd 应该 R15
MRC 处理器传送一个一的放置 ARM 寄存器 Rd 中。处理器
使用 MCR 自由的以任何生成,有一个标准的解释
CRN,使用操作 ooo,用 CRM qqq 提供可能的控制。汇编法是:
MRC p,o,Rd,CRN,CRM,q
如果 MRC 指令的 Rd R15,使用传送 4 来设弃余
下的 28 位。(例如机制浮点比较指令。)
执行 LDC STC 使用 (n-1)S + 2N + bI MRC 使用 1S+bI+1C
MCR 使用 1S + (b+1)I + 1C b 处理器在指令
之前导致 ARM : 处理器控制下, n 传送
(注意处理器 ARM 控制)
单一数据交换(ARM 3 和以后,包括 ARM 2aS)
xxxx0001 0B00nnnn dddd0000 1001mmmm
典型的汇编:
SWP Rd, Rm, [Rn]
PDF created with pdfFactory trial version www.pdffactory.com
79
些指令装载一个存的一个(用寄存器 Rn 出地址)到一个寄存器 Rd
存储寄存器 Rm 地址Rm Rd 可以是一个寄存器,在
寄存器和存位。装载和存储操作通过 LOCK (pin)为高
在操作定在一理器它当被有中断的完成
如果置了 B 位,则传送存,传送一个
RdRn Rm 都不能是 R15
执行个指令使用 1S + 2N + 1I
状态寄存器传送(ARM 6 和以后)
xxxx0001 0s10aaaa 11110000 0000mmmm MSR 寄存器
xxxx0011 0s10aaaa 1111rrrr bbbbbbbb MSR 立即
xxxx0001 0s001111 dddd0000 00000000 MRS
典型的汇编:
MSR SPSR_all, Rm ;aaaa = 1001
MSR CPSR_flg, #&F0000000 ;aaaa = 1000
MSRNE CPSR_ctl, Rm ;aaaa = 0001
MRS Rd, CPSR
s 访问当前特模式的 SPSR CPSR。只能在模式
下执行令的时候位。
使用 MSR 传送一个寄存器到一个状态寄存器。
aaaa :
0001 PSR 控制位。
1000 PSR 的标位。
1001 PSR 控制位和标(所有存的位)
在寄存器式中,寄存器是 Rm。在立即式中, #b, ROR #2r
R15 应该指定 MRS 指令的寄存器。
使用 MRS 传送处理器的状态到一个寄存器。
dddd 位存储目的寄存器的编Rd 一定能是 R15
PDF created with pdfFactory trial version www.pdffactory.com
80
N.B. 指令编码对应对应操作码(opcode) 10xx 清除了 S 位的
理指令(测试指令)
执行些指令是使用 1S
未定义指令
xxxx0001 yyyyyyyy yyyyyyyy 1yy1yyyy ARM 2
xxxx011y yyyyyyyy yyyyyyyy yyy1yyyy
些指令目。在指令ARM 切换 SVC 模式( ARM 3
) Undef 模式( ARM 6 和以) R15 放置 R14_SVC (
R14_UND)中并到一个位,在希望找到指令的代码并
的执行它。
注意:
些指令文档式下它进入指令处理器
许多指令是以的,什么 例如,下
式的位模式(pattern):
xxxx0000 01xxxxxx xxxxxxxx 1001xxxx
处理的指令乘法乘法和 SWP 指令有是其中一个的:
o 处理指令的位 25 = 0 和位 4 = 1 有寄存器控制的移位,所以必须
7 = 0
o 乘法指令的位 23:22 = 00
o 乘法指令的位 23:22 = 1U
o SWP 指令的位 24 = 1
些指令只是简单什么面列些指令实际上定义进入
指令至少找到
注意 ARM2 指令包括 ARM3/ARM2as 和以 SWP
些指令。
PDF created with pdfFactory trial version www.pdffactory.com

Navigation menu