20.01.2015 Views

slide

slide

slide

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!