slide
slide
slide
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
嵌 入 式 计 算 机 系 统<br />
Lecture #3<br />
ARM 7 指 令 系 统<br />
内 容 来 自 于 《ARM 嵌 入 式 系 统 基 础 教 程 》 及 其 配 套 课 件
目 录<br />
q 1.ARM 处 理 器 寻 址 方 式<br />
q 2. 指 令 集 介 绍<br />
§ ARM 指 令 集<br />
§ Thumb 指 令 集<br />
11-8-18 2<br />
Embedded Computer Systems
3.1 ARM 处 理 器 寻 址 方 式<br />
• 寻 址 方 式 分 类<br />
寻 址 方 式 是 根 据 指 令 中 给 出 的 地 址 码 字 段 来 实<br />
现 寻 找 真 实 操 作 数 地 址 的 方 式 。ARM 处 理 器 具 有 9<br />
种 基 本 寻 址 方 式 。<br />
1. 寄 存 器 寻 址 ; 2. 立 即 寻 址 ;<br />
3. 寄 存 器 移 位 寻 址 ; 4. 寄 存 器 间 接 寻 址 ;<br />
5. 基 址 寻 址 ; 6. 多 寄 存 器 寻 址 ;<br />
7. 堆 栈 寻 址 ; 8. 相 对 寻 址 。<br />
11-8-18 3<br />
Embedded Computer Systems
3.1 ARM 处 理 器 寻 址 方 式<br />
• 寻 址 方 式 分 类 —— 寄 存 器 寻 址<br />
操 作 数 的 值 在 寄 存 器 中 , 指 令 中 的 地 址 码 字 段<br />
指 出 的 是 寄 存 器 编 号 , 指 令 执 行 时 直 接 取 出 寄 存 器<br />
值 来 操 作 。 寄 存 器 寻 址 指 令 举 例 如 下 :<br />
MOV R1,R2 ; 将 R2 的 值 存 入 R1<br />
SUB R0,R1,R2<br />
R2<br />
0xAA<br />
; 将 R1 的 值 减 去 R2 的 值 , 结 果 保 存 到 R0<br />
R1<br />
0x55 0xAA<br />
MOV R1,R2<br />
11-8-18 4<br />
Embedded Computer Systems
3.1 ARM 处 理 器 寻 址 方 式<br />
• 寻 址 方 式 分 类 —— 立 即 寻 址<br />
立 即 寻 址 指 令 中 的 操 作 码 字 段 后 面 的 地 址 码 部<br />
分 即 是 操 作 数 本 身 , 也 就 是 说 , 数 据 就 包 含 在 指 令<br />
当 中 , 取 程 出 序 指 存 令 储 也 就 取 出 了 可 以 立 即 使 用 的 操 作 数<br />
( 这 样 的 数 称 为 立 即 数 )。 立 即 寻 址 指 令 举 例 如 下 :<br />
MOV R0,#0xFF00<br />
SUBS R0,R0,#1 ;R0 减 1, 结 果 从 放 代 入 码 R0, 中 并 获 且 得 影 数 响 标 据 志 位<br />
R0 0x55 0xFF00<br />
MOV R0,#0xFF000 ; 将 立 即 数 0xFF000 装 入 R0 寄 存 器<br />
MOV R0,#0xFF00<br />
11-8-18 5<br />
Embedded Computer Systems
3.1 ARM 处 理 器 寻 址 方 式<br />
• 寻 址 方 式 分 类 —— 寄 存 器 移 位 寻 址<br />
寄 存 器 移 位 寻 址 是 ARM 指 令 集 特 有 的 寻 址 方<br />
式 。 当 第 2 个 操 作 数 是 寄 存 器 移 位 方 式 时 , 第 2 个 寄<br />
存 器 操 作 数 在 与 第 1 个 操 作 数 结 合 之 前 , 选 择 进 行<br />
移 位 操 作 。 寄 存 器 移 位 逻 寻 辑 址 左 指 移 令 3 位 举 例 如 下 :<br />
R2 0x01<br />
0x08<br />
MOV R0,R2,LSL #3 ;R2 的 值 左 移 3 位 , 结 果 放 入 R0,<br />
; 即 是 R0=R2×8<br />
R0<br />
0x55 0x08<br />
ANDS R1,R1,R2,LSL R3 ;R2 的 值 左 移 R3 位 , 然 后 和 R1 相<br />
;“ 与 ” 操 作 , 结 果 放 入 R1<br />
MOV R0,R2,LSL #3<br />
11-8-18 6<br />
Embedded Computer Systems
3.1 ARM 处 理 器 寻 址 方 式<br />
• 寻 址 方 式 分 类 —— 寄 存 器 间 接 寻 址<br />
寄 存 器 间 接 寻 址 指 令 中 的 地 址 码 给 出 的 是 ⼀一 个<br />
通 用 寄 存 器 的 编 号 , 所 需 的 操 作 数 保 存 在 寄 存 器 指<br />
定 地 址 的 存 储 单 元 中 , 即 寄 存 器 为 操 作 数 的 地 址 指<br />
针 。 寄 存 器 间 0x40000000 接 寻 址 指 令 举 0xAA 例 如 下 :<br />
LDR R1,[R2] ; 将 R2 指 向 的 存 储 单 元 的 数 据 读 出<br />
R2 0x40000000<br />
; 保 存 在 R1 中<br />
R0<br />
0x55 0xAA<br />
SWP R1,R1,[R2] ; 将 寄 存 器 R1 的 值 和 R2 指 定 的 存 储<br />
; 单 元 的 内 容 交 换<br />
LDR R0,[R2]<br />
11-8-18 7<br />
Embedded Computer Systems
3.1 ARM 处 理 器 寻 址 方 式<br />
• 寻 址 方 式 分 类 —— 基 址 寻 址<br />
基 址 寻 址 就 是 将 基 址 寄 存 器 的 内 容 与 指 令 中 给<br />
出 的 偏 移 量 相 加 , 形 成 操 作 数 的 有 效 地 址 。 基 址 寻<br />
址 用 于 访 问 基 址 附 近 的 存 储 单 元 , 常 用 于 查 表 、 数<br />
组 操 作 、 功 能 0x4000000C 部 件 寄 存 器 0xAA 访 问 等 。 基 址 寻 址 指 令 举<br />
例 如 下 将 : R3+0x0C 作<br />
R3 0x40000000<br />
LDR 为 R2,[R3,#0x0C] 地 址 装 载 数 ; 读 取 R3+0x0C 地 址 上 的 存 储 单 元<br />
据<br />
R2 0x55 0xAA<br />
; 的 内 容 , 放 入 R2<br />
STR R1,[R0,#-4]! ; 先 R0=R0-4, 然 后 把 R1 的 值 寄 存<br />
LDR R2,[R3,#0x0C]<br />
; 到 保 存 到 R0 指 定 的 存 储 单 元<br />
11-8-18 8<br />
Embedded Computer Systems
3.1 ARM 处 理 器 寻 址 方 式<br />
• 寻 址 方 式 分 类 —— 多 寄 存 器 寻 址<br />
多 寄 存 器 寻 址 ⼀一 次 可 传 送 几 个 寄 存 器 值 , 允 许<br />
⼀一 条 指 令 传 送 16 个 寄 存 器 的 任 何 子 集 或 所 有 寄 存 器 。<br />
多 寄 存 R6 器 寻 0x 0x04 址 指 令 举 例 如 下 : 0x04 0x4000000C<br />
R4 0x 0x03<br />
LDMIA R1!,{R2-R7,R12} ; 将 R1 指 向 的 单 元 中 的 数 据 读 出 到<br />
R3<br />
;R2〜~R7、R12 中 (R1 自 动 加 1)<br />
STMIA R0!,{R2-R7,R12} ; 将 寄 存 器 R2〜~R7、R12 的 值 保<br />
R2 0x 0x01<br />
0x01 0x40000000<br />
R1<br />
0x 0x02<br />
0x40000000<br />
0x40000010<br />
0x03<br />
0x02<br />
0x40000008<br />
0x40000004<br />
; 存 到 R0 指 向 的 存<br />
存<br />
储<br />
储<br />
;<br />
器<br />
单 元 中<br />
;(R0 自 动 加 1)<br />
LDMIA R1!,{R2-R4,R6}<br />
11-8-18 9<br />
Embedded Computer Systems
3.1 ARM 处 理 器 寻 址 方 式<br />
• 寻 址 方 式 分 类 —— 堆 栈 寻 址<br />
堆 栈 是 ⼀一 个 按 特 定 顺 序 进 行 存 取 的 存 储 区 , 操<br />
作 顺 序 为 “ 后 进 先 出 ” 。 堆 栈 寻 址 是 隐 含 的 , 它 使 用<br />
⼀一 个 专 门 的 寄 存 器 ( 堆 栈 指 针 ) 指 向 ⼀一 块 存 储 区 域 ( 堆<br />
栈 ), 指 针 所 指 向 的 存 储 单 元 即 是 堆 栈 的 栈 顶 。 存 储<br />
器 堆 栈 可 分 为 两 种 :<br />
§ 向 上 生 长 : 向 高 地 址 方 向 生 长 , 称 为 递 增 堆 栈<br />
§ 向 下 生 长 : 向 低 地 址 方 向 生 长 , 称 为 递 减 堆 栈<br />
11-8-18 10<br />
Embedded Computer Systems
3.1 ARM 处 理 器 寻 址 方 式<br />
• 寻 址 方 式 分 类 —— 堆 栈 寻 址<br />
堆 栈 压 栈<br />
0x12345678<br />
SPà 栈 顶<br />
栈 底<br />
栈 区<br />
向 上<br />
增 长<br />
堆 栈 存<br />
储 区<br />
向 下<br />
增 长<br />
栈 区<br />
栈 底<br />
栈 顶 ßSP<br />
0x12345678<br />
11<br />
堆 栈 压 栈<br />
11-8-18 Embedded Computer Systems
3.1 ARM 处 理 器 寻 址 方 式<br />
• 寻 址 方 式 分 类 —— 堆 栈 寻 址<br />
堆 栈 指 针 指 向 最 后 压 入 的 堆 栈 的 有 效 数 据 项 , 称 为 满 堆 栈 ;<br />
堆 栈 指 针 指 向 下 ⼀一 个 待 压 入 数 据 的 空 位 置 , 称 为 空 堆 栈 。<br />
压 栈<br />
0x12345678<br />
压 栈<br />
SPà 栈 顶<br />
SPà 栈 顶<br />
0x12345678<br />
SPà 栈 顶<br />
0x12345678<br />
SPà 栈 顶<br />
满 堆 栈<br />
空 堆 栈<br />
栈 底<br />
栈 底<br />
11-8-18 12<br />
Embedded Computer Systems
3.1 ARM 处 理 器 寻 址 方 式<br />
• 寻 址 方 式 分 类 —— 堆 栈 寻 址<br />
所 以 可 以 组 合 出 四 种 类 型 的 堆 栈 方 式 :<br />
§ 满 递 增 : 堆 栈 向 上 增 长 , 堆 栈 指 针 指 向 内 含 有 效 数 据<br />
项 的 最 高 地 址 。 指 令 如 LDMFA、STMFA 等 ;<br />
§ 空 递 增 : 堆 栈 向 上 增 长 , 堆 栈 指 针 指 向 堆 栈 上 的 第 ⼀一<br />
个 空 位 置 。 指 令 如 LDMEA、STMEA 等 ;<br />
§ 满 递 减 : 堆 栈 向 下 增 长 , 堆 栈 指 针 指 向 内 含 有 效 数 据<br />
项 的 最 低 地 址 。 指 令 如 LDMFD、STMFD 等 ;<br />
§ 空 递 减 : 堆 栈 向 下 增 长 , 堆 栈 指 针 向 堆 栈 下 的 第 ⼀一 个<br />
空 位 置 。 指 令 如 LDMED、STMED 等 。<br />
11-8-18 13<br />
Embedded Computer Systems
3.1 ARM 处 理 器 寻 址 方 式<br />
• 寻 址 方 式 分 类 —— 相 对 寻 址<br />
相 对 寻 址 是 基 址 寻 址 的 ⼀一 种 变 通 。 由 程 序 计 数<br />
器 PC 提 供 基 准 地 址 , 指 令 中 的 地 址 码 字 段 作 为 偏 移<br />
量 , 两 者 相 加 后 得 到 的 地 址 即 为 操 作 数 的 有 效 地 址 。<br />
相 对 寻 址 指 令 举 例 如 下 :<br />
BL SUBR1 ; 调 用 到 SUBR1 子 程 序<br />
BEQ LOOP ; 条 件 跳 转 到 LOOP 标 号 处<br />
...<br />
LOOP MOV R6,#1<br />
...<br />
SUBR1 ...<br />
11-8-18 14<br />
Embedded Computer Systems
本 章 学 习 重 点<br />
1. ARM 处 理 器 的 寻 址 方 式<br />
——8 种 寻 址 方 式 ;<br />
2. ARM 指 令 的 特 点 ;<br />
3. ARM 指 令 的 种 类 , 它 能 完 成 哪 些 功 能 。<br />
11-8-18 15<br />
Embedded Computer Systems
ADD R0, R1, #3 属 于 ( )<br />
A. 立 即 寻 址 B. 多 寄 存 器 寻 址<br />
C. 寄 存 器 直 接 寻 址 D. 相 对 寻 址<br />
11-8-18 16<br />
Embedded Computer Systems
若 R1=2000H,(2000H)=0x86, (2008H)<br />
=0x39, 则 执 行 LDR R0,[R1, #8]! 后 R0 的 值 为 ____<br />
11-8-18 17<br />
Embedded Computer Systems
目 录<br />
q 1.ARM 处 理 器 寻 址 方 式<br />
q 2. 指 令 集 介 绍<br />
§ ARM 指 令 集<br />
§ Thumb 指 令 集<br />
11-8-18 18<br />
Embedded Computer Systems
• 简 单 的 ARM 程 序<br />
; 文 件 名 :TEST1.S<br />
; 功 能 : 实 现 两 个 寄 存 器 相 加<br />
; 说 明 : 使 用 ARMulate 软 件 仿 真 调 试<br />
AREA Example1,CODE,READONLY ; 声 明 代 码 段 Example1<br />
ENTRY ; 标 识 程 序 入 口<br />
CODE32<br />
; 声 明 32 位 ARM 指 令<br />
START MOV R0,#0 ; 设 置 参 数<br />
MOV R1,#10<br />
LOOP BL ADD_SUB ; 调 用 子 程 序 ADD_SUB<br />
ADD_SUB<br />
使 用 “;” 进 行 注 释<br />
B LOOP ; 跳 转 到 LOOP<br />
标 号 顶 格 写<br />
实 际 代 码 段<br />
ADDS R0,R0,R1 ;R0 = R0 + R1<br />
MOV PC,LR ; 子 程 序 返 回<br />
END ; 文 件 结 束<br />
声 明 文 件 结 束<br />
11-8-18 19<br />
Embedded Computer Systems
• 简 单 的 ARM 程 序<br />
; 文 件 名 :TEST1.S<br />
; 功 能 : 实 现 两 个 寄 存 器 相 加<br />
; 说 明 : 使 用 ARMulate 软 件 仿 真 调 试<br />
AREA Example1,CODE,READONLY ; 声 明 代 码 段 Example1<br />
ENTRY ; 标 识 程 序 入 口<br />
CODE32<br />
; 声 明 32 位 ARM 指 令<br />
START MOV R0,#0 ; 设 置 参 数<br />
MOV R1,#10<br />
LOOP BL ADD_SUB ; 调 用 子 程 序 ADD_SUB<br />
ADD_SUB<br />
B LOOP ; 跳 转 到 LOOP<br />
ADDS R0,R0,R1 ;R0 = R0 + R1<br />
MOV PC,LR ; 子 程 序 返 回<br />
END ; 文 件 结 束<br />
11-8-18 20<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 —— 指 令 格 式<br />
ARM 指 令 的 基 本 格 式 如 下 :<br />
{} {S}<br />
,{,}<br />
其 中 号 内 的 项 是 必 须 的 ,{} 号 内 的 项 是 可 选 的 。<br />
各 项 的 说 明 如 下 :<br />
opcode: 指 令 助 记 符 ; cond: 执 行 条 件 ;<br />
S: 是 否 影 响 CPSR 寄 存 器 的 值 ;<br />
Rd: 目 标 寄 存 器 ; Rn: 第 1 个 操 作 数 的 寄 存 器 ;<br />
operand2: 第 2 个 操 作 数 ;<br />
11-8-18 21<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 —— 第 2 个 操 作 数<br />
ARM 指 令 的 基 本 格 式 如 下 :<br />
{} {S}<br />
,{,}<br />
灵 活 的 使 用 第 2 个 操 作 数 “operand2” 能 够 提 高 代 码<br />
效 率 。 它 有 如 下 的 形 式 :<br />
§ #immed_8r—— 常 数 表 达 式 ;<br />
§ Rm—— 寄 存 器 方 式 ;<br />
§ Rm,shift—— 寄 存 器 移 位 方 式 ;<br />
11-8-18 22<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 —— 第 2 个 操 作 数<br />
§ #immed_8r—— 常 数 表 达 式<br />
该 常 数 必 须 对 应 8 位 位 图 , 即 必 须 是 ⼀一 个 8 位 的 常<br />
数 通 过 循 环 右 移 偶 数 位 可 以 得 到 的 数 。<br />
循 环 右 移 10 位<br />
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0<br />
0x00<br />
0x00<br />
移 位 前 的 8 位 常 数 0x12<br />
0 0 0 0 0 0 0 0<br />
0x00<br />
0 0 0 1 0 0 1 0<br />
0x12<br />
0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0<br />
0x04<br />
0x80<br />
移 位 后 得 到 的 常 数 0x04800000<br />
0 0 0 0 0 0 0 0<br />
0x00<br />
0 0 0 0 0 0 0 0<br />
0x00<br />
11-8-18 23<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 —— 第 2 个 操 作 数<br />
§ #immed_8r—— 常 数 表 达 式<br />
该 常 数 必 须 对 应 8 位 位 图 , 即 必 须 是 ⼀一 个 8 位 的 常<br />
数 通 过 循 环 右 移 偶 数 位 可 以 得 到 的 数 。<br />
例 如 :<br />
MOV R0,#1<br />
AND R1,R2,#0x0F<br />
MOV R1,#0xC000 ;0xC000 可 由 0x03 循 环 右 移 16 位 得 到<br />
11-8-18 24<br />
Embedded Computer Systems
思 考 与 练 习<br />
1. 以 下 8 位 图 立 即 数 是 否 合 法 <br />
0x0103C000<br />
×<br />
0x12800000<br />
√<br />
可 以 由 0x4A 循 环 右 移 10 位 得 到<br />
2. 请 列 举 2 个 8 位 图 立 即 数 <br />
0x4000003B(0xED 循 环 右 移 2 位 )<br />
0x0016C000(0x5B 循 环 右 移 18 位 )<br />
11-8-18 25<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 —— 第 2 个 操 作 数<br />
§ Rm—— 寄 存 器 方 式<br />
在 寄 存 器 方 式 下 , 操 作 数 即 为 寄 存 器 的 数 值 。<br />
例 如 :<br />
SUB R1,R1,R2<br />
MOV PC,R0<br />
11-8-18 26<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 —— 第 2 个 操 作 数<br />
§ Rm,shift—— 寄 存 器 移 位 方 式<br />
将 寄 存 器 的 移 位 结 果 作 为 操 作 数 , 但 Rm 值 保 持 不<br />
变 , 移 位 方 法 如 下 :<br />
操 作 码 说 明 操 作 码 说 明<br />
ASR #n 算 术 右 移 n 位 ROR #n 循 环 右 移 n 位<br />
LSL #n 逻 辑 左 移 n 位 RRX 带 扩 展 的 循 环 右 移 1 位<br />
LSR #n 逻 辑 右 移 n 位 Type Rs<br />
Type 为 移 位 的 一 种 类 型 ,Rs 为<br />
偏 移 量 寄 存 器 , 低 8 位 有 效 。<br />
11-8-18 27<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 —— 第 2 个 操 作 数<br />
LSL 移 位 操 作 : 0<br />
LSR 移 位 操 作 : 0<br />
ASR 移 位 操 作 :<br />
ROR 移 位 操 作 :<br />
RRX 移 位 操 作 :<br />
C<br />
11-8-18 28<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 —— 第 2 个 操 作 数<br />
§ Rm,shift—— 寄 存 器 移 位 方 式<br />
例 如 :<br />
ADD R1,R1,R1,LSL #3 ;R1=R1+R1*8=9R1<br />
SUB R1,R1,R2,LSR R3 ;R1=R1-(R2/2 R3 )<br />
11-8-18 29<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 —— 条 件 码<br />
ARM 指 令 的 基 本 格 式 如 下 :<br />
{} {S}<br />
,{,}<br />
使 用 条 件 码 “cond” 可 以 实 现 高 效 的 逻 辑 操 作 , 提 高<br />
代 码 效 率 。<br />
绝 大 部 分 的 ARM 指 令 都 可 以 条 件 执 行 , 而 Thumb<br />
指 令 只 有 B( 跳 转 ) 指 令 具 有 条 件 执 行 功 能 。 如 果 指<br />
令 不 标 明 条 件 代 码 , 将 默 认 为 无 条 件 (AL) 执 行 。<br />
11-8-18 30<br />
Embedded Computer Systems
• 指 令 条 件 码 表<br />
操 作 码 条 件 助 记 符 标 志 含 义<br />
0000 EQ Z=1 相 等<br />
0001 NE Z=0 不 相 等<br />
0010 CS/HS C=1 无 符 号 数 大 于 或 等 于<br />
0011 CC/LO C=0 无 符 号 数 小 于<br />
0100 MI N=1 负 数<br />
0101 PL N=0 正 数 或 零<br />
0110 VS V=1 溢 出<br />
0111 VC V=0 没 有 溢 出<br />
1000 HI C=1,Z=0 无 符 号 数 大 于<br />
1001 LS C=0,Z=1 无 符 号 数 小 于 或 等 于<br />
1010 GE N=V 有 符 号 数 大 于 或 等 于<br />
1011 LT N!=V 有 符 号 数 小 于<br />
1100 GT Z=0,N=V 有 符 号 数 大 于<br />
1101 LE Z=1,N!=V 有 符 号 数 小 于 或 等 于<br />
1110 AL 任 何 无 条 件 执 行 ( 指 令 默 认 条 件 )<br />
1111 NV 任 何 从 不 执 行 ( 不 要 使 用 )<br />
11-8-18 31<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 —— 条 件 码<br />
示 例 :<br />
C 代 码 :<br />
if(a > b)<br />
a++;<br />
else<br />
b++;<br />
对 应 的 汇 编 代 码 :<br />
CMP R0,R1 ;R0 与 R1 比 较<br />
ADDHI R0,R0,#1 ; 若 R0>R1, 则 R0=R0+1<br />
ADDLS R1,R1,#1 ; 若 R0≤R1, 则 R1=R1+1<br />
11-8-18 32<br />
Embedded Computer Systems
本 章 学 习 重 点<br />
1. ARM 处 理 器 的 寻 址 方 式<br />
——8 种 寻 址 方 式 ;<br />
2. ARM 指 令 的 特 点<br />
—— 可 条 件 执 行 、 可 选 择 影 响 标 志 位 、 具 有<br />
非 常 灵 活 的 第 二 操 作 数 ;<br />
3. ARM 指 令 的 种 类 , 它 能 完 成 哪 些 功 能 。<br />
11-8-18 33<br />
Embedded Computer Systems
ARM 指 令 种 类<br />
1. 存 储 器 访 问 指 令<br />
2. 数 据 处 理 指 令<br />
3. 乘 法 指 令<br />
4.ARM 分 支 指 令<br />
5. 协 处 理 器 指 令<br />
6. 杂 项 指 令<br />
7. 伪 指 令<br />
11-8-18 34<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 —— 存 储 器 访 问 指 令<br />
ARM 处 理 器 是 典 型 的 RISC 处 理 器 , 对 存 储 器<br />
的 访 问 只 能 使 用 加 载 和 存 储 指 令 实 现 。ARM 处 理 器<br />
是 冯 • 诺 依 曼 存 储 结 构 , 程 序 空 间 、RAM 空 间 及 I/O<br />
映 射 空 间 统 ⼀一 编 址 , 除 对 RAM 操 作 以 外 , 对 外 围 IO、<br />
程 序 数 据 的 访 问 均 要 通 过 加 载 / 存 储 指 令 进 行 。<br />
存 储 器 访 问 指 令 分 为 单 寄 存 器 操 作 指 令 和 多 寄<br />
存 器 操 作 指 令 。<br />
11-8-18 35<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 存 储 器 访 问 指 令 —— 单 寄 存 器 存 取<br />
LDR/STR 指 令 用 于 对 内 存 变 量 的 访<br />
问 、 内 存 缓 冲 区 数 据 的 访 问 、 查 表 、 外 围<br />
部 件 的 控 制 操 作 等 。 若 使 用 LDR 指 令 加 载<br />
数 据 到 PC 寄 存 器 , 则 实 现 程 序 跳 转 功 能 ,<br />
这 样 也 就 实 现 了 程 序 散 转 。<br />
所 有 单 寄 存 器 加 载 / 存 储 指 令 可 分 为<br />
“ 字 和 无 符 号 字 节 加 载 存 储 指 令 ” 和 “ 半 字 和<br />
有 符 号 字 节 加 载 存 储 指 令 。<br />
11-8-18 36<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 存 储 器 访 问 指 令 —— 单 寄 存 器 存 取<br />
装 载 指 令 :LDR<br />
目 标 寄 存 器 , 源 地 址<br />
目 标 寄 存 器<br />
源 地 址<br />
存 储 器<br />
存 储 指 令 :STR<br />
源 寄 存 器 , 目 标 地 址<br />
源 寄 存 器<br />
目 标 地 址<br />
存 储 器<br />
11-8-18 37<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 存 储 器 访 问 指 令 —— 单 寄 存 器 存 取<br />
装 载 指 令 :LDR x<br />
存 储 指 令 :STR x<br />
LDR/STR 指 令 搭 配 不 同<br />
的 后 缀 实 现 不 同 方 式 的<br />
单 寄 存 器 存 取 操 作 :<br />
字 / 半 字 / 字 节 数 据 控 制<br />
是 / 否 用 户 模 式 控 制<br />
无 / 有 符 号 控 制<br />
11-8-18 38<br />
Embedded Computer Systems
• ARM 存 储 器 访 问 指 令 —— 装 载 指 令<br />
助 记 符 说 明 操 作 条 件 码 位 置<br />
LDR Rd,addressing<br />
LDRB Rd,addressing<br />
LDRT Rd,addressing<br />
LDRBT Rd, addressing<br />
LDRH Rd, addressing<br />
LDRSB Rd, addressing<br />
LDRSH Rd, addressing<br />
加 载 字 数 据<br />
加 载 无 符 号 字 节 数 据<br />
以 用 户 模 式 加 载 字 数 据<br />
以 用 户 模 式 加 载 无 符 号<br />
字 节 数 据<br />
加 载 无 符 号 半 字 数 据<br />
加 载 有 符 号 字 节 数 据<br />
加 载 有 符 号 半 字 数 据<br />
Rd←[addressing],<br />
addressing 索 引<br />
Rd←[addressing],<br />
addressing 索 引<br />
Rd←[addressing],<br />
addressing 索 引<br />
Rd←[addressing],<br />
addressing 索 引<br />
Rd←[addressing],<br />
addressing 索 引<br />
Rd←[addressing],<br />
addressing 索 引<br />
Rd←[addressing],<br />
addressing 索 引<br />
LDR{cond}<br />
LDR{cond}B<br />
LDR{cond}T<br />
LDR{cond}BT<br />
LDR{cond}H<br />
LDR{cond}SB<br />
LDR{cond}SH<br />
11-8-18 39<br />
Embedded Computer Systems
• ARM 存 储 器 访 问 指 令 —— 保 存 指 令<br />
助 记 符 说 明 操 作 条 件 码 位 置<br />
STR Rd, addressing 存 储 字 数 据<br />
STRB Rd,addressing<br />
STRT Rd,addressing<br />
STRBT Rd,addressing<br />
STRH Rd,addressing<br />
存 储 字 节 数 据<br />
以 用 户 模 式 存 储 字 数 据<br />
以 用 户 模 式 存 储 字 节 数<br />
据<br />
存 储 半 字 数 据<br />
[addressing]←Rd,<br />
addressing 索 引<br />
[addressing]←Rd,<br />
addressing 索 引<br />
[addressing]←Rd,<br />
addressing 索 引<br />
[addressing]←Rd,<br />
addressing 索 引<br />
[addressing] ←Rd,<br />
addressing 索 引<br />
STR{cond}<br />
STR{cond}B<br />
STR{cond}T<br />
STR{cond}BT<br />
STR{cond}H<br />
11-8-18 40<br />
Embedded Computer Systems
• ARM 存 储 器 访 问 指 令 —— 地 址 形 式<br />
装 载 指 令 :LDR<br />
目 标 寄 存 器 , 源 地 址<br />
保 存 指 令 :STR 源 寄 存 器 , 目 标 地 址<br />
立 即 数 : 立 即 数 可 以 是 ⼀一 个 无 符 号 的 数 值 。 这 个 数 据 可 以<br />
加 到 基 址 寄 存 器 , 也 可 以 从 基 址 寄 存 器 中 减 去 这 个 数 值 。<br />
如 :LDR R1,[R0,#0x12]<br />
寄 存 器 : 寄 存 器 中 的 数 值 可 以 加 到 基 址 寄 存 器 , 也 可 以 从<br />
基 址 寄 存 器 中 减 去 这 个 数 值 。<br />
如 :LDR R1,[R0,R2]<br />
寄 存 器 及 移 位 常 数 : 寄 存 器 移 位 后 的 值 可 以 加 到 基 址 寄 存<br />
器 , 也 可 以 从 基 址 寄 存 器 中 减 去 这 个 数 值 。<br />
如 :LDR R1,[R0,R2,LSL #2]<br />
11-8-18 41<br />
Embedded Computer Systems
• ARM 存 储 器 访 问 指 令 —— 寻 址 方 式<br />
装 载 指 令 :LDR<br />
目 标 寄 存 器 , 源 地 址<br />
保 存 指 令 :STR 源 寄 存 器 , 目 标 地 址<br />
零 偏 移 :<br />
如 :LDR Rd,[Rn]<br />
前 索 引 偏 移 : 如 :LDR Rd,[Rn,#0x04]!<br />
程 序 相 对 偏 移 : 如 :LDR Rd,labe1<br />
后 索 引 偏 移 : 如 :LDR Rd,[Rn],#0x04<br />
注 意 : 大 多 数 情 况 下 , 必 须 保 证 字 数 据 操 作 的 地 址 是 32<br />
11-8-18 位 对 齐 的 。<br />
42<br />
Embedded Computer Systems
• ARM 存 储 器 访 问 指 令 —— 单 寄 存 器 转 载 应 用<br />
应 用 示 例 :<br />
LDR R2,[R5] ; 将 R5 指 向 地 址 的 字 数 据 存 入 R2<br />
R5 0x40000000<br />
R2 0x55 0x12345678<br />
0x12345678 0x40000000<br />
地 址<br />
存 储 器<br />
11-8-18 43<br />
Embedded Computer Systems
• ARM 存 储 器 访 问 指 令 —— 单 寄 存 器 保 存 应 用<br />
应 用 示 例 :<br />
STR R1,[R2,#0x04] ; 将 R1 的 数 据 存 储 到 R0+0x04 地 址<br />
R2 0x40000000<br />
R1<br />
0x12345678<br />
+4<br />
0x 0x12345678<br />
0x40000004<br />
地 址<br />
存 储 器<br />
11-8-18 44<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 存 储 器 访 问 指 令 —— 多 寄 存 器 存 取<br />
多 寄 存 器 加 载 / 存 储 指 令 可 以 实 现 在<br />
⼀一 组 寄 存 器 和 ⼀一 块 连 续 的 内 存 单 元 之 间<br />
传 输 数 据 。 LDM 为 加 载 多 个 寄 存 器 ;<br />
STM 为 存 储 多 个 寄 存 器 。 允 许 ⼀一 条 指 令<br />
传 送 16 个 寄 存 器 的 任 何 子 集 或 所 有 寄 存<br />
器 。 它 们 主 要 用 于 现 场 保 护 、 数 据 复 制 、<br />
常 数 传 递 等 。<br />
11-8-18 45<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 存 储 器 访 问 指 令 —— 多 寄 存 器 存 取<br />
装 载 指 令 :LDM<br />
源 地 址 , 目 标 寄 存 器 列 表<br />
目 标 寄 存 器 1<br />
目 标 寄 存 器 n<br />
源 地 址<br />
存 储 器<br />
存 储 指 令 :STM<br />
目 标 地 址 , 源 寄 存 器 列 表<br />
源 寄 存 器 1<br />
源 寄 存 器 n<br />
目 标 地 址<br />
存 储 器<br />
11-8-18 46<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 存 储 器 访 问 指 令 —— 多 寄 存 器 存 取<br />
装 载 指 令 :LDM x<br />
存 储 指 令 :STM x<br />
LDM/STM 指 令 搭 配 不 同<br />
的 后 缀 实 现 不 同 方 式 地<br />
址 增 长 方 式 :<br />
IA: 每 次 传 送 后 地 址 加 4<br />
IB: 每 次 传 送 前 地 址 加 4<br />
DA: 每 次 传 送 后 地 址 减 4<br />
DB: 每 次 传 送 前 地 址 减 4<br />
11-8-18 47<br />
Embedded Computer Systems
• ARM 存 储 器 访 问 指 令 —— 多 寄 存 器 存 取<br />
数 据 块 传 送 指 令<br />
操 作 过 程 如 右 图<br />
所 示 , 其 中 R1 为<br />
指 令 执 行 前 的 基<br />
址 寄 存 器 ,R1’ 则<br />
为 指 令 执 行 后 的<br />
基 址 寄 存 器 。<br />
R1’ à 4014H<br />
R7 4010H<br />
R6 400CH<br />
R1 à R5 4008H<br />
4004H<br />
4000H<br />
指 令 STMIA R1!,{R5-R7}<br />
4014H<br />
R1 à R7 4010H<br />
R6 400CH<br />
R5 4008H<br />
R1’ à 4004H<br />
4000H<br />
4014H<br />
R1’ à R7 4010H<br />
R6 400CH<br />
R5 4008H<br />
R1 à 4004H<br />
4000H<br />
指 令 STMIB R1!,{R5-R7}<br />
R1 à 4014H<br />
R7 4010H<br />
R6 400CH<br />
R1’ à R5 4008H<br />
4004H<br />
4000H<br />
指 令 STMDA R1!,{R5-<br />
R7}<br />
指 令 STMDB R1!,{R5-<br />
R7}<br />
11-8-18 48<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 存 储 器 访 问 指 令 —— 多 寄 存 器 存 取<br />
多 寄 存 器 存 取 指 令 与 堆 栈 操 作 指 令 的 关 系 如 下 表 所 示 。<br />
模 式 说 明 模 式 说 明<br />
IA 每 次 传 送 后 地 址 加 4 FD 满 递 减 堆 栈<br />
IB 每 次 传 送 前 地 址 加 4 ED 空 递 减 堆 栈<br />
DA 每 次 传 送 后 地 址 减 4 FA 满 递 增 堆 栈<br />
DB 每 次 传 送 前 地 址 减 4 EA 空 递 增 堆 栈<br />
数 据 块 传 送 操 作<br />
堆 栈 操 作<br />
11-8-18 49<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 存 储 器 访 问 指 令 —— 多 寄 存 器 存 取<br />
多 寄 存 器 存 取 指 令 与 堆 栈 操 作 指 令 的 关 系 如 下 表 所 示 。<br />
数 据 块 传 送<br />
存 储<br />
堆 栈 操 作<br />
压 栈<br />
说 明<br />
数 据 块 传 送<br />
加 载<br />
堆 栈 操 作<br />
出 栈<br />
说 明<br />
STMDA STMED 空 递 减 LDMDA LDMFA 满 递 减<br />
STMIA STMEA 空 递 增 LDMIA LDMFD 满 递 增<br />
STMDB STMFD 满 递 减 LDMDB LDMEA 空 递 减<br />
STMIB STMFA 满 递 增 LDMIB LDMED 空 递 增<br />
11-8-18 50<br />
Embedded Computer Systems
• ARM 存 储 器 访 问 指 令 —— 多 寄 存 器 存 取<br />
应 用 示 例 :<br />
LDMIA R1!,{R2-R4,R6}<br />
将 R1 指 向 的 内 存 数 据 读 取 到 R0-R4 和 R6 寄 存 器 中<br />
R6 0x 0x04<br />
R4 0x 0x03<br />
R3<br />
R2 0x 0x01<br />
0x01 0x40000000<br />
R1<br />
0x 0x02<br />
0x40000000<br />
0x40000010<br />
0x04<br />
0x03<br />
0x02<br />
0x4000000C<br />
0x40000008<br />
0x40000004<br />
存 储 器<br />
11-8-18 51<br />
Embedded Computer Systems
• ARM 存 储 器 访 问 指 令 —— 满 递 减 压 栈 操 作<br />
应 用 示 例 :<br />
STMFD SP!,{R0-R7,LR}<br />
1. 压 栈 操 作 前 寄 存 器<br />
和 堆 栈 区 的 状 态 ;<br />
2. 压 栈 操 作 前 堆 栈 指<br />
针 指 向 栈 顶 ;<br />
R0<br />
R1<br />
R7<br />
SP<br />
LR<br />
ARM7 内 核<br />
0x00<br />
0x01<br />
……<br />
0x07<br />
……<br />
0x4020<br />
0x0123<br />
内 部 寄 存 器<br />
存 储 器<br />
0x<br />
0x<br />
0x<br />
0x<br />
0x<br />
0x<br />
0x<br />
0x<br />
0x<br />
0x<br />
0x<br />
地 址<br />
0x4020<br />
0x401C<br />
0x4018<br />
0x4014<br />
0x4010<br />
0x400C<br />
0x4008<br />
0x4004<br />
0x4000<br />
0x3FFC<br />
0x3FF8<br />
11-8-18 52<br />
Embedded Computer Systems<br />
栈<br />
顶
• ARM 存 储 器 访 问 指 令 —— 满 递 减 压 栈 操 作<br />
应 用 示 例 :<br />
STMFD SP!,{R0-R7,LR}<br />
1. 压 栈 操 作 前 寄 存 器<br />
和 堆 栈 区 的 状 态 ;<br />
2. 压 栈 操 作 前 堆 栈 指<br />
针 指 向 栈 顶 ;<br />
3. 执 行 压 栈 操 作 指 令<br />
保 存 R0-R7 和 LR<br />
R0<br />
R1<br />
R7<br />
SP<br />
LR<br />
ARM7 内 核<br />
0x00<br />
0x01<br />
……<br />
0x07<br />
……<br />
0x4020 0x3FFC<br />
0x0123<br />
内 部 寄 存 器<br />
存 储 器<br />
0x<br />
0x 0x0123<br />
0x 0x07<br />
0x 0x06<br />
0x 0x05<br />
0x 0x04<br />
0x 0x03<br />
0x 0x02<br />
0x 0x01<br />
0x 0x00<br />
0x<br />
地 址<br />
0x4020<br />
0x401C<br />
0x4018<br />
0x4014<br />
0x4010<br />
0x400C<br />
0x4008<br />
0x4004<br />
0x4000<br />
0x3FFC<br />
0x3FF8<br />
11-8-18 53<br />
Embedded Computer Systems<br />
栈<br />
顶
• ARM 存 储 器 访 问 指 令 —— 满 递 减 出 栈 操 作<br />
应 用 示 例 :<br />
LDMFD SP!,{R0-R7,PC}<br />
1. 出 栈 操 作 前 寄 存 器<br />
和 堆 栈 区 的 状 态 ;<br />
2. 出 栈 操 作 前 堆 栈 指<br />
针 指 向 栈 顶 ;<br />
ARM7 内 核<br />
R0 0x<br />
R1 0x<br />
……<br />
R7 0x<br />
……<br />
SP 0x4020 0x3FFC<br />
LR 0x<br />
PC 0x<br />
存 储 器<br />
0x<br />
0x 0x0123<br />
0x 0x07<br />
0x 0x06<br />
0x 0x05<br />
0x 0x04<br />
0x 0x03<br />
0x 0x02<br />
0x 0x01<br />
0x 0x00<br />
0x<br />
地 址<br />
0x4020<br />
0x401C<br />
0x4018<br />
0x4014<br />
0x4010<br />
0x400C<br />
0x4008<br />
0x4004<br />
0x4000<br />
0x3FFC<br />
11-8-18 54<br />
Embedded Computer Systems<br />
0x3FF8<br />
栈<br />
顶
• ARM 存 储 器 访 问 指 令 —— 满 递 减 出 栈 操 作<br />
应 用 示 例 :<br />
LDMFD SP!,{R0-R7,PC}<br />
1. 出 栈 操 作 前 寄 存 器<br />
和 堆 栈 区 的 状 态 ;<br />
2. 出 栈 操 作 前 堆 栈 指<br />
针 指 向 栈 顶 ;<br />
3. 执 行 出 栈 操 作 指 令<br />
恢 复 R0-R7 和 PC<br />
ARM7 内 核<br />
R0 0x 0x00<br />
R1 0x 0x01<br />
……<br />
R7 0x 0x07<br />
……<br />
SP<br />
0x3FFC 0x4020<br />
LR 0x<br />
PC 0x 0x0123<br />
存 储 器<br />
0x<br />
0x<br />
0x0123<br />
0x<br />
0x07<br />
0x<br />
0x06<br />
0x<br />
0x05<br />
0x<br />
0x04<br />
0x<br />
0x03<br />
0x<br />
0x02<br />
0x<br />
0x01<br />
0x<br />
0x00<br />
0x<br />
地 址<br />
0x4020<br />
0x401C<br />
0x4018<br />
0x4014<br />
0x4010<br />
0x400C<br />
0x4008<br />
0x4004<br />
0x4000<br />
0x3FFC<br />
11-8-18 55<br />
Embedded Computer Systems<br />
0x3FF8<br />
栈<br />
顶
• ARM 存 储 器 访 问 指 令 —— 满 递 减 出 栈 操 作<br />
带 状 态 寄 存 器 恢 复 的 出 栈 操 作 :<br />
LDMFD SP!,{R0-R7,PC}^<br />
1. 出 栈 操 作 前 寄 存 器<br />
和 堆 栈 区 的 状 态 ;<br />
2. 出 栈 操 作 前 堆 栈 指<br />
针 指 向 栈 顶 ;<br />
ARM7 内 核<br />
R0 0x<br />
R1 0x<br />
……<br />
R7 0x<br />
……<br />
SP 0x4020 0x3FFC<br />
LR 0x<br />
PC 0x<br />
CPSR 0x<br />
SPSR 0x<br />
存 储 器<br />
0x<br />
0x 0x0123<br />
0x 0x07<br />
0x 0x06<br />
0x 0x05<br />
0x 0x04<br />
0x 0x03<br />
0x 0x02<br />
0x 0x01<br />
0x 0x00<br />
0x<br />
地 址<br />
0x4020<br />
0x401C<br />
0x4018<br />
0x4014<br />
0x4010<br />
0x400C<br />
0x4008<br />
0x4004<br />
0x4000<br />
0x3FFC<br />
0x3FF8<br />
11-8-18 56<br />
Embedded Computer Systems<br />
栈<br />
顶
• ARM 存 储 器 访 问 指 令 —— 满 递 减 出 栈 操 作<br />
带 状 态 寄 存 器 恢 复 的 出 栈 操 作 :<br />
LDMFD SP!,{R0-R7,PC}^<br />
1. 出 栈 操 作 前 寄 存 器<br />
和 堆 栈 区 的 状 态 ;<br />
2. 出 栈 操 作 前 堆 栈 指<br />
针 指 向 栈 顶 ;<br />
3. 执 行 出 栈 操 作 指 令<br />
恢 复 R0-R7 和 PC<br />
ARM7 内 核<br />
R0 0x 0x00<br />
R1 0x 0x01<br />
……<br />
R7 0x 0x07<br />
……<br />
SP<br />
0x3FFC 0x4020<br />
LR 0x<br />
PC 0x 0x0123<br />
CPSR 0x<br />
SPSR 0x<br />
存 储 器<br />
0x<br />
0x<br />
0x0123<br />
0x<br />
0x07<br />
0x<br />
0x06<br />
0x<br />
0x05<br />
0x<br />
0x04<br />
0x<br />
0x03<br />
0x<br />
0x02<br />
0x<br />
0x01<br />
0x<br />
0x00<br />
0x<br />
地 址<br />
0x4020<br />
0x401C<br />
0x4018<br />
0x4014<br />
0x4010<br />
0x400C<br />
0x4008<br />
0x4004<br />
0x4000<br />
0x3FFC<br />
0x3FF8<br />
11-8-18 57<br />
Embedded Computer Systems<br />
栈<br />
顶
3.2 指 令 集 介 绍<br />
• ARM 存 储 器 访 问 指 令 —— 寄 存 器 和 存 储 器 交 换 指 令<br />
SWP 指 令 用 于 将 ⼀一 个 内 存 单 元 ( 该 单 元 地<br />
址 放 在 寄 存 器 Rn 中 ) 的 内 容 读 取 到 ⼀一 个 寄 存 器<br />
Rd 中 , 同 时 将 另 ⼀一 个 寄 存 器 Rm 的 内 容 写 入 到<br />
该 内 存 单 元 中 。 使 用 SWP 可 实 现 信 号 量 操 作 。<br />
11-8-18 58<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 存 储 器 访 问 指 令 —— 寄 存 器 和 存 储 器 交 换 指 令<br />
装 载 指 令 :<br />
SWP<br />
读 入 寄 存 器 , 输 出 寄 存 器 , 目 标 地 址<br />
读 入 寄 存 器<br />
输 出 寄 存 器<br />
目 标 地 址<br />
存 储 器<br />
11-8-18 59<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 存 储 器 访 问 指 令 —— 寄 存 器 和 存 储 器 交 换 指 令<br />
装 载 指 令 :<br />
SWP<br />
读 入 寄 存 器 , 输 出 寄 存 器 , 目 标 地 址<br />
SWP<br />
助 记 符 说 明 操 作 条 件 码 位 置<br />
Rd,Rm,Rn<br />
SWPB Rd,Rm,Rn<br />
寄 存 器 和 存 储 器 字 数 据<br />
交 换<br />
寄 存 器 和 存 储 器 字 节 数<br />
据 交 换<br />
Rd←[Rn],[Rn]←Rm<br />
(Rn≠Rd 或 Rm)<br />
Rd←[Rn],[Rn]←Rm<br />
(Rn≠Rd 或 Rm)<br />
SWP{cond}<br />
SWP{cond}B<br />
11-8-18 60<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 存 储 器 访 问 指 令 —— 寄 存 器 和 存 储 器 交 换 指 令<br />
应 用 示 例 :<br />
SWP R2,R1,[R0]<br />
将 R1 的 内 容 与 R0 指 向 的 存 储 单 元 的 内 容 进 行 交 换<br />
R2 0x11223344 0x<br />
R1<br />
0x12345678<br />
R0 0x40000000<br />
0x12345678 0x11223344 0x40000000<br />
地 址<br />
存 储 器<br />
11-8-18 61<br />
Embedded Computer Systems
ARM 指 令 种 类<br />
1. 存 储 器 访 问 指 令<br />
2. 数 据 处 理 指 令<br />
3. 乘 法 指 令<br />
4.ARM 分 支 指 令<br />
5. 协 处 理 器 指 令<br />
6. 杂 项 指 令<br />
7. 伪 指 令<br />
11-8-18 62<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 ——ARM 数 据 处 理 指 令<br />
数 据 处 理 指 令 大 致 可 分 为 3 类 :<br />
§ 数 据 传 送 指 令 ;<br />
§ 算 术 逻 辑 运 算 指 令 ;<br />
§ 比 较 指 令 。<br />
数 据 处 理 指 令 只 能 对 寄 存 器 的 内 容 进 行 操 作 ,<br />
而 不 能 对 内 存 中 的 数 据 进 行 操 作 。 所 有 ARM 数 据 处<br />
理 指 令 均 可 选 择 使 用 S 后 缀 , 并 影 响 状 态 标 志 。<br />
11-8-18 63<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• 数 据 传 送 指 令<br />
MOV 指 令 将 8 位 图 立 即 数 或 寄 存 器 传 送 到 目<br />
标 寄 存 器 (Rd), 可 用 于 移 位 运 算 等 操 作 。<br />
装 载 指 令 :<br />
MOV<br />
目 标 寄 存 器 , 操 作 数<br />
目 标 寄 存 器<br />
操 作 数<br />
11-8-18 64<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• 数 据 传 送 指 令<br />
MOV 指 令 将 8 位 图 立 即 数 或 寄 存 器 传 送 到 目<br />
标 寄 存 器 (Rd), 可 用 于 移 位 运 算 等 操 作 。<br />
同 类 型 的 指 令 还 有 MVN, 它 可 以 实 现 数 据 的<br />
非 传 递 , 即 把 操 作 数 取 反 后 送 至 目 标 寄 存 器 。<br />
MVN<br />
目 标 寄 存 器 , 操 作 数<br />
目 标 寄 存 器<br />
操 作 数 取 反<br />
11-8-18 65<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• 数 据 传 送 指 令<br />
应 用 示 例 :<br />
MOV R3,R1,LSL #3<br />
;R3=R1×8<br />
逻 辑 左 移 3 位<br />
R1 0x01 0x08<br />
R3 0x55 0x08<br />
11-8-18 66<br />
Embedded Computer Systems
思 考 与 练 习<br />
1.MOV 指 令 与 LDR 指 令 都 是 往 目 标 寄 存 器 中<br />
传 送 数 据 , 但 是 它 们 有 什 么 区 别 吗 <br />
11-8-18 67<br />
Embedded Computer Systems
思 考 与 练 习<br />
1.MOV 指 令 与 LDR 指 令 都 是 往 目 标 寄 存 器 中<br />
传 送 数 据 , 但 是 它 们 有 什 么 区 别 吗 <br />
MOV 指 令 用 于 将 数 据 从 ⼀一 个 寄 存 器 传 送 到<br />
另 ⼀一 个 寄 存 器 中 , 或 者 将 ⼀一 个 常 数 传 送 到 ⼀一<br />
个 寄 存 器 中 , 但 是 不 能 访 问 内 存 。LDR 指 令<br />
用 于 从 内 存 中 读 取 数 据 放 入 寄 存 器 中 。<br />
11-8-18 68<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• 算 术 逻 辑 运 算 指 令<br />
算 术 逻 辑 运 算 指 令 包 括 “ 加 / 减 ” 以 及 “ 与 / 或 / 异<br />
或 ” 等 指 令 , 它 们 的 格 式 如 下 :<br />
OpCode<br />
结 果 寄 存 器 , 运 算 寄 存 器 , 第 二 操 作 数<br />
运 算 寄 存 器<br />
运 算 符<br />
第 二 操 作 数<br />
结 果 寄 存 器<br />
11-8-18 69<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• 算 术 逻 辑 运 算 指 令<br />
OpCode<br />
部 分 算 术 运 算 符 :<br />
ADD: 加 法 运 算<br />
ADC: 带 进 位 加 法 运 算<br />
SUB: 减 法 运 算<br />
RSB: 逆 向 减 法 运 算<br />
SBC: 带 进 位 减 法 运 算<br />
RSC: 带 进 位 逆 向 减 法 运 算<br />
11-8-18 70<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• 算 术 逻 辑 运 算 指 令<br />
OpCode<br />
部 分 逻 辑 运 算 符 :<br />
AND: 逻 辑 “ 与 ” 运 算<br />
ORR : 逻 辑 “ 或 ” 运 算<br />
EOR: 逻 辑 “ 异 或 ” 运 算<br />
BIC: 位 清 除 运 算<br />
11-8-18 71<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• 算 术 逻 辑 运 算 指 令<br />
应 用 示 例 :<br />
ADD R3,R1, #0x08<br />
;R3=R1+8<br />
R1<br />
0x00000005<br />
加 法<br />
第 二 操 作 数<br />
0x08<br />
R3<br />
0x 0x0000000D<br />
11-8-18 72<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• 算 术 逻 辑 运 算 指 令<br />
应 用 示 例 :<br />
AND R3,R1, #0xFF<br />
;R3=R1 & 0x000000FF<br />
R1<br />
0x12345678<br />
与<br />
第 二 操 作 数<br />
0x000000FF<br />
R3<br />
0x 0x00000078<br />
11-8-18 73<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• 算 术 逻 辑 运 算 指 令<br />
应 用 示 例 :<br />
ORR R3,R1, R2<br />
;R3=R1|R2<br />
R1<br />
0x00112233<br />
或<br />
0xAA000000<br />
R2<br />
R3<br />
0xAA112233<br />
0x<br />
11-8-18 74<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• 算 术 逻 辑 运 算 指 令<br />
应 用 示 例 :<br />
EOR R3,R1, R2,LSL 0x03 ;R3=R1 ^ (R2 ×8)<br />
0x00000011<br />
R2<br />
逻 辑 左 移 3 位<br />
R1<br />
0x000000FF<br />
异 或<br />
0x 0x00000088<br />
操 作 数<br />
R3<br />
0x00000077 0x<br />
11-8-18 75<br />
Embedded Computer Systems
思 考 与 练 习<br />
1. 用 R1 寄 存 器 的 最 低 字 节 替 换 掉 R2 寄 存 器<br />
的 最 低 字 节 , 并 不 影 响 条 件 标 志 位 <br />
R1<br />
BYTE3<br />
BYTE2<br />
BYTE1 BYTE0<br />
R2<br />
BYTE3<br />
BYTE2<br />
BYTE1 BYTE0<br />
11-8-18 76<br />
Embedded Computer Systems
思 考 与 练 习<br />
1. 用 R1 寄 存 器 的 最 低 字 节 替 换 掉 R2 寄 存 器<br />
的 最 低 字 节 , 并 不 影 响 条 件 标 志 位 <br />
AND<br />
AND<br />
ORR<br />
R1,R1,#0x000000FF<br />
R2,R2,#0xFFFFFF00<br />
R2,R2,R1<br />
11-8-18 77<br />
Embedded Computer Systems
假 设 R1=0x31, R2=0x2, 则 执 行<br />
ADD R0, R1, R2 LSL #3<br />
后 ,R0 的 值 是 ______<br />
11-8-18 78<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• 比 较 指 令<br />
比 较 指 令 将 两 个 数 值 进 行 的 特 定 运 算 , 根 据<br />
运 算 结 果 影 响 CPSR 的 相 关 标 志 位 , 用 于 后 面 程<br />
序 的 条 件 执 行 , 但 是 运 算 结 果 不 予 保 存 。<br />
OpCode<br />
运 算 寄 存 器 , 操 作 数<br />
运 算 寄 存 器<br />
运 算 符<br />
操 作 数<br />
影 响 标 志 位<br />
11-8-18 79<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• 比 较 指 令<br />
OpCode<br />
比 较 运 算 符 :<br />
CMP: 数 值 比 较<br />
CMN: 负 数 比 较<br />
TST: 位 测 试<br />
TEQ: 相 等 测 试<br />
11-8-18 80<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• 比 较 指 令<br />
应 用 示 例 :<br />
CMP R3,R1<br />
;R3 减 R1 并 影 响 标 志 位<br />
R1<br />
0x00000005<br />
减 法<br />
0x08<br />
R3<br />
无 条 符 件 号 标 小 志 于<br />
11-8-18 81<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• 比 较 指 令<br />
应 用 示 例 :<br />
TST R3,#0x02<br />
; 测 试 R3 的 第 2 位 并 影 响 标 志 位<br />
R3<br />
0x00000005<br />
相 与<br />
操 作 数<br />
0x02<br />
为 条 1 件 标 志<br />
11-8-18 82<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• 比 较 指 令<br />
应 用 示 例 :<br />
TEQ R3,R2<br />
; R3 与 R2 是 否 相 等 并 影 响 标 志 位<br />
R3<br />
0x000000AA<br />
异 或<br />
0x000000CC<br />
R2<br />
不 条 等 件 标 志<br />
与 CMP 的 区 别 在 于 TEQ 不 影 响 C 和 V 位 , 也 就 是 只 能<br />
判 断 是 否 相 等 , 而 不 能 判 断 是 否 大 于 , 或 小 于 。<br />
11-8-18 83<br />
Embedded Computer Systems
ARM 指 令 种 类<br />
1. 存 储 器 访 问 指 令<br />
2. 数 据 处 理 指 令<br />
3. 乘 法 指 令<br />
4.ARM 分 支 指 令<br />
5. 协 处 理 器 指 令<br />
6. 杂 项 指 令<br />
7. 伪 指 令<br />
11-8-18 84<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 —— 乘 法 指 令<br />
ARM7TDMI 具 有 三 种 乘 法 指 令 , 分 别 为 :<br />
§ 32×32 位 乘 法 指 令 ;<br />
§ 32× 32 位 乘 加 指 令 ;<br />
§ 32× 32 位 结 果 为 64 位 的 乘 / 乘 加 指 令 。<br />
11-8-18 85<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 —— 乘 法 指 令<br />
助 记 符 说 明 操 作 条 件 码 位 置<br />
MUL Rd,Rm,Rs 32 位 乘 法 指 令 RdßRm*Rs (Rd≠Rm) MUL{cond}{S}<br />
MLA Rd,Rm,Rs,Rn 32 位 乘 加 指 令 RdßRm*Rs+Rn (Rd≠Rm) MLA{cond}{S}<br />
UMULL RdLo,RdHi,Rm,Rs 64 位 无 符 号 乘 法 指 令 (RdLo,RdHi)ßRm*Rs UMULL{cond}{S}<br />
UMLAL RdLo,RdHi,Rm,Rs<br />
64 位 无 符 号 乘 加 指 令<br />
(RdLo,RdHi)ßRm*Rs+<br />
(RdLo,RdHi)<br />
SMLAL{cond}{S}<br />
SMULL RdLo,RdHi,Rm,Rs 64 位 有 符 号 乘 法 指 令 (RdLo,RdHi)ßRm*Rs SMULL{cond}{S}<br />
SMLAL RdLo,RdHi,Rm,Rs<br />
64 位 有 符 号 乘 加 指 令<br />
(RdLo,RdHi)ßRm*Rs+<br />
(RdLo,RdHi)<br />
SMLAL{cond}{S}<br />
11-8-18 86<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 ——32×32 位 乘 法 指 令<br />
MUL<br />
目 标 寄 存 器 , 运 算 寄 存 器 , 第 二 操 作 数<br />
运 算 寄 存 器<br />
乘 法<br />
第 二 操 作 数<br />
目 标 寄 存 器<br />
11-8-18 87<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 ——32×32 位 乘 法 指 令<br />
应 用 示 例 :<br />
MUL R3,R2,R1<br />
; R3=R2×R1<br />
R1<br />
0x00000002<br />
乘 法<br />
0x00000008<br />
R2<br />
R3<br />
0x00000010 0x<br />
11-8-18 88<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 ——32×32 位 乘 加 法 指 令<br />
MLA<br />
目 标 寄 存 器 , 运 算 寄 存 器 1, 运 算 寄 存 器 2, 第 二 操 作 数<br />
运 算 寄 存 器 1 运 算 寄 存 器 2<br />
乘 法<br />
第 二 操 作 数<br />
加 法<br />
中 间 结 果<br />
目 标 寄 存 器<br />
11-8-18 89<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 ——32×32 位 乘 加 法 指 令<br />
应 用 示 例 :<br />
MLA R3,R2,R1,R0<br />
; R3=R2×R1 + R0<br />
R2<br />
0x00000002<br />
乘 法<br />
0x00000008<br />
R1<br />
R0<br />
0x00000005<br />
加 法<br />
中 0x00000010 间 结 果<br />
R3<br />
0x00000015<br />
11-8-18 90<br />
Embedded Computer Systems
ARM 指 令 种 类<br />
1. 存 储 器 访 问 指 令<br />
2. 数 据 处 理 指 令<br />
3. 乘 法 指 令<br />
4.ARM 分 支 指 令<br />
5. 协 处 理 器 指 令<br />
6. 杂 项 指 令<br />
7. 伪 指 令<br />
11-8-18 91<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 —— 程 序 如 何 跳 转<br />
在 ARM 中 有 两 种 方 式 可 以 实 现 程 序 的 跳 转 :<br />
1. 直 接 向 PC 寄 存 器 赋 值 实 现 跳 转 ;<br />
例 : MOV PC,R14<br />
2. 使 用 分 支 指 令 直 接 跳 转 。<br />
11-8-18 92<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 ——<br />
分 支 指 令<br />
OpCode<br />
跳 转 目 标<br />
跳 转 指 令<br />
跳 转 目 标<br />
程 序 代 码<br />
11-8-18 93<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 ——<br />
分 支 指 令<br />
OpCode<br />
跳 转 目 标<br />
分 支 指 令 种 类 :<br />
跳 转 指 令<br />
B: 分 支 指 令<br />
BL: 跳 转 目 带 标 链 接 的 分 支 指 令<br />
BX: 带 状 态 切 换 的 分 支 指 令<br />
程 序 代 码<br />
11-8-18 94<br />
Embedded Computer Systems
• ARM 指 令 —— 分 支 指 令<br />
B/BL 指 令 编 码 格 式<br />
指<br />
令<br />
执<br />
行<br />
的<br />
条<br />
件<br />
码<br />
操<br />
作<br />
码<br />
表<br />
示<br />
区<br />
24 位 常 数 , 跳 转 目 标 地 址<br />
( 基 于 PC 的 偏 移 量 )<br />
因 为 用 来 表 示 目 标 地 址 的 位 数 有<br />
限 , 所 以 B/BL 指 令 无 法 实 现<br />
4G(32 位 ) 范 围 内 的 任 意 跳 转<br />
11-8-18 95<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
分 支 指 令 “B”<br />
B 指 令 为 简 单 的 跳 转 指 令 , 不 附 带 其 它 功<br />
能 。 跳 转 范 围 限 制 在 当 前 指 令 的 ±32M 字 节 地 址<br />
内 (ARM 指 令 为 字 对 齐 , 最 低 2 位 地 址 固 定 为 0)。<br />
• ARM 指 令 集 ——<br />
B main<br />
main<br />
xx<br />
程 序 代 码<br />
11-8-18 96<br />
Embedded Computer Systems
• ARM 指 令 —— 分 支 指 令<br />
带 链 接 的 分 支 指 令 ——BL 指 令 除 了 具 有 跳 转 功 能 , 还 能<br />
在 跳 转 之 前 将 下 ⼀一 条 指 令 的 地 址 拷 贝 到 R14( 即 LR) 链 接 寄 存<br />
器 中 , 它 适 用 于 子 程 序 调 用 。 跳 转 范 围 限 制 在 当 前 指 令 的<br />
±32M 字 节 地 址 内 。 指 令 格 式 如 下 :<br />
BL<br />
Label<br />
“BL”<br />
例 如 : BL DelayNS ; 调 用 子 程 序 DelayNS<br />
2. 1. 当 程 序 跳 执 转 行 到 目 BL 标 跳 地<br />
址 转 Label 指 令 时 继 , 续 硬 执 件 行 将 , 下 当<br />
子 ⼀一 程 条 序 指 执 令 行 的 结 地 束 址 后 Addr2 ,<br />
将 装 LR 入 LR 寄 存 寄 器 存 内 器 容 , 存 并 入 把<br />
PC, 跳 转 地 返 址 回 装 调 入 用 程 函 序 数 计 继<br />
续 数 执 器 行 (PC)<br />
Addr1<br />
Addr2<br />
Label<br />
BL Label<br />
xxx<br />
xxx<br />
xxx<br />
MOV PC,LR<br />
xxx Addr1 Label Addr2<br />
xxx Addr2<br />
PC<br />
LR<br />
程 序 代 码<br />
11-8-18 97<br />
Embedded Computer Systems
• ARM 指 令 —— 分 支 指 令<br />
“BX”<br />
带 状 态 切 换 的 分 支 指 令 ——BX 指 令 除 了 具 有 跳<br />
转 功 能 , 还 能 在 跳 转 的 同 时 切 换 处 理 器 状 态 。 其 跳<br />
转 范 围 不 受 限 制 。 指 令 格 式 如 下 :<br />
BX<br />
Rn<br />
Y<br />
最 低 位 为 1<br />
N<br />
切 换 到 Thumb 状 态<br />
切 换 到 ARM 状 态<br />
11-8-18 98<br />
Embedded Computer Systems
• ARM 指 令 —— 分 支 指 令<br />
“BX”<br />
带 状 态 切 换 的 分 支 指 令 ——BX 指 令 除 了 具 有 跳<br />
转 功 能 , 还 能 在 跳 转 的 同 时 切 换 处 理 器 状 态 。 其 跳<br />
转 范 围 不 受 限 制 。 指 令 格 式 如 下 :<br />
BX<br />
Rn<br />
例 如 :<br />
ADRL R0,T_Fun+1<br />
; 将 Thumb 程 序 的 入 口 地 址 加 1 存 入 R0<br />
BX R0 ; 跳 转 到 R0 指 定 的 地 址 ,<br />
; 并 根 据 R0 的 最 低 位 来 切 换 处 理 器 状 态<br />
11-8-18 99<br />
Embedded Computer Systems
ARM 指 令 种 类<br />
1. 存 储 器 访 问 指 令<br />
2. 数 据 处 理 指 令<br />
3. 乘 法 指 令<br />
4.ARM 分 支 指 令<br />
5. 协 处 理 器 指 令<br />
6. 杂 项 指 令<br />
7. 伪 指 令<br />
11-8-18 100<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 —— 协 处 理 器 指 令<br />
ARM 内 核 支 持 协 处 理 器 操 作 , 协 处 理<br />
器 的 控 制 要 通 过 协 处 理 器 命 令 实 现 。<br />
ARM 内 核 与 协 处 理 器 的 关 系<br />
数 据 地 址 总 线<br />
ARM 内 核<br />
协 处 理 器 A<br />
协 处 理 器 B<br />
…<br />
握 手 信 号<br />
11-8-18 101<br />
Embedded Computer Systems
• ARM 指 令 —— 协 处 理 器 指 令<br />
助 记 符 说 明 操 作 条 件 码 位 置<br />
CDP coproc,opcode1,CRd,CRn,<br />
CRm{,opcode2}<br />
协 处 理 器 数 据 操 作 指 令<br />
取 决 于 协 处 理 器 CDP{cond}<br />
LDC{L} coproc, CRd,< 地 址 > 协 处 理 器 数 据 读 取 指 令 取 决 于 协 处 理 器 LDC{cond}<br />
{L}<br />
STC{L} coproc, CRd,< 地 址 > 协 处 理 器 数 据 写 入 指 令 取 决 于 协 处 理 器 STC{cond}<br />
{L}<br />
MCR coproc,opcode1,Rd,CRn,<br />
CRm{,opcode2}<br />
MRC coproc,opcode1,Rd,CRn,<br />
CRm{,opcode2}<br />
ARM 寄 存 器 到 协 处 理 器 寄<br />
存 器 的 数 据 传 送 指 令<br />
协 处 理 器 寄 存 器 到 ARM 寄<br />
存 器 到 的 数 据 传 送 指 令<br />
取 决 于 协 处 理 器 MCR{cond}<br />
取 决 于 协 处 理 器 MCR{cond}<br />
11-8-18 102<br />
Embedded Computer Systems
ARM 指 令 种 类<br />
1. 存 储 器 访 问 指 令<br />
2. 数 据 处 理 指 令<br />
3. 乘 法 指 令<br />
4.ARM 分 支 指 令<br />
5. 协 处 理 器 指 令<br />
6. 杂 项 指 令<br />
7. 伪 指 令<br />
11-8-18 103<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 —— 杂 项 指 令<br />
在 ARM 指 令 集 中 杂 项 指 令 共 有 3 条 , 它<br />
们 非 常 重 要 , 特 别 是 与 操 作 系 统 的 使 用 息 息<br />
相 关 :<br />
1. 软 件 中 断 产 生 指 令 :SWI<br />
2. 程 序 状 态 寄 存 器 读 指 令 :MRS<br />
3. 程 序 状 态 寄 存 器 写 指 令 :MSR<br />
11-8-18 104<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 —— 软 中 断 指 令<br />
“SWI”<br />
SWI 指 令 用 于 产 生 软 中 断 , 主 要 用 于 用 户 程<br />
序 调 用 操 作 系 统 的 系 统 服 务 。 执 行 该 指 令 后 , 处<br />
理 器 将 完 成 以 下 动 作 :<br />
1. 切 换 到 管 理 模 式<br />
2. 将 CPSR 备 份 到 管 理 模 式 下 的 SPSR 寄 存 器<br />
3. 程 序 跳 转 到 软 件 中 断 入 口<br />
11-8-18 105<br />
Embedded Computer Systems
• ARM 杂 项 指 令 —— 软 中 断 指 令<br />
1. 使 用 操 作 系 统 后 , 为<br />
了 防 止 出 错 的 任 务 影 响<br />
其 它 任 务 的 执 行 , 通 常<br />
将 任 务 放 在 用 户 模 式 执<br />
行 , 以 限 制 其 权 限 ;<br />
用 户 模 式<br />
任 务 1<br />
任 务 2<br />
管 理 模 式<br />
功 能 1: 打 开 中 断<br />
功 能 2: 关 闭 中 断<br />
2. 对 于 ⼀一 些 重 要 的 操 作 ,<br />
如 中 断 的 开 关 , 必 须 由<br />
操 作 系 统 完 成 。 使 用 软<br />
件 中 断 指 令 即 可 完 成 系<br />
统 功 能 调 用 ;<br />
……<br />
其 它 代 码<br />
CPSR 寄 存 器<br />
……<br />
功 能 n: 任 务 调 度<br />
SPSR 寄 存 器<br />
11-8-18 106<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 —— 软 中 断 指 令<br />
“SWI”<br />
SWI 指 令 格 式 如 下 所 示 :<br />
SWI<br />
immed_24<br />
可 以 利 用 指 令 中 的 这 个 24<br />
位 立 即 数 向 软 中 断 服 务 程 序 传<br />
递 参 数 , 比 如 请 求 的 服 务 类 型<br />
11-8-18 107<br />
Embedded Computer Systems
• ARM 杂 项 指 令 —— 软 中 断 指 令<br />
根 据 SWI 指 令 传 递 的 参 数 SWI 异 常 处 理 程 序 可 以 作 出 相 应 的 处 理 。<br />
SWI 指 令 传 递 参 数 有 以 下 两 种 方 法 ,<br />
§ 指 令 中 的 24 位 立 即 数 指 定 了 用 户 请 求 的 服 务 类 型 , 参 数 通 过 通 用 寄 存<br />
器 传 递 。<br />
MOV R0,#34 ; 设 置 子 功 能 号 为 34<br />
SWI 12 ; 调 用 12 号 软 中 断<br />
§ 指 令 中 的 24 位 立 即 数 被 忽 略 , 用 户 请 求 的 服 务 类 型 由 寄 存 器 R0 的 值<br />
决 定 , 参 数 通 过 其 它 的 通 用 寄 存 器 传 递 。<br />
MOV R0,#12 ; 调 用 12 号 软 中 断<br />
MOV R1,#34 ; 设 置 子 功 能 号 为 34<br />
SWI 0<br />
11-8-18 108<br />
Embedded Computer Systems
• ARM 杂 项 指 令 —— 软 中 断 指 令<br />
在 SWI 异 常 中 断 处 理 程 序 中 , 取 出 SWI 指 令 中 立 即 数 的 步 骤 为 :<br />
§ 首 先 确 定 引 起 软 中 断 的 SWI 指 令 是 ARM 指 令 还 是 Thumb 指 令 , 这 可 通<br />
过 对 SPSR 访 问 得 到 ;<br />
§ 然 后 取 得 该 SWI 指 令 的 地 址 , 这 可 通 过 访 问 LR 寄 存 器 得 到 ;<br />
§ 接 着 读 出 该 SWI 指 令 , 分 解 出 立 即 数 。<br />
SWI_Handler<br />
STMFD SP!, {R0-R3, R12, LR} ; 现 场 保 护<br />
MRS R0, SPSR ; 读 取 SPSR<br />
STMFD SP!, {R0}<br />
; 保 存 SPSR<br />
TST R0, #0x20 ; 测 试 T 标 志 位<br />
LDRNEH R0, [LR,#-2] ; 若 是 Thumb 指 令 , 读 取 指 令 码 (16 位 )<br />
BICNE R0, R0, #0xFF00 ; 取 得 Thumb 指 令 的 8 位 立 即 数<br />
LDREQ R0, [LR,#-4] ; 若 是 ARM 指 令 , 读 取 指 令 码 (32 位 )<br />
BICEQ R0, R0, #0xFF000000<br />
; 取 得 ARM 指 令 的 24 位 立 即 数<br />
...<br />
11-8-18 109<br />
LDMFD SP!, {R0-R3, R12, PC}^ ; SWI 异 常 中 断 返 回<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 —— 状 态 寄 存 器 读 指 令<br />
“MRS”<br />
在 ARM 处 理 器 中 , 只 有 MRS 指 令 可 以 对 状 态 寄 存<br />
器 CPSR 和 SPSR 进 行 读 操 作 。 通 过 读 CPSR 可 以 了 解<br />
当 前 处 理 器 的 工 作 状 态 。 读 SPSR 寄 存 器 可 以 了 解 到 进<br />
入 异 常 前 的 处 理 器 状 态 。 指 令 格 式 如 下 所 示 :<br />
MRS<br />
目 标 寄 存 器 ,psr<br />
目 标 寄 存 器<br />
PSR<br />
11-8-18 110<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 —— 状 态 寄 存 器 读 指 令<br />
“MRS”<br />
应 用 示 例 :<br />
MRS R1,CPSR ; 读 取 CPSR 状 态 寄 存 器 到 R1<br />
MRS R2,SPSR ; 读 取 SPSR 状 态 寄 存 器 到 R2<br />
11-8-18 111<br />
Embedded Computer Systems
• ARM 杂 项 指 令 —— 状 态 寄 存 器 写 指 令<br />
“MSR”<br />
在 ARM 处 理 器 中 , 只 有 MSR 指 令 可 以 对 状 态 寄 存 器<br />
CPSR 和 SPSR 进 行 写 操 作 。 与 MRS 配 合 使 用 , 可 以 实 现 对<br />
CPSR 或 SPSR 寄 存 器 的 读 - 修 改 - 写 操 作 , 可 以 切 换 处 理 器 模<br />
式 等 操 作 。<br />
MSR<br />
psr_field, 操 作 数<br />
PSR 寄 存 器 被 分 为 四 个 8 位 的 域 :<br />
1. 状 态 位 域 : 用 s 表 示<br />
2. 扩 展 位 域 : 用 x 表 示<br />
3. 条 件 标 志 位 域 : 用 f 表 示<br />
4. 控 制 位 域 : 用 c 表 示<br />
操 作 数 分 为 两 种 :<br />
1. 寄 存 器<br />
2.8 位 图 立 即 数<br />
11-8-18 112<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 指 令 集 —— 状 态 寄 存 器 写 指 令<br />
示 例 , 将 R0 的 内 容 写 入 CPSR 寄 存 器 的 控 制 位 域<br />
MSR CPSR_c,R0<br />
“MSR”<br />
R0<br />
Byte3, Byte2, Byte1<br />
Byte0<br />
31 30 29 28 27 26 8 7 6 5 4 3 2<br />
1 0<br />
CPSR N Z C V — — . . . — I F T M4 M3 M2 M1 M0<br />
条 件 代 码 标 志 保 留 控 制 位 域<br />
11-8-18 113<br />
Embedded Computer Systems
• ARM 杂 项 指 令 —— 状 态 寄 存 器 写 指 令 “MSR”<br />
启 动 代 码 堆 栈 初 始 化 应 用 示 例 :<br />
INITSTACK<br />
MOV R0,LR<br />
; 设 置 管 理 模 式 堆 栈<br />
MSR CPSR_C,#0xD3<br />
LDR SP,StackSvc<br />
; 设 置 中 断 模 式 堆 栈<br />
MSR CPSR_C,#0xD2<br />
LDR SP,StackIrq<br />
31 30 29 28 27 26 7 6 5 4 3 2 1 0<br />
N Z C V I F T M4 M3 M2 M1 M0<br />
CPRS 寄 存 器<br />
禁 止 FIQ 中 断<br />
禁 止 IRQ 中 断<br />
配 置 值 0xD3 1 1 0 1 0 0 1 1<br />
IRQ 禁 止 位<br />
FIQ 禁 止 位<br />
ARM 状 态<br />
管 理 模 式<br />
模 式 位<br />
状 态 位<br />
......<br />
11-8-18 114<br />
Embedded Computer Systems
• ARM 杂 项 指 令 —— 状 态 寄 存 器 写 指 令 “MSR”<br />
启 动 代 码 堆 栈 初 始 化 应 用 示 例 :<br />
INITSTACK<br />
MOV R0,LR<br />
; 设 置 管 理 模 式 堆 栈<br />
MSR CPSR_C,#0xD3<br />
LDR SP,StackSvc<br />
; 设 置 中 断 模 式 堆 栈<br />
MSR CPSR_C,#0xD2<br />
LDR SP,StackIrq<br />
31 30 29 28 27 26 7 6 5 4 3 2 1 0<br />
N Z C V I F T M4 M3 M2 M1 M0<br />
CPRS 寄 存 器<br />
禁 止 FIQ 中 断<br />
禁 止 IRQ 中 断<br />
配 置 值 0xD2 1 1 0 1 0 0 1 0<br />
IRQ 禁 止 位<br />
FIQ 禁 止 位<br />
ARM 状 态<br />
IRQ 模 式<br />
模 式 位<br />
状 态 位<br />
......<br />
11-8-18 115<br />
Embedded Computer Systems
思 考 与 练 习<br />
1. 使 用 MSR 和 MRS 指 令 , 通 过 修 改 CPSR 寄<br />
存 器 , 实 现 打 开 / 关 闭 IRQ 中 断 的 两 个 子 程 序 ,<br />
注 意 不 能 影 响 其 它 位 <br />
11-8-18 116<br />
Embedded Computer Systems
思 考 与 练 习<br />
; 子 程 序 : 使 能 IRQ 中 断<br />
Enable_IRQ<br />
MRS R0, CPSR<br />
BIC R0, R0,#0x80<br />
MSR CPSR_c,R0<br />
MOV PC,LR<br />
; 子 程 序 : 禁 能 IRQ 中 断<br />
Disable_IRQ<br />
MRS R0 CPSR<br />
ORR R0, R0,#0x80<br />
MSR CPSR_c,R0<br />
MOV PC,LR<br />
(1)<br />
(2)<br />
(3)<br />
(4)<br />
1. 将 CPSR 寄 存 器 内 容 读 出<br />
到 R0;<br />
2. 修 改 对 应 于 CPSR 中 的 I 控<br />
制 位 ;<br />
3. 将 修 改 后 的 值 写 回 CPSR<br />
寄 存 器 的 对 应 控 制 域 ;<br />
4. 返 回 上 ⼀一 层 函 数 ;<br />
11-8-18 117<br />
Embedded Computer Systems
ARM 指 令 种 类<br />
1. 存 储 器 访 问 指 令<br />
2. 数 据 处 理 指 令<br />
3. 乘 法 指 令<br />
4.ARM 分 支 指 令<br />
5. 协 处 理 器 指 令<br />
6. 杂 项 指 令<br />
7. 伪 指 令<br />
11-8-18 118<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 伪 指 令<br />
ARM 伪 指 令 不 属 于 ARM 指 令 集 中 的 指 令 ,<br />
是 为 了 编 程 方 便 而 定 义 的 。 伪 指 令 可 以 像 其 它<br />
ARM 指 令 ⼀一 样 使 用 , 但 在 编 译 时 这 些 指 令 将 被<br />
等 效 的 ARM 指 令 代 替 。<br />
伪 指 令<br />
实 际 指 令<br />
源 程 序<br />
编 译 器<br />
实 际 指 令<br />
实 际 指 令<br />
反 汇 编 代 码<br />
11-8-18 119<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 伪 指 令<br />
ARM 伪 指 令 有 四 条 :<br />
1. 小 范 围 地 址 读 取 指 令 :ADR<br />
2. 中 等 范 围 地 址 读 取 指 令 :ADRL<br />
3. 大 范 围 地 址 读 取 指 令 :LDR<br />
4. 空 操 作 指 令 :NOP<br />
11-8-18 120<br />
Embedded Computer Systems
• ARM 伪 指 令 —— 小 范 围 的 地 址 读 取<br />
ADR 伪 指 令 将 基 于 PC 相 对 偏 移 的 地 址 值 或<br />
基 于 寄 存 器 相 对 偏 移 的 地 址 值 读 取 到 寄 存 器 中 。<br />
在 汇 编 编 译 器 编 译 源 程 序 时 ,ADR 伪 指 令 被 编 译<br />
器 替 换 成 ⼀一 条 合 适 的 指 令 , 若 不 能 用 ⼀一 条 指 令 实<br />
现 , 则 产 生 错 误 , 编 译 失 败 。<br />
ADR<br />
目 标 寄 存 器 , 表 达 式<br />
目 标 寄 存 器<br />
表 达 式<br />
11-8-18 121<br />
Embedded Computer Systems
• ARM 伪 指 令 —— 小 范 围 的 地 址 读 取<br />
地 址 表 达 式 expr 的 取 指 范 围 :<br />
§ 当 地 址 值 不 是 字 对 齐 时 , 其 取 指 范 围 为 ±255;<br />
§ 当 地 址 值 是 字 对 齐 时 , 其 取 指 范 围 为 ±1020;<br />
ADR<br />
目 标 寄 存 器 , 表 达 式<br />
目 标 寄 存 器<br />
表 达 式<br />
11-8-18 122<br />
Embedded Computer Systems
• ARM 伪 指 令 —— 小 范 围 的 地 址 读 取<br />
应 用 示 例 ( 源 程 序 ):<br />
...<br />
ADR R0,Delay<br />
...<br />
Delay<br />
MOV R0,r14<br />
...<br />
编 译 后 的 反 汇 编 代 码 :<br />
...<br />
0x20 ADD r0,pc,#0x3c<br />
...<br />
...<br />
0x64 MOV r0,r14<br />
...<br />
使 用 伪 指 令 将 程 序 标<br />
号 Delay 的 地 址 存 入 R0<br />
地 址<br />
程 序 代 码<br />
11-8-18 123<br />
Embedded Computer Systems
• ARM 伪 指 令 —— 小 范 围 的 地 址 读 取<br />
应 用 示 例 ( 源 程 序 ):<br />
...<br />
ADR<br />
...<br />
Delay<br />
MOV<br />
...<br />
R0,Delay<br />
R0,r14<br />
使 用 伪 指 令 将 程 序 标<br />
号 Delay 的 地 址 存 入 R0<br />
编 译 后 的 反 汇 编 代 码 :<br />
...<br />
0x20 ADD r0,pc,#0x3c<br />
...<br />
...<br />
0x64 MOV r0,r14<br />
...<br />
ADR 伪 指 令 被 汇 编 成 ⼀一 条 指 令<br />
11-8-18 124<br />
Embedded Computer Systems
• ARM 伪 指 令 —— 小 范 围 的 地 址 读 取<br />
; 查 表 应 用 示 例 :<br />
ADR<br />
R0,DISP_TAB ; 加 载 转 换 表 地 址<br />
LDRB R1,[R0,R2] ; 使 用 R2 作 为 参 数 , 进 行 查 表<br />
…<br />
DISP_TAB<br />
DCB 0xC0,0xF9,0xA4,0xB0,0x99, 0x92,0x82,0xF8<br />
11-8-18 125<br />
Embedded Computer Systems
• ARM 伪 指 令 —— 中 等 范 围 的 地 址 读 取<br />
ADRL 伪 指 令 将 基 于 PC 相 对 偏 移 的 地 址 值<br />
或 基 于 寄 存 器 相 对 偏 移 的 地 址 值 读 取 到 寄 存 器 中 ,<br />
比 ADR 伪 指 令 可 以 读 取 更 大 范 围 的 地 址 。 在 汇 编<br />
编 译 器 编 译 源 程 序 时 ,ADRL 伪 指 令 被 编 译 器 替 换<br />
成 两 条 合 适 的 指 令 。 若 不 能 用 两 条 指 令 实 现 , 则<br />
产 生 错 误 , 编 译 失 败 。<br />
ADRL<br />
标 寄 存 器 , 表 达 式<br />
目 标 寄 存 器<br />
表 达 式<br />
11-8-18 126<br />
Embedded Computer Systems
• ARM 伪 指 令 —— 中 等 范 围 的 地 址 读 取<br />
地 址 表 达 式 expr 的 取 指 范 围 :<br />
§ 当 地 址 值 不 是 字 对 齐 时 , 其 取 指 范 围 为 ±64K<br />
§ 当 地 址 值 是 字 对 齐 时 , 其 取 指 范 围 为 ±256K<br />
ADRL<br />
标 寄 存 器 , 表 达 式<br />
目 标 寄 存 器<br />
表 达 式<br />
11-8-18 127<br />
Embedded Computer Systems
• ARM 伪 指 令 —— 中 等 范 围 的 地 址 读 取<br />
应 用 示 例 ( 源 程 序 ):<br />
...<br />
ADRL R0,Delay<br />
...<br />
Delay<br />
MOV R0,r14<br />
...<br />
编 译 后 的 反 汇 编 代 码 :<br />
...<br />
0x20 ADD r0,pc,#40<br />
0x24 ADD r0,r0,#0<br />
...<br />
0x68 MOV r0,r14<br />
...<br />
使 用 伪 指 令 将 程 序 标<br />
号 Delay 的 地 址 存 入 R0<br />
地 址<br />
程 序 代 码<br />
11-8-18 128<br />
Embedded Computer Systems
• ARM 伪 指 令 —— 中 等 范 围 的 地 址 读 取<br />
应 用 示 例 ( 源 程 序 ):<br />
...<br />
ADRL<br />
...<br />
Delay<br />
MOV<br />
...<br />
R0,Delay<br />
R0,r14<br />
使 用 伪 指 令 将 程 序 标<br />
号 Delay 的 地 址 存 入 R0<br />
编 译 后 的 反 汇 编 代 码 :<br />
...<br />
0x20 ADD<br />
0x24 ADD<br />
...<br />
0x68 MOV<br />
...<br />
r0,pc,#40<br />
r0,r0,#0<br />
r0,r14<br />
ADRL 伪 指 令 被 汇 编 成 两 条 指 令 ,<br />
尽 管 第 2 条 指 令 并 没 有 意 义<br />
11-8-18 129<br />
Embedded Computer Systems
• ARM 伪 指 令 —— 大 范 围 的 地 址 读 取<br />
LDR 伪 指 令 用 于 加 载 32 位 的 立 即 数 或 ⼀一 个 地 址 值 到<br />
指 定 寄 存 器 。 在 汇 编 编 译 源 程 序 时 ,LDR 伪 指 令 被 编 译 器<br />
替 换 成 ⼀一 条 合 适 的 指 令 。 若 加 载 的 常 数 未 超 出 MOV 或 MVN<br />
的 范 围 , 则 使 用 MOV 或 MVN 指 令 代 替 该 LDR 伪 指 令 , 否 则<br />
汇 编 器 将 常 量 放 入 文 字 池 , 并 使 用 ⼀一 条 程 序 相 对 偏 移 的<br />
LDR 指 令 从 文 字 池 读 出 常 量 。<br />
LDR<br />
标 寄 存 器 ,= 表 达 式<br />
目 标 寄 存 器<br />
表 达 式<br />
地 址 表 达 式 expr 的 取 指 范 围 为 任 意 值<br />
11-8-18 130<br />
Embedded Computer Systems
• ARM 伪 指 令 —— 大 范 围 的 地 址 读 取<br />
应 用 示 例 ( 源 程 序 ):<br />
...<br />
LDR R0,=Delay<br />
...<br />
Delay<br />
MOV R0,r14<br />
...<br />
编 译 后 的 反 汇 编 代 码 :<br />
...<br />
0x60 LDR R0,0xb4<br />
...<br />
0x64 MOV R0, LR<br />
...<br />
0xb4 DCD 0x64<br />
使 用 伪 指 令 将 程 序 标<br />
号 Delay 的 地 址 存 入 R0<br />
地 址<br />
程 序 代 码<br />
11-8-18 131<br />
Embedded Computer Systems
• ARM 伪 指 令 —— 大 范 围 的 地 址 读 取<br />
应 用 示 例 ( 源 程 序 ):<br />
...<br />
LDR R0,=Delay<br />
...<br />
Delay<br />
MOV<br />
...<br />
必 须 加 入 ”=”<br />
R0,r14<br />
编 译 后 的 反 汇 编 代 码 :<br />
...<br />
0x60 LDR R0,0xb4<br />
...<br />
0x64 MOV R0, LR<br />
...<br />
0xb4 DCD 0x64<br />
必<br />
须<br />
小<br />
于<br />
4<br />
KB<br />
使 用 伪 指 令 将 程 序 标<br />
号 Delay 的 地 址 存 入 R0<br />
LDR 伪 指 令 被 汇 编 成 ⼀一 条 LDR 指<br />
令 , 并 在 文 字 池 中 定 义 了 ⼀一 个 常<br />
量 , 该 常 量 为 Delay 标 号 的 地 址<br />
11-8-18 132<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• ARM 伪 指 令 —— 空 操 作 伪 指 令<br />
“NOP”<br />
NOP 伪 指 令 在 汇 编 时 将 会 被 代 替 成 ARM<br />
中 的 空 操 作 , 比 如 可 能 是 “MOV R0,R0” 指 令 等 。<br />
NOP 可 用 于 延 时 操 作 。<br />
指 令 格 式 :<br />
NOP<br />
11-8-18 133<br />
Embedded Computer Systems
思 考 与 练 习<br />
1. 请 使 用 NOP 伪 指 令 、 比 较 指 令 、 条 件 跳 转<br />
指 令 等 完 成 ⼀一 个 软 件 延 时 子 程 序 , 延 时 长 度<br />
由 R0 寄 存 器 的 数 值 控 制 <br />
11-8-18 134<br />
Embedded Computer Systems
思 考 与 练 习<br />
1. 请 使 用 NOP 伪 指 令 、 比 较 指 令 、 条 件 跳 转<br />
指 令 等 完 成 ⼀一 个 软 件 延 时 子 程 序 , 延 时 长 度<br />
由 R0 寄 存 器 的 数 值 控 制 <br />
Delay<br />
NOP ; 空 操 作<br />
NOP<br />
NOP<br />
SUBS<br />
R0,R0,#1 ; 循 环 次 数 减 ⼀一<br />
BNE Delay ; 如 果 循 环 未 结 束 , 跳 转 Delay 继 续<br />
MOV<br />
PC,LR ; 子 程 序 返 回<br />
11-8-18 135<br />
Embedded Computer Systems
本 章 学 习 重 点<br />
1. ARM 处 理 器 的 寻 址 方 式<br />
—— 共 有 9 种 寻 址 方 式 ;<br />
2. ARM 指 令 的 特 点<br />
—— 可 条 件 执 行 、 可 选 择 影 响 标 志 位 、 具 有 非 常<br />
灵 活 的 第 二 操 作 数 ;<br />
3. ARM 指 令 的 种 类 , 它 能 完 成 哪 些 功 能<br />
—— 共 有 7 类 指 令 , 可 以 完 成 存 储 器 访 问 、 数 据 运<br />
算 、 程 序 跳 转 、 处 理 器 控 制 、 以 及 帮 助 编 程 的 伪 指<br />
令 等 。<br />
11-8-18 136<br />
Embedded Computer Systems
第 4 章 目 录<br />
q 1.ARM 处 理 器 寻 址 方 式<br />
q 2. 指 令 集 介 绍<br />
§ ARM 指 令 集<br />
§ Thumb 指 令 集<br />
11-8-18 137<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• Thumb 指 令<br />
Thumb 指 令 集 可 以 看 作 是 ARM 指 令 压 缩 形 式<br />
的 子 集 , 它 是 为 减 小 代 码 量 而 提 出 的 , 具 有 16 位 的<br />
代 码 密 度 。Thumb 指 令 体 系 不 完 整 , 只 支 持 通 用 功<br />
能 。 必 要 时 仍 需 要 使 用 ARM 指 令 , 如 进 入 异 常 时 。<br />
11-8-18 138<br />
Embedded Computer Systems
• 简 单 的 Thumb 程 序<br />
; 功 能 : 使 用 BX 指 令 切 换 处 理 器 状 态<br />
ARM_CODE<br />
AREA Example8,CODE,READONLY<br />
ENTRY<br />
THUMB_CODE<br />
CODE32<br />
ADR R0,THUMB_CODE+1<br />
BX R0 ; 跳 转 并 切 换 处 理 器 状 态<br />
CODE16<br />
MOV R0,#10 ; R0 = 10<br />
MOV R1,#20 ; R1 = 20<br />
ADD R0,R1 ; R0 = R0+R1<br />
B .<br />
END<br />
在 Thumb 程 序 段 之 前<br />
要 用 CODE16 声 明 。<br />
11-8-18 139<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• Thumb 指 令 集 与 ARM 指 令 集 的 相 似 处<br />
Thumb 指 令 的 格 式 与 使 用 方 式 与 ARM 指<br />
令 集 类 似 , 它 也 具 有 以 下 种 类 的 指 令 :<br />
§ 存 储 器 访 问 指 令<br />
§ 数 据 处 理 指 令<br />
§ 分 支 指 令<br />
§ 杂 项 指 令<br />
§ 伪 指 令<br />
11-8-18 140<br />
Embedded Computer Systems
3.2 指 令 集 介 绍<br />
• Thumb 指 令 集 与 ARM 指 令 集 的 区 别<br />
Thumb 指 令 集 较 ARM 指 令 集 有 如 下 限 制 :<br />
§ 只 有 B 指 令 可 以 条 件 执 行 , 其 它 指 令 都 不 能 条 件 执 行 ;<br />
§ 分 支 指 令 的 跳 转 范 围 有 更 多 限 制 ;<br />
§ 数 据 处 理 指 令 的 操 作 结 果 必 须 放 入 其 中 ⼀一 个 ;<br />
§ 单 寄 存 器 访 问 指 令 , 只 能 操 作 R0〜~R7;<br />
§ LDM 和 STM 指 令 可 以 对 R0〜~R7 的 任 何 子 集 进 行 操 作 ;<br />
11-8-18 141<br />
Embedded Computer Systems
作 业<br />
• 写 一 条 ARM 指 令 , 分 别 完 成 下 列 操 作 :<br />
a) r0 = 16<br />
b) r0 = r1 / 16 ( 带 符 号 的 数 字 )<br />
c) r1 = r2 * 3<br />
d) r0 = -r0<br />
11-8-18 142<br />
Embedded Computer Systems
ARM 汇 编 语 言 与 嵌 入 式 C 混 合 编 程<br />
11-8-18 143<br />
Embedded Computer Systems
过 程 调 用 标 准 ATPCS 与<br />
AAPCS<br />
• 过 程 调 用 标 准 ATPCS(ARM-Thumb Produce<br />
Call Standard) 规 定 了 子 程 序 间 相 互 调 用 的<br />
基 本 规 则 , ATPCS 规 定 子 程 序 调 用 过 程 中<br />
寄 存 器 的 使 用 规 则 、 数 据 栈 的 使 用 规 则 及 参<br />
数 的 传 递 规 则 。<br />
• 2007 年 ,ARM 公 司 推 出 了 新 的 过 程 调 用 标<br />
准 AAPCS(ARM Architecture Produce Call<br />
Standard), 它 只 是 改 进 了 原 有 的 ATPCS 的 二<br />
进 制 代 码 的 兼 容 性 。<br />
11-8-18 144<br />
Embedded Computer Systems
寄 存 器 使 用 规 则<br />
• (1) 子 程 序 间 通 过 寄 存 器 R0~R3 传 递 参 数 , 寄 存<br />
器 R0~R3 可 记 作 A1~A4。 被 调 用 的 子 程 序 在 返 回<br />
前 无 须 恢 复 寄 存 器 R0~R3 的 内 容 。<br />
11-8-18 145<br />
Embedded Computer Systems
• (2) 在 子 程 序 中 ,ARM 状 态 下 使 用 寄 存 器 R4~<br />
R11 来 保 存 局 部 变 量 , 寄 存 器 R4~R11 可 记 作 V1~<br />
V8;Thumb 状 态 下 只 能 使 用 R4~R7 来 保 存 局 部 变<br />
量 。<br />
11-8-18 146<br />
Embedded Computer Systems
• (3) 寄 存 器 R12 用 作 子 程 序 间 调 用 时 临 时 保 存 栈 指<br />
针 , 函 数 返 回 时 使 用 该 寄 存 器 进 行 出 栈 , 记 作 IP;<br />
在 子 程 序 间 的 链 接 代 码 中 常 有 这 种 使 用 规 则 。<br />
• (4) 通 用 寄 存 器 R13 用 作 数 据 栈 指 针 , 记 作 SP。<br />
11-8-18 147<br />
Embedded Computer Systems
• (5) 通 用 寄 存 器 R14 用 作 链 接 寄 存 器 ;<br />
• (6) 通 用 寄 存 器 R15 用 作 程 序 计 数 器 , 记 作 PC 。<br />
11-8-18 148<br />
Embedded Computer Systems
数 据 栈 使 用 规 则<br />
• 过 程 调 用 标 准 规 定 数 据 栈 为 FD 类 型 , 并 且 对 数 据<br />
栈 的 操 作 时 要 求 8 字 节 对 齐 的 。<br />
11-8-18 149<br />
Embedded Computer Systems
参 数 传 递 规 则<br />
• 1. 参 数 个 数 可 变 的 子 程 序 参 数 传 递 规 则<br />
• 对 于 参 数 个 数 可 变 的 子 程 序 , 当 参 数 个 数 不 超 过 4<br />
个 时 , 可 以 使 用 寄 存 器 R0~R3 来 传 递 ; 当 参 数 个 数<br />
超 过 4 个 时 , 还 可 以 使 用 数 据 栈 进 行 参 数 传 递 。<br />
11-8-18 150<br />
Embedded Computer Systems
• 2. 参 数 个 数 固 定 的 子 程 序 参 数 传 递 规 则<br />
• 如 果 系 统 不 包 含 浮 点 运 算 的 硬 件 部 件 且 没 有 浮 点<br />
参 数 时 , 则 依 次 将 各 参 数 传 送 到 寄 存 器 R0~R3 中 ,<br />
如 果 参 数 个 数 多 于 4 个 , 将 剩 余 的 字 数 据 通 过 数 据<br />
栈 来 传 递 ;<br />
• 如 果 包 括 浮 点 参 数 则 要 通 过 相 应 的 规 则 将 浮 点 参<br />
数 转 换 为 整 数 参 数 , 然 后 依 次 将 各 参 数 传 送 到 寄<br />
存 器 R0~R3 中 。 如 果 参 数 多 于 4 个 , 将 剩 余 字 数 据<br />
传 送 到 数 据 栈 中 , 入 栈 的 顺 序 与 参 数 顺 序 相 反 ,<br />
即 最 后 一 个 字 数 据 先 入 栈 。<br />
11-8-18 151<br />
Embedded Computer Systems
• 如 果 系 统 包 含 浮 点 运 算 的 硬 件 部 件 , 将 按 照 如 下 规<br />
则 传 递 :<br />
• 各 个 浮 点 参 数 按 顺 序 处 理<br />
• 为 每 个 浮 点 参 数 分 配 寄 存 器 。 分 配 方 法 是 : 找 到 编 号<br />
最 小 的 满 足 该 浮 点 参 数 需 要 的 一 组 连 续 的 FP 寄 存 器 进<br />
行 参 数 传 递 。<br />
11-8-18 152<br />
Embedded Computer Systems
• 子 程 序 结 果 返 回 规 则<br />
• (1) 结 果 为 一 个 32 位 的 整 数 时 , 通 过 寄 存 器 R0 返 回 ; 结 果<br />
为 一 个 64 位 整 数 时 , 通 过 寄 存 器 R0,R1 返 回 。<br />
• (2) 结 果 为 一 个 浮 点 数 时 , 可 以 通 过 浮 点 运 算 部 件 的 寄 存<br />
器 F0、D0 或 者 S0 来 返 回 ; 结 果 为 复 合 型 的 浮 点 数 ( 如 复 数 )<br />
时 , 可 以 通 过 寄 存 器 F0~Fn 或 者 D0~Dn 来 返 回 。<br />
• (3) 对 于 位 数 更 多 的 结 果 , 需 要 通 过 内 存 来 传 递 。<br />
11-8-18 153<br />
Embedded Computer Systems
ARM 汇 编 语 言 与 嵌 入 式 C 混 合 编 程<br />
• 在 嵌 入 式 程 序 设 计 中 , 有 些 场 合 ( 如 对 具 体 的 硬 件<br />
资 源 进 行 访 问 ) 必 须 用 汇 编 语 言 来 实 现 , 可 以 采 用<br />
在 嵌 入 式 C 语 言 程 序 中 嵌 入 汇 编 语 言 或 嵌 入 式 C 语 言<br />
调 用 汇 编 语 言 来 实 现 。<br />
11-8-18 154<br />
Embedded Computer Systems
• 过 程 调 用 标 准 ATPCS/AAPCS 是 学 习 嵌 入 式 程 序 调<br />
用 的 基 础 内 容 , 详 细 说 明 请 参 考 《ARM 嵌 入 式 系 统<br />
结 构 与 编 程 》 第 8 章 8.5 节<br />
11-8-18 155<br />
Embedded Computer Systems
内 嵌 汇 编<br />
• (1)ARM 开 发 工 具 编 译 环 境 下 内 嵌 汇 编 语 法 格 式<br />
__asm<br />
{<br />
指 令 ;[ 指 令 ]<br />
指 令 ;[ 指 令 ]<br />
…<br />
[ 指 令 ]<br />
}<br />
// 注 释<br />
11-8-18 156<br />
Embedded Computer Systems
ARM 开 发 工 具 编 译 环 境 下 实 例<br />
/* main.c */<br />
void __main(void)<br />
{<br />
int var=0xAA;<br />
__asm<br />
{<br />
}<br />
MOV R1,var<br />
CMP R1,#0xAA<br />
while(1);<br />
// 内 嵌 汇 编 标 识<br />
}<br />
11-8-18 157<br />
Embedded Computer Systems
• (2)GNU ARM 环 境 下 内 嵌 汇 编 语 法 格 式<br />
__asm<br />
(<br />
“ 指 令 ;[ 指 令 ;]\<br />
指 令 ;[ 指 令 ;]\<br />
… \<br />
[ 指 令 ;]”<br />
);<br />
11-8-18 158<br />
Embedded Computer Systems
GNU ARM 环 境 下 实 例<br />
/* main.c */<br />
void __main(void)<br />
{<br />
}<br />
int var=0xAA;<br />
(<br />
__asm<br />
" MOV R5,#0xAA;\ /* 注 意 : 这 里 不 要 直 接 使 用 C 代 码 中 提 供 的 变 量 */<br />
MOV<br />
CMP<br />
);<br />
while(1);<br />
R6,#0xBB;\<br />
R1,#0;"<br />
11-8-18 159<br />
Embedded Computer Systems
• 2. 内 嵌 汇 编 的 局 限 性<br />
• ARM 开 发 工 具 编 译 环 境 下 内 嵌 汇 编 语 言 ,<br />
指 令 操 作 数 可 以 是 寄 存 器 、 常 量 或 C 语 言 表<br />
达 式 。 可 以 是 char、short 或 int 类 型 , 而 且 是<br />
作 为 无 符 号 数 进 行 操 作 。<br />
• 当 表 达 式 过 于 复 杂 时 需 要 使 用 较 多 的 物 理 寄<br />
存 器 , 有 可 能 产 生 冲 突 。<br />
• GNU ARM 编 译 环 境 下 内 嵌 汇 编 语 言 ARM 开<br />
11-8-18 160<br />
Embedded Computer Systems
• (2) 物 理 寄 存 器<br />
• 不 要 直 接 向 程 序 计 数 器 PC 赋 值 , 程 序 的 跳 转 只 能 通 过<br />
B 或 BL 指 令 实 现 。<br />
• 一 般 将 寄 存 器 R0~R3、R12 及 R14 用 于 子 程 序 调 用 存<br />
放 中 间 结 果 , 因 此 在 内 嵌 汇 编 指 令 中 , 一 般 不 要 将 这<br />
些 寄 存 器 同 时 指 定 为 指 令 中 的 物 理 寄 存 器 。<br />
11-8-18 161<br />
Embedded Computer Systems
• 在 内 嵌 的 汇 编 指 令 中 使 用 物 理 寄 存 器 时 , 如 果 有 C 语<br />
言 变 量 使 用 了 该 物 理 寄 存 器 , 则 编 译 器 将 在 合 适 的 时<br />
候 保 存 并 恢 复 该 变 量 的 值 。 需 要 注 意 的 是 , 当 寄 存 器<br />
SP、SL、FP 以 及 SB 用 作 特 定 的 用 途 时 , 编 译 器 不 能<br />
恢 复 这 些 寄 存 器 的 值 。<br />
• 通 常 在 内 嵌 汇 编 指 令 中 不 要 指 定 物 理 寄 存 器 , 因 为 有<br />
可 能 会 影 响 编 译 器 分 配 寄 存 器 , 进 而 可 能 影 响 代 码 的<br />
效 率 。<br />
11-8-18 162<br />
Embedded Computer Systems
• (3) 标 号 、 常 量 及 指 令 展 开<br />
• C 语 言 程 序 中 的 标 号 可 以 被 内 嵌 的 汇 编 指 令 所 使 用 。<br />
但 是 只 有 B 指 令 可 以 使 用 C 语 言 程 序 中 的 标 号 ,BL<br />
指 令 不 能 使 用 C 语 言 程 序 中 的 标 号 。<br />
11-8-18 163<br />
Embedded Computer Systems
• (4) 内 存 单 元 的 分 配<br />
• 内 嵌 汇 编 器 不 支 持 汇 编 语 言 中 用 于 内 存 分 配 的 伪 操<br />
作 。 所 用 的 内 存 单 元 的 分 配 都 是 通 过 C 语 言 程 序 完<br />
成 的 , 分 配 的 内 存 单 元 通 过 变 量 以 供 内 嵌 的 汇 编 器<br />
使 用 。<br />
11-8-18 164<br />
Embedded Computer Systems
• (5)SWI 和 BL 指 令<br />
• SWI 和 BL 指 令 用 于 内 嵌 汇 编 时 , 除 了 正 常 的 操 作 数 域<br />
外 , 还 必 须 增 加 如 下 3 个 可 选 的 寄 存 器 列 表 :<br />
• 用 于 存 放 输 入 的 参 数 的 寄 存 器 列 表 。<br />
• 用 于 存 放 返 回 结 果 的 寄 存 器 列 表 。<br />
• 用 于 保 存 被 调 用 的 子 程 序 工 作 寄 存 器 的 寄 存 器 列 表 。<br />
11-8-18 165<br />
Embedded Computer Systems
• 3. 内 嵌 汇 编 器 与 armasm 汇 编 器 的 区 别<br />
• 内 嵌 汇 编 器 不 支 持 “LDR Rn, = expression” 伪 指 令 , 使<br />
用 “MOV Rn, expression” 代 替 , 不 支 持 ADR、ADRL 伪<br />
指 令<br />
• 十 六 进 制 数 前 要 使 用 前 缀 0x, 不 能 使 用 &。 当 使 用 8 位<br />
移 位 常 量 导 致 CPSR 中 的 ALU 标 志 位 需 要 更 新 时 ,N、<br />
Z、C、V 标 志 中 的 C 不 具 有 实 际 意 义<br />
11-8-18 166<br />
Embedded Computer Systems
• 指 令 中 使 用 的 C 变 量 不 能 与 任 何 物 理 寄 存 器<br />
同 名 , 否 则 会 造 成 混 乱<br />
• 不 支 持 BX 和 BLX 指 令<br />
• 使 用 内 嵌 汇 编 器 , 不 能 通 过 对 程 序 计 数 器<br />
PC 赋 值 , 实 现 程 序 返 回 或 跳 转 。<br />
• 编 译 器 可 能 使 用 寄 存 器 R0~R3、R12 及 R14<br />
存 放 中 间 结 果 , 如 果 使 用 这 些 寄 存 器 时 要 特<br />
别 注 意 。<br />
11-8-18 167<br />
Embedded Computer Systems
ARM 汇 编 语 言 与 嵌 入 式 C 程 序 相 互 调 用<br />
• 1. 汇 编 程 序 调 用 C 程 序<br />
• 2. C 程 序 调 用 汇 编 程 序<br />
11-8-18 168<br />
Embedded Computer Systems
• 1. 汇 编 程 序 调 用 C 程 序<br />
• 在 GNU ARM 编 译 环 境 下 , 汇 编 程 序 中 要 使 用 .extern<br />
伪 操 作 声 明 将 要 调 用 的 C 程 序 ;<br />
• 在 ARM 开 发 工 具 编 译 环 境 下 , 汇 编 程 序 中 要 使 用<br />
IMPORT 伪 操 作 声 明 将 要 调 用 的 C 程 序 。<br />
11-8-18 169<br />
Embedded Computer Systems
示 例 解 析<br />
• 在 GNU ARM 编 译 环 境 下 设 计 程 序 , 用 ARM 汇 编<br />
语 言 调 用 C 语 言 实 现 20! 的 阶 乘 操 作 , 并 将 64 位<br />
结 果 保 存 到 寄 存 器 R0、R1 中 , 其 中 R1 中 存 放 高 32<br />
位 结 果 。<br />
11-8-18 170<br />
Embedded Computer Systems
• 首 先 建 立 汇 编 源 文 件 start.s<br />
/* start.s */<br />
.global _start<br />
.extern Factorial<br />
.equ Ni, 20<br />
.text<br />
_start:<br />
MOV R0,#Ni<br />
BL Factorial<br />
Stop:<br />
B Stop<br />
.end<br />
@ 声 明 Factorial 是 一 个 外 部 函 数<br />
@ 要 计 算 的 阶 乘 数<br />
@ 将 参 数 装 入 R0<br />
@ 调 用 Factorial, 并 通 过 R0 传 递 参 数<br />
11-8-18 171<br />
Embedded Computer Systems
• 然 后 建 立 C 语 言 源 文 件 factorial.c<br />
/* factorial.c */<br />
long long Factorial(char N)<br />
{<br />
char i;<br />
long long Nx=1;<br />
for(i=1;i
示 例 解 析<br />
• 在 ARM 开 发 工 具 编 译 环 境 下 设 计 程 序 , 用 ARM<br />
汇 编 语 言 调 用 C 语 言 实 现 20! 的 阶 乘 操 作 , 并 将<br />
64 位 结 果 保 存 到 寄 存 器 R0、R1 中 , 其 中 R1 中 存 放<br />
高 32 位 结 果 。<br />
11-8-18 173<br />
Embedded Computer Systems
• 首 先 建 立 汇 编 源 文 件 start.s<br />
/* start.s */<br />
IMPORT Factorial<br />
; 声 明 Factorial 是 一 个 外 部 函 数<br />
Ni EQU 20 ; 要 计 算 的 阶 乘 数<br />
AREA Fctrl,CODE,READONLY ; 声 明 代 码 Fctrl<br />
ENTRY<br />
; 标 识 程 序 入 口<br />
start<br />
MOV R0,#Ni<br />
; 将 参 数 装 入 R0<br />
BL Factorial<br />
; 调 用 Factorial, 并 通 过 R0 传 递 参 数<br />
/* 注 : 在 此 处 观 察 结 果 */<br />
Stop<br />
B Stop<br />
END<br />
; 文 件 结 束<br />
11-8-18 174<br />
Embedded Computer Systems
• 然 后 建 立 C 语 言 源 文 件 factorial.c<br />
/* factorial.c */<br />
long long Factorial(char N)<br />
{<br />
char i;<br />
long long Nx=1;<br />
for(i=1;i
• 程 序 运 行 结 果 如 下 :<br />
• R0 = 0x82B40000<br />
• R1 = 0x21C3677C<br />
11-8-18 176<br />
Embedded Computer Systems
• 2. C 程 序 调 用 汇 编 程 序<br />
• 在 GNU ARM 编 译 环 境 下 , 在 汇 编 程 序 中 要 使<br />
用 .global 伪 操 作 声 明 汇 编 程 序 为 全 局 的 函 数 , 可 被 外<br />
部 函 数 调 用 , 同 时 在 C 程 序 中 要 用 关 键 字 extern 声 明<br />
要 调 用 的 汇 编 语 言 程 序 。<br />
• 在 ARM 开 发 工 具 编 译 环 境 下 , 汇 编 程 序 中 要 使 用<br />
EXPORT 伪 操 作 声 明 本 程 序 可 以 被 其 他 程 序 调 用 。 同<br />
时 也 要 在 C 程 序 中 要 用 关 键 字 extern 声 明 要 调 用 的 汇<br />
编 语 言 程 序 。<br />
11-8-18 177<br />
Embedded Computer Systems
示 例 解 析<br />
• (1) 在 GNU ARM 编 译 环 境 下 设 计 程 序 , 用 用 C 语<br />
言 调 用 ARM 汇 编 语 言 C 语 言 实 现 20 的 阶 乘 (20!)<br />
操 作 , 并 将 64 位 结 果 保 存 到 0xFFFFFFF0 开 始 的 内<br />
存 地 址 单 元 , 按 照 小 端 格 式 低 位 数 据 存 放 在 低 地 址<br />
单 元 。<br />
11-8-18 178<br />
Embedded Computer Systems
• 每 一 步 : 建 立 启 动 C 程 序 的 代 码 , 请 读 者 参 阅 前 面<br />
的 章 节 自 行 建 立 。<br />
• 每 二 步 : 建 立 C 语 言 源 文 件 main.c<br />
/* main.c */<br />
extern void Factorial(char Nx);<br />
Main()<br />
{<br />
char N =20;<br />
Factorial(N);<br />
// 声 明 Factorial 是 一 个 外 部 函 数<br />
// 调 用 汇 编 文 件 实 现 N! 操 作<br />
}<br />
/* 注 : 在 此 处 观 察 结 果 */<br />
while(1);<br />
11-8-18 179<br />
Embedded Computer Systems
• 每 三 步 : 建 立 汇 编 源 文 件 Factorial.s<br />
/* Factorial.s */<br />
.global Factorial<br />
Factorial:<br />
Loop:<br />
MOV R8 , R0 @ 取 参 数<br />
MOV R9 , #0 @ 高 位 初 始 化<br />
SUB R0,R8,#1 @ 初 始 化 计 数 器<br />
MOV R1 , R9 @ 暂 存 高 位 值<br />
@ 声 明 Factorial 为 一 个 全 局 函 数<br />
UMULL R8 , R9 , R0 , R8 @[R9:R8]=R0*R8<br />
MLA R9 , R1 , R0 , R9 @R9=R1*R0+R9<br />
SUBS R0 , R0 , #1 @ 计 数 器 递 减<br />
BNE Loop @ 计 数 器 不 为 0 继 续 循 环<br />
LDR<br />
STMIA R0, {R8,R9}<br />
R0,=0xFFFFFFF0<br />
MOV PC,LR @ 子 程 序 返 回<br />
@ 结 果 保 存 到 0xFFFFFFF0 开 始 的 内 存 单 元<br />
11-8-18 180<br />
Embedded Computer Systems
示 例 解 析<br />
• (2) 在 ARM 开 发 工 具 编 译 环 境 下 设 计 程 序 , 用 C<br />
语 言 调 用 ARM 汇 编 语 言 实 现 20 的 阶 乘 (20!) 操 作 ,<br />
并 将 64 位 结 果 保 存 到 0xFFFFFFF0 开 始 的 内 存 地 址<br />
单 元 , 按 照 小 端 格 式 低 位 数 据 存 放 在 低 地 址 单 元 。<br />
11-8-18 181<br />
Embedded Computer Systems
• 每 一 步 : 建 立 启 动 C 程 序 的 代 码 , 请 读 者 参 阅 前 面 的 章 节 自<br />
行 建 立 。<br />
• 每 二 步 : 建 立 C 语 言 源 文 件 main.c, 与 GNU ARM 编 译 环 境 下<br />
相 同 。<br />
/* main.c */<br />
extern void Factorial(char Nx);<br />
__main()<br />
{<br />
char N =20;<br />
Factorial(N);<br />
// 声 明 Factorial 是 一 个 外 部 函 数<br />
// 调 用 汇 编 文 件 实 现 N! 操 作<br />
}<br />
/* 注 : 在 此 处 观 察 结 果 */<br />
while(1);<br />
11-8-18 182<br />
Embedded Computer Systems
• 每 三 步 : 建 立 汇 编 源 文 件 Factorial.s<br />
/* Factorial.s */<br />
Factorial<br />
Loop<br />
AREA Fctrl, CODE, READONLY<br />
EXPORT Factorial<br />
MOV R8 , R0 ; 取 参 数<br />
; 声 明 代 码 段 Fctrl<br />
MOV R9 , #0 ; 高 位 初 始 化<br />
SUB R0,R8,#1 ; 初 始 化 计 数 器<br />
MOV R1 , R9 ; 暂 存 高 位 值<br />
UMULL R8 , R9 , R0 , R8 ;[R9:R8]=R0*R8<br />
MLA R9 , R1 , R0 , R9 ;R9=R1*R0+R9<br />
SUBS R0 , R0 , #1 ; 计 数 器 递 减<br />
BNE Loop ; 计 数 器 不 为 0 继 续 循 环<br />
LDR<br />
STMIA R0,{R8,R9}<br />
MOV<br />
R0,=0xFFFFFFF0<br />
PC,LR<br />
MOV PC,LR ; 子 程 序 返 回<br />
; 结 果 保 存 到 0xFFFFFFF0 开 始 的 内 存 单 元<br />
11-8-18 183<br />
Embedded Computer Systems
• 程 序 运 行 结 果 如 下 :<br />
11-8-18 184<br />
Embedded Computer Systems
思 考 与 练 习 题<br />
• volatile 限 制 符 在 程 序 中 起 到 什 么 作 用 , 请 举 例 说<br />
明 。<br />
• 何 为 可 重 入 函 数 如 果 使 程 序 具 有 可 重 入 性 , 在<br />
程 序 设 计 中 应 注 意 哪 些 问 题 <br />
• 内 嵌 式 汇 编 有 哪 些 局 限 性 编 写 一 段 代 码 采 用 C<br />
语 言 嵌 入 汇 编 程 序 , 在 汇 编 程 序 中 实 现 字 符 串 的<br />
拷 贝 操 作 。<br />
11-8-18 185<br />
Embedded Computer Systems