23.10.2014 Views

RealView - ARM Information Center

RealView - ARM Information Center

RealView - ARM Information Center

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>RealView</strong><br />

编 译 工 具<br />

2.0 版<br />

汇 编 程 序 指 南<br />

© 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。<br />

<strong>ARM</strong> DUI 0204BSC


<strong>RealView</strong> 编 译 工 具<br />

汇 编 程 序 指 南<br />

© 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。<br />

发 行 版 信 息<br />

已 对 本 书 做 出 了 下 列 更 改 。<br />

更 改 历 史<br />

日 期 问 题 更 改<br />

2002 年 8 月 A 发 行 版 1.2<br />

2003 年 1 月 B 发 行 版 2.0<br />

所 有 权 声 明<br />

带 有 ® 或 标 记 的 单 词 和 徽 标 是 <strong>ARM</strong> Limited 拥 有 的 注 册 商 标 或 商 标 。 此 处 提 到 的 其 它 品 牌 和 名 称<br />

可 能 是 其 各 自 拥 有 者 的 商 标 。<br />

未 经 版 权 拥 有 者 的 事 先 书 面 允 许 , 不 得 以 任 何 材 料 形 式 改 编 或 复 制 本 文 档 所 含 信 息 或 所 述 产 品 的 部<br />

分 或 全 部 内 容 。<br />

本 文 档 中 描 述 的 产 品 可 能 会 进 行 不 断 的 开 发 和 改 进 。 文 档 中 包 含 的 本 产 品 的 所 有 细 节 及 其 使 用 说<br />

明 , 都 是 由 <strong>ARM</strong> 精 诚 提 供 的 。 但 是 , 我 们 将 不 做 出 所 有 隐 含 的 或 明 示 的 保 证 , 包 括 但 不 限 于 对 可<br />

销 售 性 或 适 合 特 定 用 途 的 保 证 。<br />

本 文 档 仅 旨 在 帮 助 读 者 使 用 本 产 品 。 <strong>ARM</strong> Limited 将 不 对 因 使 用 本 文 档 中 的 任 何 信 息 而 造 成 的 损 失<br />

或 损 害 负 责 , 也 不 对 这 些 信 息 中 的 任 何 错 误 或 遗 漏 或 对 本 产 品 的 任 何 不 正 确 使 用 负 责 。<br />

机 密 性 状 态<br />

本 文 档 是 供 开 放 访 问 的 。 对 其 没 有 发 行 限 制 。<br />

产 品 状 态<br />

本 文 档 中 的 信 息 是 最 终 信 息 ( 即 为 已 开 发 好 的 产 品 提 供 的 信 息 )。<br />

网 址<br />

http://www.arm.com<br />

ii © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


目 录<br />

<strong>RealView</strong> 编 译 工 具 汇 编 程 序 指 南<br />

序 言<br />

关 于 本 书 ........................................................................................................ viii<br />

反 馈 .................................................................................................................xi<br />

第 1 章<br />

第 2 章<br />

第 3 章<br />

简 介<br />

1.1 关 于 <strong>RealView</strong> 编 译 工 具 汇 编 程 序 ................................................................1-2<br />

编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.1 简 介 ..............................................................................................................2-2<br />

2.2 <strong>ARM</strong> 体 系 结 构 概 述 ......................................................................................2-3<br />

2.3 汇 编 语 言 模 块 的 结 构 ...................................................................................2-13<br />

2.4 使 用 C 预 处 理 程 序 .....................................................................................2-21<br />

2.5 条 件 执 行 .....................................................................................................2-22<br />

2.6 将 常 数 装 载 到 寄 存 器 中 ...............................................................................2-27<br />

2.7 将 地 址 装 载 到 寄 存 器 中 ...............................................................................2-32<br />

2.8 装 载 和 存 储 多 个 寄 存 器 指 令 ........................................................................2-41<br />

2.9 使 用 宏 ........................................................................................................2-50<br />

2.10 用 MAP 和 FIELD 命 令 描 述 数 据 结 构 .........................................................2-53<br />

2.11 使 用 框 架 命 令 .............................................................................................2-68<br />

汇 编 程 序 参 考<br />

3.1 命 令 语 法 .......................................................................................................3-2<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 iii


3.2 源 语 句 行 格 式 ............................................................................................... 3-8<br />

3.3 预 定 义 的 寄 存 器 和 协 处 理 器 名 称 .................................................................. 3-9<br />

3.4 内 置 变 量 .................................................................................................... 3-10<br />

3.5 符 号 ........................................................................................................... 3-12<br />

3.6 表 达 式 、 文 本 和 运 算 符 ............................................................................... 3-18<br />

第 4 章<br />

第 5 章<br />

第 6 章<br />

第 7 章<br />

<strong>ARM</strong> 指 令 参 考<br />

4.1 条 件 执 行 ...................................................................................................... 4-6<br />

4.2 <strong>ARM</strong> 存 储 器 访 问 指 令 .................................................................................. 4-8<br />

4.3 <strong>ARM</strong> 通 用 数 据 处 理 指 令 ............................................................................. 4-32<br />

4.4 <strong>ARM</strong> 乘 法 指 令 ........................................................................................... 4-51<br />

4.5 <strong>ARM</strong> 饱 和 指 令 ........................................................................................... 4-77<br />

4.6 <strong>ARM</strong> 并 行 指 令 ........................................................................................... 4-82<br />

4.7 <strong>ARM</strong> 组 合 和 分 离 指 令 ................................................................................ 4-90<br />

4.8 <strong>ARM</strong> 跳 转 指 令 ........................................................................................... 4-97<br />

4.9 协 处 理 器 指 令 ........................................................................................... 4-103<br />

4.10 其 它 <strong>ARM</strong> 指 令 ........................................................................................ 4-113<br />

4.11 <strong>ARM</strong> 伪 指 令 ............................................................................................. 4-122<br />

Thumb 指 令 参 考<br />

5.1 Thumb 存 储 器 访 问 指 令 ............................................................................... 5-4<br />

5.2 Thumb 算 术 指 令 ........................................................................................ 5-15<br />

5.3 Thumb 通 用 数 据 处 理 指 令 .......................................................................... 5-22<br />

5.4 Thumb 跳 转 指 令 ........................................................................................ 5-34<br />

5.5 其 它 Thumb 指 令 ....................................................................................... 5-41<br />

5.6 Thumb 伪 指 令 ............................................................................................ 5-46<br />

向 量 浮 点 编 程<br />

6.1 向 量 浮 点 协 处 理 器 ........................................................................................ 6-4<br />

6.2 浮 点 寄 存 器 ................................................................................................... 6-5<br />

6.3 向 量 和 标 量 运 算 ........................................................................................... 6-7<br />

6.4 VFP 和 条 件 码 .............................................................................................. 6-8<br />

6.5 VFP 系 统 寄 存 器 ......................................................................................... 6-10<br />

6.6 清 零 模 式 .................................................................................................... 6-13<br />

6.7 VFP 指 令 ................................................................................................... 6-15<br />

6.8 VFP 伪 指 令 ................................................................................................ 6-36<br />

6.9 VFP 命 令 和 向 量 记 号 ................................................................................. 6-38<br />

命 令 参 考<br />

7.1 按 字 母 顺 序 排 列 的 命 令 表 ............................................................................. 7-2<br />

7.2 符 号 定 义 命 令 ............................................................................................... 7-3<br />

7.3 数 据 定 义 命 令 ............................................................................................. 7-13<br />

7.4 汇 编 控 制 命 令 ............................................................................................. 7-26<br />

7.5 结 构 描 述 命 令 ............................................................................................. 7-34<br />

7.6 报 告 命 令 .................................................................................................... 7-46<br />

7.7 其 它 命 令 .................................................................................................... 7-51<br />

iv © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


词 汇 表<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 v


vi © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


序 言<br />

本 序 言 介 绍 有 关 <strong>RealView</strong> 编 译 工 具 (RVCT) 汇 编 程 序 和 汇 编 语 言 的 文 档 。 其 中 包<br />

含 下 列 各 部 分 :<br />

• 第 viii 页 的 关 于 本 书<br />

• 第 xi 页 的 反 馈<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 vii


序 言<br />

关 于 本 书<br />

本 书 提 供 RVCT 汇 编 程 序 ( 独 立 的 汇 编 程 序 armasm, 以 及 C 和 C++ 编 译 程 序<br />

中 的 内 联 汇 编 程 序 ) 的 指 南 和 参 考 信 息 。 书 中 描 述 了 汇 编 程 序 的 命 令 行 选 项 ,<br />

为 汇 编 语 言 程 序 员 提 供 的 伪 指 令 和 命 令 , 以 及 <strong>ARM</strong> Thumb ® 和 向 量 浮 点 (VFP)<br />

指 令 集 。<br />

适 合 的 读 者<br />

本 书 是 为 使 用 RVCT 创 作 应 用 程 序 的 所 有 开 发 人 员 编 写 的 。 它 假 定 读 者 是 有 经<br />

验 的 软 件 开 发 人 员 , 并 且 熟 悉 <strong>RealView</strong> 编 译 工 具 2.0 版 入 门 指 南 中 描 述 的 <strong>ARM</strong><br />

开 发 工 具 。<br />

使 用 本 书<br />

本 书 按 下 列 各 章 组 织 :<br />

第 1 章 简 介<br />

阅 读 此 章 了 解 对 RVCT 2.0 版 汇 编 程 序 和 汇 编 语 言 的 简 介 。<br />

第 2 章 编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

阅 读 此 章 获 得 指 南 信 息 , 以 帮 助 读 者 使 用 <strong>ARM</strong> 汇 编 程 序 和 汇 编<br />

语 言 。<br />

第 3 章 汇 编 程 序 参 考<br />

阅 读 此 章 获 得 由 <strong>ARM</strong> 汇 编 程 序 提 供 的 有 关 语 言 语 法 和 结 构 的 参 考<br />

材 料 。<br />

第 4 章 <strong>ARM</strong> 指 令 参 考<br />

阅 读 此 章 获 得 <strong>ARM</strong> 指 令 集 的 参 考 材 料 。<br />

第 5 章 Thumb 指 令 参 考<br />

阅 读 此 章 获 得 Thumb 指 令 集 的 参 考 材 料 。<br />

第 6 章 向 量 浮 点 编 程<br />

阅 读 此 章 获 得 VFP 指 令 集 的 参 考 材 料 以 及 其 它 与 VFP 相 关 的 汇 编<br />

语 言 信 息 。<br />

viii © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


序 言<br />

第 7 章 命 令 参 考<br />

阅 读 此 章 获 得 可 在 <strong>ARM</strong> 汇 编 程 序 armasm 中 使 用 的 汇 编 程 序 命 令 的<br />

参 考 材 料 。<br />

印 刷 约 定<br />

本 书 中 使 用 了 下 列 印 刷 约 定 :<br />

等 宽 字 体 表 示 可 在 键 盘 上 输 入 的 文 本 , 例 如 命 令 、 文 件 和 程 序 名 称 及 源 代 码 。<br />

等 宽 字 体<br />

表 示 命 令 或 选 项 所 允 许 的 缩 写 词 。 可 以 输 入 带 下 划 线 文 本 来 代 替 整<br />

个 命 令 或 选 项 名 称 。<br />

等 宽 斜 体 表 示 命 令 和 函 数 的 自 变 量 , 其 中 函 数 中 的 自 变 量 将 由 指 定 的 值 代 替 。<br />

等 宽 粗 体 表 示 在 示 例 代 码 外 使 用 的 语 言 关 键 字 。<br />

斜 体<br />

粗 体<br />

突 出 显 示 重 要 的 备 注 , 介 绍 特 殊 术 语 , 表 示 内 部 交 叉 引 用 , 以 及<br />

引 用 。<br />

突 出 显 示 界 面 元 素 ( 如 菜 单 名 称 )。 有 时 候 也 用 于 在 描 述 性 的 列 表<br />

中 进 行 强 调 , 以 及 表 示 <strong>ARM</strong> 处 理 器 信 号 名 称 。<br />

更 深 入 的 读 物<br />

本 节 列 出 <strong>ARM</strong> Limited 和 第 三 方 的 出 版 物 , 其 中 提 供 了 为 <strong>ARM</strong> 系 列 处 理 器 开 发<br />

代 码 的 附 加 信 息 。<br />

<strong>ARM</strong> 定 期 对 其 文 档 进 行 更 新 和 修 正 。 有 关 当 前 勘 误 表 和 增 补 以 及 <strong>ARM</strong> 常 见 问<br />

题 的 信 息 , 请 访 问 http://www.arm.com。<br />

<strong>ARM</strong> 出 版 物<br />

本 书 包 含 与 随 RVCT 提 供 的 开 发 工 具 相 关 的 参 考 信 息 。 该 套 件 中 包 含 的 其 它 出<br />

版 物 有 :<br />

• <strong>RealView</strong> 编 译 工 具 2.0 版 入 门 指 南 (<strong>ARM</strong> DUI 0202)<br />

• <strong>RealView</strong> 编 译 工 具 2.0 版 开 发 人 员 指 南 (<strong>ARM</strong> DUI 0203)<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 ix


序 言<br />

• <strong>RealView</strong> 编 译 工 具 2.0 版 编 译 程 序 和 程 序 库 指 南 (<strong>ARM</strong> DUI 0205)<br />

• <strong>RealView</strong> 编 译 工 具 2.0 版 链 接 程 序 和 实 用 程 序 指 南 (<strong>ARM</strong> DUI 0206)<br />

随 <strong>RealView</strong> 编 译 工 具 提 供 了 下 列 附 加 文 档 :<br />

• <strong>ARM</strong> FLEXlm 许 可 证 管 理 指 南 (<strong>ARM</strong> DUI 0209)。 此 指 南 以 DynaText 和 PDF<br />

格 式 提 供 。<br />

• <strong>ARM</strong> 体 系 结 构 参 考 手 册 (<strong>ARM</strong> DDI 0100)。 该 手 册 作 为 联 机 图 书 的 组 成 部<br />

分 以 DynaText 格 式 提 供 , 并 以 PDF 文 件 DDI0100E_<strong>ARM</strong>_<strong>ARM</strong>.pdf 形 式 提 供 ,<br />

该 文 件 位 于 install_directory\Documentation\<strong>ARM</strong><strong>ARM</strong>\5.0\release\windows\PDF 中 。<br />

• <strong>ARM</strong> ELF 规 范 (SWS ESPC 0003)。 这 是 以 PDF 文 件 格 式 提 供 的 , 文 件 名 为<br />

<strong>ARM</strong>ELF.pdf, 位 于<br />

install_directory\Documentation\Specifications\1.0\release\platform\PDF 下 。<br />

• TIS DWARF 2 规 范 。 这 是 以 PDF 文 件 格 式 提 供 的 , 文 件 名 为 TIS-DWARF2.pdf ,<br />

位 于 install_directory\Documentation\Specifications\1.0\release\platform\PDF 下 。<br />

• <strong>ARM</strong>-Thumb 过 程 调 用 标 准 规 范 。 这 是 以 PDF 文 件 格 式 提 供 的 , 文 件 名 为<br />

ATPCS.pdf, 位 于<br />

install_directory\Documentation\Specifications\1.0\release\platform\PDF 下 。<br />

此 外 , 可 参 考 下 列 文 档 来 了 解 与 <strong>ARM</strong> 产 品 相 关 的 特 定 信 息 :<br />

• <strong>RealView</strong> <strong>ARM</strong>ulator ISS v1.3 用 户 指 南 (<strong>ARM</strong> DUI 0207) ;<br />

• <strong>ARM</strong> 参 考 外 设 规 范 (<strong>ARM</strong> DDI 0062) ;<br />

• 您 的 硬 件 设 备 的 <strong>ARM</strong> 数 据 表 或 技 术 参 考 手 册 。<br />

其 它 出 版 物<br />

下 面 这 本 书 提 供 了 关 于 <strong>ARM</strong> 体 系 结 构 的 通 用 信 息 :<br />

• <strong>ARM</strong> 芯 片 系 统 体 系 结 构 , Furber, S.,(2000 年 第 2 版 )。 Addison Wesley<br />

Longman, Harlow, England. ISBN 0-201-67519-6。<br />

x © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


序 言<br />

反 馈<br />

<strong>ARM</strong> 欢 迎 您 提 出 关 于 <strong>RealView</strong> 编 译 工 具 和 文 档 的 反 馈 信 息 。<br />

对 <strong>RealView</strong> 编 译 工 具 的 反 馈 信 息<br />

如 果 您 有 关 于 <strong>RealView</strong> 编 译 工 具 的 任 何 问 题 , 请 与 您 的 供 货 商 联 系 。 为 了 帮 助<br />

他 们 提 供 快 速 而 有 益 的 响 应 , 请 提 供 :<br />

• 您 的 姓 名 和 公 司 ;<br />

• 产 品 的 序 列 号 ;<br />

• 您 正 在 使 用 版 本 的 详 细 信 息 ;<br />

• 您 正 在 运 行 的 平 台 的 详 细 信 息 , 例 如 硬 件 平 台 、 操 作 系 统 类 型 和 版 本 ;<br />

• 能 复 现 问 题 的 一 小 段 独 立 的 示 例 代 码 ;<br />

• 清 晰 地 解 释 您 期 望 发 生 的 和 实 际 发 生 的 操 作 ;<br />

• 您 使 用 的 命 令 , 包 括 任 何 命 令 行 选 项 ;<br />

• 说 明 问 题 的 输 出 样 例 ;<br />

• 工 具 的 版 本 字 符 串 , 包 括 版 本 号 和 编 译 号 。<br />

对 本 书 的 反 馈<br />

如 果 您 注 意 到 本 书 中 有 任 何 错 误 或 遗 漏 , 请 发 送 电 子 邮 件 到 errata@arm.com, 并 提<br />

供 :<br />

• 文 档 标 题 ;<br />

• 文 档 编 号 ;<br />

• 您 的 意 见 所 适 用 的 页 码 ;<br />

• 问 题 的 简 要 说 明 。<br />

也 欢 迎 对 增 补 和 改 进 提 出 一 般 性 建 议 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 xi


序 言<br />

xii © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


第 1 章<br />

简 介<br />

本 章 介 绍 随 <strong>RealView</strong> 编 译 工 具 2.0 版 提 供 的 汇 编 程 序 。 其 中 包 含 下 面 部 分 :<br />

• 第 1-2 页 的 关 于 <strong>RealView</strong> 编 译 工 具 汇 编 程 序 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 1-1


简 介<br />

1.1 关 于 <strong>RealView</strong> 编 译 工 具 汇 编 程 序<br />

<strong>RealView</strong> 编 译 工 具 (RVCT) 拥 有 :<br />

• 独 立 的 汇 编 程 序 armasm ;<br />

• 内 嵌 到 C 和 C++ 编 译 程 序 中 的 优 化 内 联 汇 编 程 序 。<br />

这 些 汇 编 程 序 所 用 的 输 入 语 言 基 本 相 同 。 但 是 , 对 可 以 在 内 联 汇 编 程 序 中 使 用<br />

的 语 言 特 性 有 一 些 限 制 。 有 关 内 嵌 汇 编 程 序 的 详 细 信 息 , 请 参 阅 <strong>RealView</strong> 编 译<br />

工 具 2.0 版 开 发 人 员 指 南 中 的 混 合 使 用 C、 C++ 和 汇 编 语 言 一 章 。<br />

本 书 的 其 余 内 容 主 要 介 绍 armasm 。<br />

1-2 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


第 2 章<br />

编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

本 章 简 单 介 绍 编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言 的 一 般 原 则 。 其 中 包 含 下 列 各 部 分 :<br />

• 第 2-2 页 的 简 介 ;<br />

• 第 2-3 页 的 <strong>ARM</strong> 体 系 结 构 概 述 ;<br />

• 第 2-13 页 的 汇 编 语 言 模 块 的 结 构 ;<br />

• 第 2-21 页 的 使 用 C 预 处 理 程 序 ;<br />

• 第 2-22 页 的 条 件 执 行 ;<br />

• 第 2-27 页 的 将 常 数 装 载 到 寄 存 器 中 ;<br />

• 第 2-32 页 的 将 地 址 装 载 到 寄 存 器 中 ;<br />

• 第 2-41 页 的 装 载 和 存 储 多 个 寄 存 器 指 令 ;<br />

• 第 2-50 页 的 使 用 宏 ;<br />

• 第 2-53 页 的 用 MAP 和 FIELD 命 令 描 述 数 据 结 构 ;<br />

• 第 2-68 页 的 使 用 框 架 命 令 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-1


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.1 简 介<br />

本 章 提 供 对 如 何 编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言 模 块 的 基 本 的 、 实 用 的 了 解 。 其<br />

中 也 给 出 由 <strong>ARM</strong> 汇 编 程 序 (armasm) 提 供 的 工 具 的 相 关 信 息 。<br />

本 章 不 提 供 <strong>ARM</strong>、Thumb 或 VFP 指 令 集 的 详 细 描 述 。 有 关 这 些 信 息 请 参 阅 第 4<br />

章 <strong>ARM</strong> 指 令 参 考 , 第 5 章 Thumb 指 令 参 考 和 第 6 章 向 量 浮 点 编 程 。 详 细 信 息<br />

请 参 阅 <strong>ARM</strong> 体 系 结 构 参 考 手 册 。<br />

2.1.1 代 码 示 例<br />

本 章 有 很 多 代 码 示 例 。 其 中 很 多 示 例 可 在 RVCT 的 examples\asm 目 录 中 找 到 。<br />

请 遵 照 下 面 这 些 步 骤 来 建 立 和 链 接 汇 编 语 言 文 件 :<br />

1. 在 命 令 提 示 行 键 入 armasm -g filename.s 来 汇 编 文 件 和 生 成 调 试 表 。<br />

2. 键 入 armlink filename.o -o filename 来 链 接 目 标 文 件 和 生 成 一 个 ELF 可 执<br />

行 映 像 。<br />

要 执 行 和 调 试 映 像 , 根 据 适 合 的 调 试 目 标 , 将 其 装 载 到 一 个 ELF/DWARF2 兼 容<br />

的 调 试 器 中 。<br />

要 查 看 汇 编 程 序 是 如 何 转 换 源 代 码 的 , 可 输 入 :<br />

fromelf -c filename.o<br />

有 关 armlink 和 fromelf 的 详 细 信 息 , 请 参 阅 <strong>RealView</strong> 编 译 工 具 2.0 版 链 接 程 序 和<br />

实 用 程 序 指 南 。<br />

2-2 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.2 <strong>ARM</strong> 体 系 结 构 概 述<br />

本 节 简 要 概 述 <strong>ARM</strong> 体 系 结 构 。<br />

<strong>ARM</strong> 系 列 处 理 器 是 典 型 的 RISC 处 理 器 , 因 为 它 们 实 现 的 是 装 载 / 存 储 体 系 结<br />

构 。 只 有 装 载 和 存 储 指 令 才 能 访 问 存 储 器 。 数 据 处 理 指 令 只 操 作 寄 存 器 的 内 容 。<br />

2.2.1 体 系 结 构 的 版 本<br />

本 书 中 的 信 息 和 示 例 假 定 您 使 用 的 是 实 现 了 v3 或 以 上 版 本 <strong>ARM</strong> 体 系 结 构 的 处<br />

理 器 。 有 关 各 个 体 系 结 构 版 本 的 详 细 信 息 , 请 参 阅 <strong>ARM</strong> 体 系 结 构 参 考 手 册 。<br />

所 有 这 些 处 理 器 都 具 有 32 位 寻 址 范 围 。<br />

2.2.2 <strong>ARM</strong> 和 Thumb 状 态<br />

<strong>ARM</strong> 体 系 结 构 v4T 及 以 上 版 本 定 义 了 一 个 16 位 指 令 集 , 称 之 为 Thumb 指 令<br />

集 。 Thumb 指 令 集 的 功 能 是 32 位 <strong>ARM</strong> 指 令 集 功 能 的 一 个 子 集 。 有 关 详 细 信 息<br />

请 参 阅 第 2-10 页 的 Thumb 指 令 集 概 述 。<br />

正 在 执 行 Thumb 指 令 的 处 理 器 工 作 在 Thumb 状 态 。 正 在 执 行 <strong>ARM</strong> 指 令 的 处 理<br />

器 工 作 在 <strong>ARM</strong> 状 态 。<br />

<strong>ARM</strong> 状 态 下 的 处 理 器 不 能 执 行 Thumb 指 令 , 而 Thumb 状 态 下 的 处 理 器 不 能 执<br />

行 <strong>ARM</strong> 指 令 。 用 户 必 须 确 保 处 理 器 永 远 不 会 收 到 对 于 当 前 状 态 是 错 误 指 令 集 的<br />

指 令 。<br />

每 种 指 令 集 都 包 含 转 变 处 理 器 状 态 的 指 令 。<br />

用 户 也 必 须 使 用 CODE16 和 CODE32 命 令 切 换 汇 编 程 序 模 式 , 以 生 成 正 确 的 运 行 代<br />

码 。 详 细 信 息 请 参 阅 第 7-57 页 的 CODE16 和 CODE32。<br />

<strong>ARM</strong> 处 理 器 总 是 在 <strong>ARM</strong> 状 态 下 开 始 执 行 代 码 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-3


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.2.3 处 理 器 模 式<br />

<strong>ARM</strong> 处 理 器 支 持 多 达 七 个 处 理 器 模 式 , 具 体 要 取 决 于 体 系 结 构 的 版 本 。 这 些 模<br />

式 是 :<br />

0b10000 User ;<br />

0b10001 FIQ — 快 速 中 断 请 求 ;<br />

0b10010 IRQ — 中 断 请 求 ;<br />

0b10011 Supervisor ;<br />

0b10111 Abort ;<br />

0b11011 Undefined ;<br />

0b11111 System (<strong>ARM</strong> 体 系 结 构 v4 及 以 上 版 本 )。<br />

除 User 模 式 外 的 所 有 模 式 称 为 特 权 模 式 。<br />

要 求 任 务 保 护 的 应 用 程 序 通 常 在 [User] 模 式 下 执 行 。 有 些 嵌 入 式 应 用 程 序 可 能<br />

完 全 运 行 在 [Supervisor] 或 [System] 模 式 下 。<br />

进 入 除 [User] 模 式 外 的 所 有 模 式 是 为 了 处 理 异 常 或 访 问 特 许 的 资 源 。 有 关 详 细<br />

信 息 , 请 参 阅 <strong>RealView</strong> 编 译 工 具 2.0 版 开 发 人 员 指 南 中 的 处 理 处 理 器 异 常 一 章 ,<br />

以 及 <strong>ARM</strong> 体 系 结 构 参 考 手 册 。<br />

2.2.4 寄 存 器<br />

<strong>ARM</strong> 处 理 器 拥 有 37 个 寄 存 器 。 这 些 寄 存 器 按 部 分 重 叠 的 编 组 加 以 排 列 。 每 种 处<br />

理 器 模 式 有 一 个 不 同 的 寄 存 器 组 。 编 组 的 寄 存 器 为 处 理 处 理 器 异 常 和 特 许 操 作<br />

提 供 了 快 速 的 环 境 切 换 。 有 关 寄 存 器 如 何 编 组 的 详 细 信 息 , 请 参 阅 <strong>ARM</strong> 体 系 结<br />

构 参 考 手 册 。<br />

下 列 寄 存 器 可 用 在 <strong>ARM</strong> 体 系 结 构 v3 及 以 上 版 本 中 :<br />

• 30 个 通 用 的 32 位 寄 存 器 ;<br />

• 第 2-5 页 的 程 序 计 数 器 (pc) ;<br />

• 第 2-5 页 的 当 前 程 序 状 态 寄 存 器 (CPSR) ;<br />

• 第 2-6 页 的 五 个 保 存 的 程 序 状 态 寄 存 器 (SPSR)。<br />

30 个 通 用 的 32 位 寄 存 器<br />

具 体 取 决 于 当 前 处 理 器 模 式 , 任 一 时 刻 , 可 将 十 五 个 通 用 寄 存 器 看 作 r0, r1, ...,<br />

r13, r14。<br />

按 照 惯 例 , 在 <strong>ARM</strong> 汇 编 语 言 中 , r13 用 作 栈 指 针 (sp)。 C 和 C++ 编 译 程 序 总 是<br />

将 r13 用 作 栈 指 针 。<br />

2-4 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

在 [User] 模 式 下 , r14 被 用 作 链 接 寄 存 器 (lr), 用 于 存 储 子 例 程 调 用 时 的 返 回 地<br />

址 。 如 果 返 回 地 址 存 储 在 栈 上 , 也 可 将 其 用 作 一 个 通 用 寄 存 器 。<br />

在 异 常 处 理 模 式 中 ,r14 存 放 异 常 的 返 回 地 址 , 或 者 如 果 在 一 个 异 常 内 执 行 子 程<br />

序 调 用 , 则 存 放 子 程 序 返 回 地 址 。 如 果 返 回 地 址 存 储 在 栈 上 , 也 可 将 r14 用 作 一<br />

个 通 用 寄 存 器 。<br />

程 序 计 数 器 (pc)<br />

程 序 计 数 器 被 当 作 r15 ( 或 pc) 来 加 以 访 问 。 对 于 <strong>ARM</strong> 状 态 下 的 每 条 指 令 , 其<br />

以 一 个 字 ( 四 字 节 ) 为 增 量 , 在 Thumb 状 态 下 则 以 两 个 字 节 为 增 量 。 跳 转 指 令<br />

将 目 的 地 址 装 载 到 程 序 计 数 器 中 。 也 可 以 使 用 数 据 操 作 指 令 来 直 接 装 载 程 序 计<br />

数 器 。 例 如 , 为 了 从 一 个 子 程 序 中 返 回 , 可 以 将 链 接 寄 存 器 复 制 到 程 序 计 数 器<br />

中 , 使 用 下 列 方 法 :<br />

MOV pc,lr<br />

在 执 行 时 , r15 不 包 含 当 前 正 在 执 行 指 令 的 地 址 。 在 <strong>ARM</strong> 状 态 下 , 当 前 执 行 指<br />

令 的 地 址 一 般 是 pc–8, 而 在 Thumb 状 态 下 一 般 是 pc–4。<br />

当 前 程 序 状 态 寄 存 器 (CPSR)<br />

CPSR 存 放 :<br />

• 算 术 逻 辑 单 元 (ALU) 状 态 标 志 的 副 本 ;<br />

• 当 前 处 理 器 模 式 ;<br />

• 中 断 禁 止 标 志 。<br />

CPSR 中 的 ALU 状 态 标 志 用 于 确 定 是 否 执 行 了 条 件 指 令 。 有 关 详 细 信 息 请 参 阅<br />

第 2-22 页 的 条 件 执 行 。<br />

在 能 支 持 Thumb 或 能 支 持 Jazelle 的 处 理 器 上 , CPSR 也 存 放 当 前 处 理 器 状 态<br />

(<strong>ARM</strong>、 Thumb 或 Jazelle)。<br />

在 <strong>ARM</strong> 体 系 结 构 的 v5TE 和 v6 及 以 上 版 本 中 , CPSR 也 存 放 Q 标 志 ( 请 参 阅<br />

第 2-22 页 的 ALU 状 态 标 志 )。<br />

在 <strong>ARM</strong> 体 系 结 构 的 v6 及 以 上 版 本 中 , CPSR 也 存 放 GE 标 志 ( 请 参 阅 第 4-83<br />

页 的 并 行 加 法 和 减 法 ) 和 端 序 位 ( 请 参 阅 第 4-119 页 的 SETEND)。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-5


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

五 个 保 存 的 程 序 状 态 寄 存 器 (SPSR)<br />

当 发 生 一 个 异 常 时 , SPSR 用 于 存 储 CPSR。 在 每 个 异 常 处 理 模 式 下 , 可 访 问 一<br />

个 SPSR。 [User] 模 式 和 [System] 模 式 不 拥 有 SPSR, 因 为 它 们 不 是 异 常 处 理 模<br />

式 。 有 关 详 细 信 息 , 请 参 阅 <strong>RealView</strong> 编 译 工 具 2.0 版 开 发 人 员 指 南 中 的 处 理 处<br />

理 器 异 常 一 章 。<br />

2-6 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.2.5 <strong>ARM</strong> 指 令 集 概 述<br />

所 有 <strong>ARM</strong> 指 令 的 长 度 都 是 32 位 。 指 令 是 按 字 对 齐 方 式 存 储 的 , 因 此 , 在 <strong>ARM</strong><br />

状 态 下 , 指 令 地 址 的 两 个 最 低 有 效 位 总 是 0。 有 些 指 令 使 用 最 低 有 效 位 来 确 定 跳<br />

转 的 目 标 地 址 上 是 Thumb 代 码 还 是 <strong>ARM</strong> 代 码 。<br />

有 关 <strong>ARM</strong> 指 令 集 的 详 细 信 息 , 请 参 阅 第 4 章 <strong>ARM</strong> 指 令 参 考 。<br />

<strong>ARM</strong> 指 令 可 以 划 分 成 多 个 功 能 组 :<br />

• 跳 转 指 令 ;<br />

• 数 据 处 理 指 令 ;<br />

• 单 个 寄 存 器 装 载 和 存 储 指 令 ;<br />

• 第 2-8 页 的 多 个 寄 存 器 装 载 和 存 储 指 令 ;<br />

• 第 2-8 页 的 状 态 寄 存 器 访 问 指 令 ;<br />

• 第 2-8 页 的 协 处 理 器 指 令 。<br />

跳 转 指 令<br />

这 些 指 令 用 于 :<br />

• 向 后 跳 转 以 构 成 循 环 ;<br />

• 在 条 件 结 构 中 向 前 跳 转 ;<br />

• 跳 转 到 子 程 序 ;<br />

• 将 处 理 器 从 <strong>ARM</strong> 状 态 转 换 到 Thumb 状 态 。<br />

数 据 处 理 指 令<br />

这 些 指 令 操 作 通 用 寄 存 器 。 它 们 对 两 个 寄 存 器 的 值 执 行 一 些 运 算 , 例 如 加 法 、 减<br />

法 或 按 位 逻 辑 运 算 , 并 将 结 果 放 到 第 三 个 寄 存 器 中 。 它 们 也 操 作 单 个 寄 存 器 中 的<br />

值 , 或 者 操 作 一 个 寄 存 器 中 的 值 以 及 在 指 令 内 提 供 的 一 个 常 数 ( 立 即 值 )。<br />

长 整 数 乘 法 指 令 ( 在 有 些 体 系 结 构 中 不 可 用 ) 在 两 个 寄 存 器 中 给 出 一 个 64 位<br />

结 果 。<br />

单 个 寄 存 器 装 载 和 存 储 指 令<br />

这 些 指 令 从 存 储 器 装 载 或 存 储 单 个 寄 存 器 的 值 , 或 存 储 到 存 储 器 中 。 它 们 可 以<br />

装 载 或 存 储 32 位 字 或 8 位 无 符 号 字 节 。 在 <strong>ARM</strong> 体 系 结 构 的 v4 及 以 上 版 本 中 ,<br />

它 们 也 可 以 装 载 或 存 储 16 位 无 符 号 半 字 , 或 者 装 载 和 符 号 扩 展 16 位 半 字 或 8<br />

位 字 节 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-7


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

信 号 量 指 令 装 载 和 改 变 存 储 器 信 号 量 。<br />

多 个 寄 存 器 装 载 和 存 储 指 令<br />

这 些 指 令 从 存 储 器 装 载 或 存 储 通 用 寄 存 器 的 任 何 子 集 , 或 存 储 到 存 储 器 中 。 有 关<br />

这 些 指 令 的 详 细 描 述 , 请 参 阅 第 2-41 页 的 装 载 和 存 储 多 个 寄 存 器 指 令 。<br />

状 态 寄 存 器 访 问 指 令<br />

这 些 指 令 将 CPSR 或 SPSR 的 内 容 移 到 或 移 出 通 用 寄 存 器 。<br />

协 处 理 器 指 令<br />

这 些 指 令 支 持 扩 展 <strong>ARM</strong> 体 系 结 构 的 一 种 通 用 方 式 。<br />

2-8 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.2.6 <strong>ARM</strong> 指 令 能 力<br />

下 列 特 征 适 用 于 <strong>ARM</strong> 指 令 :<br />

• 条 件 执 行 ;<br />

• 寄 存 器 访 问 ;<br />

• 访 问 内 联 的 滚 筒 式 移 位 器 。<br />

条 件 执 行<br />

几 乎 所 有 <strong>ARM</strong> 指 令 都 可 根 据 CPSR 中 的 ALU 状 态 标 志 的 值 , 来 有 条 件 地 加 以<br />

执 行 。 不 需 要 使 用 跳 转 来 跳 过 条 件 指 令 , 尽 管 当 一 系 列 指 令 依 赖 于 相 同 的 条 件<br />

时 , 这 样 做 的 效 果 会 更 好 。<br />

可 以 指 定 一 个 数 据 处 理 指 令 是 否 设 置 这 些 标 志 的 状 态 。 可 以 使 用 由 一 个 指 令 设<br />

置 的 标 志 来 控 制 其 它 指 令 的 执 行 , 即 使 在 它 们 之 间 有 很 多 指 令 。<br />

详 细 描 述 请 参 阅 第 2-22 页 的 条 件 执 行 。<br />

寄 存 器 访 问<br />

在 <strong>ARM</strong> 状 态 下 , 所 有 指 令 都 可 访 问 r0 到 r14, 而 且 大 多 数 指 令 也 允 许 访 问 r15<br />

(pc)。MRS 和 MSR 指 令 可 将 CPSR 和 SPSR 的 内 容 移 动 到 通 用 寄 存 器 中 , 在 此 可 按<br />

普 通 的 数 据 处 理 操 作 来 处 理 它 们 。 有 关 详 细 信 息 请 参 阅 第 4-115 页 的 MRS 和 第<br />

4-116 页 的 MSR。<br />

访 问 内 联 的 滚 筒 式 移 位 器<br />

<strong>ARM</strong> 算 术 逻 辑 单 元 含 有 一 个 32 位 滚 筒 式 移 位 器 , 能 执 行 移 位 和 循 环 操 作 。 对 于<br />

所 有 <strong>ARM</strong> 数 据 处 理 指 令 和 单 寄 存 器 数 据 传 送 指 令 的 第 二 个 操 作 数 , 在 执 行 数 据<br />

处 理 或 数 据 传 送 之 前 , 作 为 指 令 的 一 部 分 , 可 以 对 其 执 行 移 位 操 作 。 这 种 操 作 支<br />

持 ( 但 不 限 于 ):<br />

• 比 例 寻 址 ;<br />

• 乘 以 一 个 常 数 ;<br />

• 构 造 常 数 。<br />

有 关 使 用 滚 筒 式 移 位 器 生 成 常 数 的 详 细 信 息 , 请 参 阅 第 2-27 页 的 将 常 数 装 载 到<br />

寄 存 器 中 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-9


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.2.7 Thumb 指 令 集 概 述<br />

Thumb 指 令 集 的 功 能 几 乎 完 全 是 32 位 <strong>ARM</strong> 指 令 集 功 能 的 一 个 子 集 。 该 指 令 集<br />

为 用 C 或 C++ 编 译 程 序 生 成 代 码 进 行 了 优 化 。<br />

所 有 Thumb 指 令 的 长 度 为 16 位 , 并 以 半 字 对 齐 方 式 存 储 在 存 储 器 中 。 因 此 , 在<br />

Thumb 状 态 下 , 指 令 地 址 的 最 低 有 效 位 总 是 0。 有 些 指 令 使 用 最 低 有 效 位 来 确 定<br />

跳 转 的 目 标 地 址 上 是 Thumb 代 码 还 是 <strong>ARM</strong> 代 码 。<br />

所 有 Thumb 数 据 处 理 指 令 :<br />

• 操 作 寄 存 器 中 的 全 32 位 值 ;<br />

• 使 用 全 32 位 地 址 进 行 数 据 访 问 和 指 令 获 取 。<br />

有 关 Thumb 指 令 集 的 语 法 , 以 及 Thumb 指 令 与 其 对 等 的 <strong>ARM</strong> 指 令 的 差 别 的 详<br />

细 信 息 , 请 参 阅 第 5 章 Thumb 指 令 参 考 。<br />

2.2.8 Thumb 指 令 功 能<br />

下 列 特 征 适 用 于 Thumb 指 令 :<br />

• 条 件 执 行 ;<br />

• 寄 存 器 访 问 ;<br />

• 第 2-11 页 的 访 问 滚 筒 式 移 位 器 。<br />

条 件 执 行<br />

在 Thumb 指 令 集 中 , 条 件 跳 转 指 令 是 唯 一 可 根 据 CPSR 中 的 ALU 状 态 标 志 的<br />

值 而 有 条 件 地 执 行 的 指 令 。 所 有 数 据 处 理 指 令 更 新 这 些 标 志 , 但 当 一 个 或 多 个<br />

高 位 寄 存 器 被 指 定 为 MOV 或 ADD 指 令 的 操 作 数 时 除 外 。 在 这 些 情 况 下 , 标 志 不 能<br />

更 新 。<br />

在 设 置 一 个 条 件 的 指 令 和 依 赖 于 该 条 件 的 条 件 跳 转 之 间 , 不 能 包 含 任 何 数 据 处<br />

理 指 令 。 在 希 望 进 行 条 件 执 行 的 地 方 使 用 条 件 跳 转 指 令 。<br />

寄 存 器 访 问<br />

在 Thumb 状 态 中 , 大 多 数 指 令 只 能 访 问 r0 到 r7。 这 些 寄 存 器 被 称 为 低 位 寄 存<br />

器 。<br />

寄 存 器 r8 到 r15 是 有 访 问 限 制 的 寄 存 器 。 在 Thumb 状 态 中 , 这 些 寄 存 器 被 称 为<br />

高 位 寄 存 器 。 例 如 , 它 们 可 用 作 快 速 的 临 时 存 储 器 。<br />

2-10 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

关 于 可 访 问 高 位 寄 存 器 的 Thumb 数 据 处 理 指 令 的 完 整 列 表 , 请 参 阅 第 5 章<br />

Thumb 指 令 参 考 。<br />

访 问 滚 筒 式 移 位 器<br />

在 Thumb 状 态 中 , 只 能 在 使 用 LSL、LSR、ASR 或 ROR 指 令 的 独 立 操 作 中 , 使 用 滚<br />

筒 式 移 位 器 。<br />

2.2.9 Thumb 指 令 集 和 <strong>ARM</strong> 指 令 集 的 差 别<br />

在 以 下 标 题 中 将 讨 论 Thumb 指 令 集 和 <strong>ARM</strong> 指 令 集 的 一 般 差 别 :<br />

• 跳 转 指 令 ;<br />

• 数 据 处 理 指 令 ;<br />

• 第 2-12 页 的 单 个 寄 存 器 装 载 和 存 储 指 令 ;<br />

• 第 2-12 页 的 多 个 寄 存 器 装 载 和 存 储 指 令 。<br />

没 有 Thumb 协 处 理 器 指 令 , 没 有 Thumb 信 号 量 指 令 , 也 没 有 访 问 CPSR 或 SPSR<br />

的 Thumb 指 令 。<br />

跳 转 指 令<br />

• 这 些 指 令 用 于 :<br />

• 向 后 跳 转 以 构 成 循 环 ;<br />

• 在 条 件 结 构 中 向 前 跳 转 ;<br />

• 跳 转 到 子 程 序 ;<br />

• 将 处 理 器 从 Thumb 状 态 转 换 到 <strong>ARM</strong> 状 态 。<br />

相 对 程 序 的 跳 转 , 特 别 是 条 件 跳 转 , 其 作 用 范 围 比 在 <strong>ARM</strong> 代 码 中 更 有 限 , 并 且<br />

对 子 程 序 的 跳 转 只 能 是 无 条 件 的 。<br />

数 据 处 理 指 令<br />

这 些 指 令 操 作 通 用 寄 存 器 。 在 很 多 情 况 下 , 操 作 结 果 必 须 放 在 一 个 操 作 数 寄 存 器<br />

中 , 而 不 是 放 在 第 三 个 寄 存 器 中 。 与 <strong>ARM</strong> 状 态 下 相 比 , 可 使 用 的 数 据 处 理 操 作<br />

较 少 。 它 们 能 有 限 地 访 问 寄 存 器 r8 到 r15。<br />

除 了 在 使 用 MOV 或 ADD 指 令 访 问 寄 存 器 r8 到 r15 时 之 外 , 这 些 指 令 总 是 更 新<br />

CPSR 中 的 ALU 状 态 标 志 。 访 问 寄 存 器 r8 到 r15 的 Thumb 数 据 处 理 指 令 不 能 更<br />

新 标 志 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-11


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

单 个 寄 存 器 装 载 和 存 储 指 令<br />

这 些 指 令 装 载 单 个 低 位 寄 存 器 的 值 , 或 存 储 到 存 储 器 中 。 在 Thumb 状 态 中 , 这<br />

些 指 令 只 能 访 问 r0 到 r7。<br />

多 个 寄 存 器 装 载 和 存 储 指 令<br />

LDM 和 STM 从 存 储 器 装 载 r0 到 r7 范 围 内 的 寄 存 器 的 任 何 子 集 , 或 将 其 存 储 到 存 储<br />

器 中 。<br />

PUSH 和 POP 指 令 使 用 栈 指 针 (r13) 作 为 基 址 , 实 现 了 完 全 降 序 的 栈 。 除 了 传 送 r0<br />

到 r7 之 外 , PUSH 可 以 存 储 链 接 寄 存 器 , POP 可 以 装 载 程 序 计 数 器 。<br />

2-12 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.3 汇 编 语 言 模 块 的 结 构<br />

汇 编 语 言 是 指 <strong>ARM</strong> 汇 编 程 序 (armasm) 分 析 语 法 并 汇 编 生 成 目 标 代 码 的 语 言 。<br />

其 可 以 是 :<br />

• <strong>ARM</strong> 汇 编 语 言 ;<br />

• Thumb 汇 编 语 言 ;<br />

• 两 者 的 混 合 。<br />

2.3.1 汇 编 语 言 源 文 件 的 编 排<br />

汇 编 语 言 的 源 语 句 行 的 一 般 格 式 是 :<br />

{label} {instruction|directive|pseudo-instruction} {;comment}<br />

备 注<br />

即 使 没 有 标 号 , 指 令 、 伪 指 令 和 命 令 前 面 也 必 须 有 空 白 , 例 如 一 个 空 格 或 制 表 符 。<br />

源 语 句 行 的 所 有 三 部 分 都 是 可 选 的 。 可 以 使 用 空 行 来 使 代 码 更 具 可 读 性 。<br />

大 小 写 规 则<br />

指 令 记 忆 码 、 命 令 和 符 号 寄 存 器 名 称 可 以 用 大 写 或 小 写 编 写 , 但 不 能 混 合 使 用 大<br />

小 写 。<br />

语 句 行 长 度<br />

为 使 源 文 件 更 易 读 , 可 以 通 过 在 行 尾 放 置 反 斜 杠 符 ( \ ) , 来 将 较 长 的 语 句 行 分 解<br />

到 几 个 行 中 。 反 斜 杠 符 后 面 不 得 有 任 何 其 它 字 符 ( 包 括 空 格 和 制 表 符 )。 汇 编 程<br />

序 将 反 斜 杠 / 行 结 束 序 列 当 作 空 白 来 处 理 。<br />

备 注<br />

不 要 在 用 引 号 括 住 的 字 符 串 中 使 用 反 斜 杠 / 行 结 束 序 列 。<br />

行 长 度 的 限 值 是 4095 个 字 符 , 包 括 使 用 反 斜 杠 后 的 任 何 扩 展 在 内 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-13


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

标 号<br />

标 号 是 表 示 地 址 的 符 号 。 在 汇 编 时 计 算 由 标 号 指 定 的 地 址 。<br />

汇 编 程 序 计 算 标 号 的 地 址 , 该 地 址 是 相 对 于 标 号 所 在 段 的 原 点 的 。 引 用 相 同 段 内<br />

的 一 个 标 号 时 , 可 以 使 用 程 序 计 数 器 加 上 或 减 去 一 个 偏 移 量 。 这 被 称 为 相 对 程 序<br />

的 寻 址 。<br />

标 号 可 以 在 一 个 映 射 中 定 义 。 请 参 阅 第 2-53 页 的 用 MAP 和 FIELD 命 令 描 述 数<br />

据 结 构 。 在 运 算 时 , 可 以 将 映 射 的 原 点 放 在 一 个 指 定 的 寄 存 器 中 , 并 用 所 指 定 的<br />

寄 存 器 加 上 一 个 偏 移 量 来 引 用 标 号 。 这 被 称 为 相 对 寄 存 器 的 寻 址 。<br />

其 它 段 中 的 标 号 地 址 是 在 链 接 时 计 算 的 , 此 时 链 接 程 序 已 在 存 储 器 中 为 每 个 段<br />

分 配 了 具 体 的 位 置 。<br />

局 部 标 号<br />

局 部 标 号 是 标 号 的 一 个 子 类 。 局 部 标 号 以 0 - 99 范 围 内 的 一 个 数 字 开 头 。 与 其<br />

它 标 号 不 同 的 是 , 局 部 标 号 可 以 被 定 义 多 次 。 在 生 成 含 有 一 个 宏 的 标 号 时 , 局 部<br />

标 号 就 很 有 用 。 当 汇 编 程 序 找 到 对 一 个 局 部 标 号 的 引 用 时 , 就 将 其 链 接 到 该 局 部<br />

标 号 的 邻 近 实 例 上 。<br />

局 部 标 号 的 作 用 范 围 由 AREA 命 令 加 以 限 制 。 可 以 使 用 ROUT 命 令 来 更 严 格 地 限 制<br />

范 围 。<br />

请 参 阅 第 3-16 页 的 局 部 标 号 以 了 解 下 列 内 容 的 有 关 详 细 信 息 :<br />

• 局 部 标 号 声 明 的 语 法 ;<br />

• 汇 编 程 序 如 何 利 用 其 标 号 来 关 联 对 局 部 标 号 的 引 用 。<br />

注 释<br />

一 行 中 的 第 一 个 分 号 标 记 注 释 的 开 始 , 但 不 包 括 出 现 在 一 个 字 符 串 常 数 内 的 分<br />

号 。 行 的 末 尾 就 是 注 释 的 结 束 。 一 个 注 释 本 身 就 是 一 个 有 效 的 行 。 汇 编 程 序 将 忽<br />

略 所 有 注 释 。<br />

2-14 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

常 数<br />

常 数 可 以 数 值 、 布 尔 值 、 字 符 或 字 符 串 。<br />

数 字 可 以 接 受 下 列 形 式 的 数 字 常 数 :<br />

• 十 进 制 数 , 如 123<br />

• 十 六 进 制 数 , 如 0x7B<br />

• n_xxx , 其 中 :<br />

n 是 2 到 9 之 间 的 基 数 。<br />

xxx 是 采 用 该 基 数 的 数 字 。<br />

布 尔 值<br />

字 符<br />

字 符 串<br />

布 尔 常 数 TRUE 和 FALSE 必 须 书 写 为 {TRUE} 和 {FALSE}。<br />

字 符 常 数 由 左 、 右 单 引 号 组 成 , 中 间 括 住 单 个 字 符 或 一 个 转 义 字<br />

符 , 采 用 标 准 的 C 转 义 字 符 。<br />

字 符 串 由 左 、 右 双 引 号 括 住 多 个 字 符 或 空 格 而 组 成 。 如 果 在 一 个 字<br />

符 串 内 使 用 了 双 引 号 或 美 元 字 符 作 为 文 字 文 本 字 符 , 则 必 须 用 一 对<br />

适 当 的 字 符 来 表 示 它 们 。 例 如 , 如 果 需 要 在 字 符 串 内 使 用 单 个 $,<br />

则 必 须 使 用 $$。 在 字 符 串 常 数 内 可 以 使 用 标 准 的 C 转 义 序 列 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-15


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.3.2 <strong>ARM</strong> 汇 编 语 言 模 块 的 示 例<br />

示 例 2-1 说 明 了 汇 编 语 言 模 块 的 一 些 核 心 成 分 。 此 示 例 是 用 <strong>ARM</strong> 汇 编 语 言 编 写<br />

的 。 在 RVCT 的 examples\asm 子 目 录 下 , 以 armex.s 文 件 形 式 提 供 了 该 示 例 。 有<br />

关 如 何 汇 编 、 链 接 和 执 行 该 示 例 的 操 作 说 明 , 请 参 阅 第 2-2 页 的 代 码 示 例 。<br />

以 下 各 节 详 细 介 绍 此 示 例 的 组 成 部 分 。<br />

示 例 2-1<br />

start<br />

stop<br />

AREA<br />

ENTRY<br />

<strong>ARM</strong>ex, CODE, READONLY<br />

; Name this block of code <strong>ARM</strong>ex<br />

; Mark first instruction to execute<br />

MOV r0, #10 ; Set up parameters<br />

MOV r1, #3<br />

ADD r0, r0, r1 ; r0 = r0 + r1<br />

MOV r0, #0x18 ; angel_SWIreason_ReportException<br />

LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit<br />

SWI 0x123456 ; <strong>ARM</strong> semihosting SWI<br />

END<br />

; Mark end of file<br />

ELF 段 和 AREA 命 令<br />

ELF 段 是 独 立 的 、 命 名 的 、 不 可 分 割 的 代 码 或 数 据 序 列 。 单 个 代 码 段 是 生 成 一 个<br />

应 用 程 序 的 最 低 要 求 。<br />

汇 编 或 编 译 的 输 出 可 以 包 括 :<br />

• 一 个 或 多 个 代 码 段 。 它 们 通 常 是 只 读 段 ;<br />

• 一 个 或 多 个 数 据 段 。 它 们 通 常 是 读 写 段 。 它 们 可 以 是 零 初 始 化 的 (ZI)。<br />

链 接 程 序 依 照 段 位 置 规 则 , 将 每 个 段 放 在 一 个 程 序 映 像 中 。 在 源 文 件 中 相 邻 的<br />

段 , 不 一 定 要 在 应 用 程 序 映 像 中 相 邻 。 有 关 链 接 程 序 如 何 定 位 段 的 详 细 信 息 , 请<br />

参 阅 <strong>RealView</strong> 编 译 工 具 2.0 版 链 接 程 序 和 实 用 程 序 指 南 中 的 链 接 程 序 一 章 。<br />

2-16 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

在 <strong>ARM</strong> 汇 编 语 言 源 文 件 中 , 用 AREA 命 令 来 标 记 一 个 段 的 开 始 。 该 命 令 对 段 进 行<br />

命 名 并 设 置 其 属 性 。 属 性 放 在 名 称 后 面 , 之 间 用 逗 号 分 隔 。 有 关 AREA 命 令 的 语<br />

法 的 详 细 描 述 , 请 参 阅 第 7-54 页 的 AREA。<br />

可 以 为 段 选 择 任 何 段 名 。 但 是 , 以 任 何 非 字 母 数 字 字 符 开 头 的 名 称 必 须 放 在 竖 杠<br />

内 , 否 则 会 产 生 一 个 [AREA name missing] 错 误 。 例 如 :|1_DataArea|。<br />

第 2-16 页 的 示 例 2-1 定 义 了 包 含 代 码 的 、 名 为 <strong>ARM</strong>ex 的 单 个 段 , 并 将 其 标 记 为<br />

READONLY。<br />

ENTRY 命 令<br />

ENTRY 命 令 标 记 要 执 行 的 第 一 个 指 令 。 在 包 含 C 代 码 的 应 用 程 序 中 , 在 C 库 的 初<br />

始 化 代 码 中 也 包 含 一 个 入 口 点 。 初 始 化 代 码 和 异 常 处 理 程 序 也 包 含 入 口 点 。<br />

应 用 程 序 执 行<br />

第 2-16 页 的 示 例 2-1 中 的 应 用 程 序 代 码 在 标 号 start 处 开 始 执 行 , 在 此 将 十 进 制<br />

数 值 10 和 3 装 载 到 寄 存 器 r0 和 r1 中 。 将 这 些 寄 存 器 相 加 , 把 结 果 放 入 r0 中 。<br />

应 用 程 序 终 止<br />

在 执 行 主 代 码 后 , 应 用 程 序 将 控 制 返 回 调 试 器 , 从 而 终 止 执 行 。 这 是 通 过 使 用<br />

<strong>ARM</strong> 半 主 机 SWI ( 默 认 是 0x123456), 采 用 下 列 参 数 来 加 以 实 现 的 :<br />

• r0 等 于 angel_SWIreason_ReportException (0x18) ;<br />

• r1 等 于 ADP_Stopped_ApplicationExit (0x20026)。<br />

有 关 其 它 信 息 , 请 参 阅 <strong>RealView</strong> 编 译 工 具 2.0 版 编 译 程 序 和 库 指 南 中 的 半 主 机<br />

SWI 一 章 。<br />

END 命 令<br />

此 命 令 指 示 汇 编 程 序 停 止 处 理 这 个 源 文 件 。 每 个 汇 编 语 言 源 模 块 必 须 以 一 行 单<br />

独 的 END 命 令 结 束 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-17


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.3.3 调 用 子 程 序<br />

要 调 用 子 程 序 , 可 使 用 一 个 跳 转 和 链 接 指 令 。 其 语 法 是 :<br />

BL destination<br />

其 中 destination 通 常 是 位 于 子 程 序 的 第 一 个 指 令 处 的 标 号 。<br />

destination 也 可 以 是 一 个 相 对 程 序 或 相 对 寄 存 器 的 表 达 式 。 有 关 详 细 信 息 请 参<br />

阅 第 4-98 页 的 B 和 BL。<br />

BL 指 令 :<br />

• 将 返 回 地 址 放 入 链 接 寄 存 器 (lr) 中 ;<br />

• 将 程 序 计 数 器 设 置 为 子 程 序 的 地 址 。<br />

在 执 行 子 程 序 代 码 后 , 可 以 使 用 MOV pc,lr 指 令 返 回 。 根 据 约 定 , 寄 存 器 r0 到 r3<br />

用 于 给 子 程 序 传 递 参 数 , 并 将 结 果 送 回 调 用 程 序 。<br />

备 注<br />

单 独 汇 编 或 编 译 的 模 块 之 间 的 调 用 , 必 须 符 合 由 程 序 调 用 标 准 规 定 的 限 制 和 约<br />

定 。 有 关 详 细 信 息 , 请 参 阅 <strong>RealView</strong> 编 译 工 具 2.0 版 开 发 人 员 指 南 中 的 使 用 程<br />

序 调 用 标 准 一 章 。<br />

示 例 2-2 说 明 了 一 个 将 两 个 参 数 值 相 加 并 将 结 果 返 回 r0 的 子 程 序 。 该 示 例 的 代<br />

码 在 RVCT examples\asm 子 目 录 下 的 subrout.s 文 件 中 。 有 关 如 何 汇 编 、 链 接 和 执<br />

行 该 示 例 的 操 作 说 明 , 请 参 阅 第 2-2 页 的 代 码 示 例 。<br />

示 例 2-2<br />

AREA subrout, CODE, READONLY<br />

; Name this block of code<br />

ENTRY<br />

; Mark first instruction to execute<br />

start MOV r0, #10 ; Set up parameters<br />

MOV r1, #3<br />

BL doadd ; Call subroutine<br />

stop MOV r0, #0x18 ; angel_SWIreason_ReportException<br />

LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit<br />

SWI 0x123456 ; <strong>ARM</strong> semihosting SWI<br />

2-18 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

doadd ADD r0, r0, r1 ; Subroutine code<br />

MOV pc, lr ; Return from subroutine<br />

END<br />

; Mark end of file<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-19


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.3.4 一 个 Thumb 汇 编 语 言 模 块 示 例<br />

示 例 2-3 说 明 了 Thumb 汇 编 语 言 模 块 的 一 些 核 心 成 分 。 此 示 例 基 于 subrout.s 文<br />

件 。 该 示 例 的 代 码 在 RVCT 的 examples\asm 子 目 录 下 的 thumbsub.s 文 件 中 。 有 关<br />

如 何 汇 编 、 链 接 和 执 行 该 示 例 的 操 作 说 明 , 请 参 阅 第 2-2 页 的 代 码 示 例 。<br />

示 例 2-3<br />

AREA ThumbSub, CODE, READONLY ; Name this block of code<br />

ENTRY<br />

; Mark first instruction to execute<br />

CODE32<br />

; Subsequent instructions are <strong>ARM</strong><br />

header ADR r0, start + 1 ; Processor starts in <strong>ARM</strong> state,<br />

BX r0 ; so small <strong>ARM</strong> code header used<br />

; to call Thumb main program<br />

CODE16<br />

; Subsequent instructions are Thumb<br />

start<br />

MOV r0, #10 ; Set up parameters<br />

MOV r1, #3<br />

BL doadd ; Call subroutine<br />

stop<br />

MOV r0, #0x18 ; angel_SWIreason_ReportException<br />

LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit<br />

SWI 0xAB ; Thumb semihosting SWI<br />

doadd<br />

ADD r0, r0, r1 ; Subroutine code<br />

MOV pc, lr ; Return from subroutine<br />

END<br />

; Mark end of file<br />

CODE32 和 CODE16 命 令<br />

这 些 命 令 指 示 汇 编 程 序 将 随 后 的 指 令 汇 编 为 <strong>ARM</strong> (CODE32) 或 Thumb (CODE16)<br />

指 令 。 它 们 不 能 汇 编 成 运 行 时 改 变 处 理 器 状 态 的 指 令 。 它 们 只 能 改 变 汇 编 程 序<br />

状 态 。<br />

默 认 情 况 下 , <strong>ARM</strong> 汇 编 程 序 armasm 启 动 在 <strong>ARM</strong> 模 式 下 。 如 果 想 让 其 启 动 在<br />

Thumb 模 式 下 , 可 以 在 命 令 行 中 使 用 -16 选 项 。<br />

BX 指 令<br />

这 是 一 条 可 在 运 行 时 改 变 处 理 器 状 态 的 跳 转 指 令 。 目 的 地 址 的 最 低 有 效 位 指 定<br />

其 是 一 条 <strong>ARM</strong> 指 令 ( 清 除 ) 还 是 Thumb 指 令 ( 设 置 )。 在 此 例 中 , 该 位 是 在<br />

ADR 伪 指 令 中 设 置 的 。<br />

2-20 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.4 使 用 C 预 处 理 程 序<br />

在 汇 编 语 言 源 文 件 中 , 可 以 包 含 C 预 处 理 程 序 命 令 #include。 如 果 这 样 做 , 则 必<br />

须 在 使 用 armasm 汇 编 文 件 之 前 , 使 用 C 预 处 理 程 序 预 先 处 理 它 。 请 参 阅 <strong>RealView</strong><br />

编 译 工 具 2.0 版 编 译 程 序 和 库 指 南 。<br />

armasm 会 正 确 解 释 结 果 文 件 中 的 #line 命 令 。 其 能 使 用 #line 命 令 中 的 信 息 产 生<br />

错 误 信 息 和 debug_line 表 。<br />

示 例 2-4 说 明 了 用 来 预 处 理 和 汇 编 sourcefile.s 的 命 令 。 在 此 例 中 , 预 处 理 程 序<br />

输 出 一 个 名 为 preprocessed.s 的 文 件 , 而 armasm 汇 编 preprocessed.s。<br />

示 例 2-4 预 处 理 汇 编 语 言 源 文 件<br />

armcpp -E sourcefile.s > preprocessedfile.s<br />

armasm preprocessedfile.s<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-21


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.5 条 件 执 行<br />

在 <strong>ARM</strong> 状 态 中 , 每 个 数 据 处 理 指 令 都 有 一 个 选 项 , 可 根 据 操 作 结 果 来 更 新 当 前<br />

程 序 状 态 寄 存 器 (CPSR) 中 的 ALU 标 志 。<br />

对 一 个 <strong>ARM</strong> 数 据 处 理 指 令 添 加 一 个 S 后 缀 , 可 使 其 更 新 CPSR 中 的 ALU 状 态<br />

标 志 。<br />

不 要 将 S 后 缀 用 于 CMP、 CMN、 TST 或 TEQ。 这 些 比 较 指 令 总 是 更 新 标 志 。 这 是 它<br />

们 的 唯 一 作 用 。<br />

在 Thumb 状 态 下 没 有 选 项 。 所 有 数 据 处 理 指 令 都 更 新 CPSR 中 的 ALU 状 态 标<br />

志 , 但 在 MOV 和 ADD 中 使 用 了 一 个 或 多 个 高 位 寄 存 器 除 外 。 在 这 些 情 况 下 , MOV<br />

和 ADD 不 能 更 新 状 态 标 志 。<br />

几 乎 每 条 <strong>ARM</strong> 指 令 都 可 根 据 CPSR 中 的 ALU 状 态 标 志 的 值 , 来 有 条 件 地 加 以<br />

执 行 。 有 关 添 加 到 指 令 上 以 使 其 条 件 执 行 的 后 缀 的 列 表 , 请 参 阅 第 2-23 页 上 的<br />

表 2-1。<br />

在 <strong>ARM</strong> 状 态 中 , 可 以 :<br />

• 根 据 数 据 操 作 结 果 更 新 CPSR 中 的 ALU 状 态 标 志 ;<br />

• 执 行 几 个 其 它 数 据 操 作 而 不 更 新 标 志 ;<br />

• 根 据 第 一 个 操 作 所 更 新 的 标 志 的 状 态 , 来 执 行 或 不 执 行 后 续 指 令 。<br />

在 Thumb 状 态 中 , 大 多 数 数 据 操 作 总 是 更 新 标 志 , 并 且 只 能 使 用 条 件 跳 转 指 令<br />

(B) 来 实 现 条 件 执 行 。 该 指 令 的 后 缀 与 在 <strong>ARM</strong> 状 态 下 相 同 。 没 有 其 它 指 令 是 有<br />

条 件 的 。<br />

2.5.1 ALU 状 态 标 志<br />

CPSR 包 含 下 列 ALU 状 态 标 志 :<br />

N 当 操 作 结 果 是 负 值 时 设 置 此 标 志 。<br />

Z 当 操 作 结 果 是 零 时 设 置 此 标 志 。<br />

C 当 操 作 导 致 一 个 进 位 时 设 置 此 标 志 。<br />

V 当 操 作 造 成 上 溢 时 设 置 此 标 志 。<br />

Q <strong>ARM</strong> 体 系 结 构 v5E、 v6 及 以 上 版 本 。 粘 性 标 志 ( 请 参 阅 第 4-7 页<br />

的 Q 标 志 )。<br />

如 果 一 个 加 法 的 结 果 大 于 或 等 于 2 32 、 如 果 一 个 减 法 的 结 果 是 正 值 , 或 者 如 果 是<br />

移 动 或 逻 辑 指 令 中 的 一 个 内 嵌 滚 筒 式 移 位 器 操 作 的 结 果 时 , 则 发 生 进 位 。<br />

如 果 一 个 加 法 、 减 法 或 比 较 的 结 果 大 于 或 等 于 2 31 或 小 于 –2 31 , 则 发 生 上 溢 。<br />

2-22 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.5.2 执 行 条 件<br />

条 件 代 码 后 缀 与 N、 Z、 C 和 V 标 志 的 关 系 如 表 2-1 所 示 。<br />

表 2-1 条 件 代 码 后 缀<br />

后 缀 标 志 含 义<br />

EQ Z 设 置 等 于<br />

NE Z 清 除 不 等 于<br />

CS/HS 设 置 C 标 志 大 于 或 等 于 ( 无 符 号 的 >= )<br />

CC/LO C 清 除 小 于 ( 无 符 号 的 )<br />

LS C 清 除 和 Z 设 置 小 于 或 等 于 ( 无 符 号 的 =<br />

LT N 和 V 不 相 等 有 符 号 的 <<br />

GT 清 除 Z 标 志 , N 和 V 相 等 有 符 号 的 ><br />

LE 设 置 Z 标 志 ,N 和 V 不 相 等 有 符 号 的


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.5.3 在 <strong>ARM</strong> 状 态 中 使 用 条 件 执 行<br />

可 以 利 用 <strong>ARM</strong> 指 令 的 条 件 执 行 , 来 减 少 代 码 中 跳 转 指 令 的 数 目 。 这 样 就 改 进 了<br />

代 码 密 度 。<br />

跳 转 指 令 在 处 理 器 周 期 中 也 是 很 耗 时 的 。 在 跳 转 预 测 硬 件 的 <strong>ARM</strong> 处 理 器 上 , 每<br />

次 获 得 一 个 跳 转 时 , 一 般 需 要 三 个 处 理 器 周 期 来 重 填 处 理 器 流 水 线 。<br />

有 些 <strong>ARM</strong> 处 理 器 , 如 <strong>ARM</strong>10 和 Strong<strong>ARM</strong> ® , 带 有 跳 转 预 测 硬 件 。 在 使 用 这<br />

些 处 理 器 的 系 统 中 , 只 有 当 存 在 错 误 预 测 时 才 需 要 刷 新 和 重 填 流 水 线 。<br />

2.5.4 使 用 条 件 执 行 的 示 例<br />

此 例 使 用 Euclid 的 最 大 公 因 子 (gcd) 算 法 的 两 种 实 现 方 法 。 它 说 明 了 如 何 能 使 用<br />

条 件 执 行 来 改 进 代 码 密 度 和 执 行 速 度 。 有 关 执 行 速 度 的 详 细 分 析 只 适 用 于<br />

<strong>ARM</strong>7 处 理 器 。 代 码 密 度 计 算 适 用 于 所 有 <strong>ARM</strong> 处 理 器 。<br />

在 C 语 言 中 , 该 算 法 可 以 表 示 如 下 :<br />

int gcd(int a, int b)<br />

{<br />

while (a != b)<br />

{<br />

if (a > b)<br />

a = a - b;<br />

else<br />

b = b - a;<br />

}<br />

return a;<br />

}<br />

采 用 下 列 代 码 , 可 以 只 用 带 条 件 执 行 的 跳 转 来 实 现 gcd 函 数 :<br />

gcd CMP r0, r1<br />

BEQ end<br />

BLT less<br />

SUB r0, r0, r1<br />

B gcd<br />

less<br />

SUB r1, r1, r0<br />

B gcd<br />

end<br />

2-24 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

由 于 跳 转 数 目 的 原 因 , 该 代 码 的 长 度 是 七 条 指 令 。 每 次 获 得 一 个 跳 转 时 , 处 理<br />

器 必 须 重 填 流 水 线 并 从 新 位 置 继 续 执 行 。 其 它 指 令 和 未 执 行 的 跳 转 各 使 用 一 个<br />

周 期 。<br />

通 过 使 用 <strong>ARM</strong> 指 令 集 的 条 件 执 行 功 能 , 可 以 仅 用 四 个 指 令 实 现 gcd 函 数 :<br />

gcd<br />

CMP<br />

SUBGT<br />

SUBLT<br />

BNE<br />

r0, r1<br />

r0, r0, r1<br />

r1, r1, r0<br />

gcd<br />

除 了 减 小 了 代 码 大 小 之 外 , 此 代 码 在 大 多 数 情 况 下 执 行 速 度 更 快 。 表 2-2 和 第<br />

2-26 页 上 的 表 2-3 说 明 了 在 r0 = 1 和 r1 = 2 的 情 况 下 , 每 次 执 行 所 用 的 周 期 数 。<br />

在 这 种 情 况 下 , 用 条 件 执 行 的 所 有 指 令 来 代 替 跳 转 后 , 可 节 省 三 个 周 期 。<br />

当 r0 = r1 时 两 种 代 码 的 执 行 周 期 数 相 等 。 在 其 他 情 况 下 , 代 码 的 条 件 执 行 版 本<br />

的 执 行 周 期 数 最 少 。<br />

r0: a r1: b 指 令 周 期 数 (<strong>ARM</strong>7)<br />

1 2 CMP r0, r1 1<br />

1 2 BEQ end 1 ( 未 执 行 )<br />

1 2 BLT less 3<br />

1 2 SUB r1, r1, r0 1<br />

1 2 B gcd 3<br />

1 1 CMP r0, r1 1<br />

1 1 BEQ end 3<br />

表 2-2 仅 使 用 条 件 跳 转<br />

总 计 = 13<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-25


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

表 2-3 所 有 指 令 为 条 件 执 行<br />

r0: a r1: b 指 令 周 期 数 (<strong>ARM</strong>7)<br />

1 2 CMP r0, r1 1<br />

1 2 SUBGT r0,r0,r1 1 ( 未 执 行 )<br />

1 1 SUBLT r1,r1,r0 1<br />

1 1 BNE gcd 3<br />

1 1 CMP r0,r1 1<br />

1 1 SUBGT r0,r0,r1 1 ( 未 执 行 )<br />

1 1 SUBLT r1,r1,r0 1 ( 未 执 行 )<br />

1 1 BNE gcd 1 ( 未 执 行 )<br />

总 计 = 10<br />

转 换 为 Thumb<br />

由 于 B 是 可 有 条 件 执 行 的 唯 一 Thumb 指 令 , 必 须 用 Thumb 代 码 的 条 件 跳 转 来 编<br />

写 gcd 算 法 。<br />

与 <strong>ARM</strong> 代 码 的 条 件 跳 转 实 现 方 法 类 似 ,Thumb 代 码 需 要 七 条 指 令 。 但 是 , 与 较<br />

小 的 <strong>ARM</strong> 代 码 实 现 的 16 字 节 相 比 , 整 个 代 码 大 小 是 14 字 节 , 因 为 Thumb 指<br />

令 只 是 16 位 长 。<br />

此 外 , 在 使 用 16 位 存 储 器 的 系 统 中 , Thumb 版 本 比 第 二 种 <strong>ARM</strong> 实 现 方 法 运 行<br />

得 更 快 , 因 为 每 个 Thumb 指 令 只 需 要 访 问 一 次 存 储 器 , 而 每 个 <strong>ARM</strong> 指 令 需 要<br />

两 次 存 取 。<br />

跳 转 预 测 和 高 速 缓 存<br />

为 了 优 化 代 码 的 执 行 速 度 , 需 要 有 相 关 指 令 计 时 、 跳 转 预 测 逻 辑 以 及 目 标 系 统 的<br />

缓 存 性 能 的 详 细 知 识 。 有 关 详 细 的 信 息 , 请 参 阅 <strong>ARM</strong> 体 系 结 构 参 考 手 册 和 各 种<br />

处 理 器 的 技 术 参 考 手 册 。<br />

2-26 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.6 将 常 数 装 载 到 寄 存 器 中<br />

不 执 行 从 存 储 器 的 数 据 装 载 操 作 , 就 不 能 用 单 个 指 令 来 将 任 一 个 32 位 立 即 数 装<br />

载 到 寄 存 器 中 。 这 是 因 为 <strong>ARM</strong> 指 令 仅 是 32 位 长 度 。<br />

Thumb 指 令 也 有 类 似 的 限 制 。<br />

可 以 用 一 次 数 据 装 载 来 将 任 何 32 位 值 装 入 寄 存 器 中 , 但 是 有 更 直 接 、 更 有 效 的<br />

方 式 来 装 载 很 多 常 用 的 常 数 。 也 可 以 在 数 据 处 理 指 令 内 , 直 接 将 很 多 常 用 的 常 数<br />

包 含 为 操 作 数 , 而 根 本 不 需 要 单 独 的 装 载 操 作 。<br />

以 下 各 节 介 绍 :<br />

• 如 何 使 用 MOV 和 MVN 指 令 来 装 载 一 个 直 接 值 的 范 围 , 请 参 阅 第 2-28 页 的 用<br />

MOV 和 MVN 直 接 装 载 ;<br />

• 如 何 使 用 LDR 伪 指 令 装 载 任 何 32 位 常 数 , 请 参 阅 第 2-29 页 的 使 用 LDR Rd,<br />

=const 装 载 ;<br />

• 如 何 装 载 浮 点 常 数 , 请 参 阅 第 2-31 页 的 装 载 浮 点 常 数 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-27


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.6.1 用 MOV 和 MVN 直 接 装 载<br />

在 <strong>ARM</strong> 状 态 下 , 可 以 使 用 MOV 和 MVN 指 令 来 将 一 定 范 围 内 的 8 位 常 数 直 接 装 载<br />

到 寄 存 器 中 :<br />

• 通 过 指 定 0x0-0xFF (0-255) 的 范 围 , MOV 可 装 载 任 何 八 位 常 数 值 ;<br />

• 它 也 可 以 将 这 些 值 循 环 移 位 任 一 偶 数 位 。 表 2-4 说 明 了 这 种 操 作 所 提 供 的<br />

值 范 围 ;<br />

• MVN 可 装 载 这 些 值 的 按 位 补 码 。 数 字 值 是 -(n+1), 其 中 n 是 表 2-4 中 给 出<br />

的 值 。<br />

您 不 必 计 算 必 要 的 循 环 。 汇 编 程 序 会 执 行 这 些 计 算 。<br />

您 不 需 决 定 是 使 用 MOV 还 是 MVN。 汇 编 程 序 会 使 用 适 当 的 指 令 。 如 果 值 是 一 个 汇<br />

编 时 变 量 , 则 这 是 很 有 用 的 。<br />

如 果 您 编 写 的 指 令 中 含 有 一 个 无 法 构 造 的 常 数 , 汇 编 程 序 将 报 告 错 误 :<br />

Immediate n out of range for this operation.<br />

在 数 据 处 理 操 作 中 , 表 2-4 中 所 示 的 值 的 范 围 也 可 被 用 作 一 个 操 作 数 。 不 能 使 用<br />

它 们 的 按 位 补 码 作 为 操 作 数 , 并 且 在 乘 法 运 算 中 不 能 使 用 它 们 作 为 操 作 数 。<br />

表 2-4 <strong>ARM</strong> 状 态 的 立 即 数<br />

循 环 二 进 制 十 进 制 步 长 十 六 进 制<br />

无 循 环 000000000000000000000000xxxxxxxx 0-255 1 0-0xFF<br />

向 右 , 30 位 0000000000000000000000xxxxxxxx00 0-1020 4 0-0x3FC<br />

向 右 , 28 位 00000000000000000000xxxxxxxx0000 0-4080 16 0-0xFF0<br />

向 右 , 26 位 000000000000000000xxxxxxxx000000 0-16320 64 0-0x3FC0<br />

... ... ... ...<br />

向 右 , 8 位 xxxxxxxx000000000000000000000000 0-255 x 2 24 224 0-0xFF000000<br />

向 右 , 6 位 xxxxxx000000000000000000000000xx - - -<br />

向 右 , 4 位 xxxx000000000000000000000000xxxx - - -<br />

向 右 , 2 位 xx000000000000000000000000xxxxxx - - -<br />

2-28 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

在 Thumb 状 态 下 用 MOV 直 接 装 载<br />

在 Thumb 状 态 下 , 可 以 使 用 MOV 指 令 来 直 接 装 载 0-255 范 围 内 的 常 数 。 不 能 产 生<br />

此 范 围 外 的 常 数 , 因 为 :<br />

• Thumb MOV 指 令 不 提 供 对 滚 筒 式 移 位 器 的 内 联 访 问 。 不 能 像 在 <strong>ARM</strong> 状 态<br />

中 一 样 将 常 数 向 右 循 环 移 位 ;<br />

• Thumb MVN 指 令 只 能 操 作 寄 存 器 而 不 能 操 作 常 数 值 。 不 能 像 在 <strong>ARM</strong> 状 态<br />

中 一 样 直 接 装 载 按 位 补 码 。<br />

如 果 试 图 使 用 带 有 0-255 范 围 外 的 值 的 MOV 指 令 , 汇 编 程 序 会 报 告 错 误 :<br />

Immediate n out of range for this operation.<br />

2.6.2 使 用 LDR Rd, =const 装 载<br />

LDR Rd,=const 伪 指 令 可 以 在 单 个 指 令 中 构 造 任 何 32 位 数 字 常 数 。 使 用 此 伪 指 令<br />

可 产 生 超 出 MOV 和 MVN 指 令 范 围 的 常 数 。<br />

LDR 伪 指 令 为 特 定 的 常 数 产 生 最 高 效 的 代 码 :<br />

• 如 果 可 以 用 MOV 或 MVN 指 令 来 构 造 该 常 数 , 则 汇 编 程 序 会 生 成 适 当 的 指 令 。<br />

• 如 果 不 能 用 MOV 或 MVN 指 令 来 构 造 该 常 数 , 那 么 汇 编 程 序 将 会 :<br />

— 把 该 值 放 入 一 个 文 字 池 ( 嵌 入 在 代 码 中 的 一 部 分 存 储 器 , 用 于 存 放<br />

常 数 值 )。<br />

— 产 生 使 用 相 对 程 序 地 址 的 一 条 LDR 指 令 , 用 于 从 文 字 池 读 取 该 常 数 。<br />

例 如 :<br />

LDR rn, [pc, #offset to literal pool]<br />

; load register n with one word<br />

; from the address [pc + offset]<br />

必 须 保 证 在 由 汇 编 程 序 产 生 的 LDR 指 令 的 范 围 内 , 有 一 个 文 字 池 存 在 。 有<br />

关 详 细 信 息 请 参 阅 第 2-30 页 的 放 置 文 字 池 。<br />

有 关 LDR 伪 指 令 的 语 法 的 详 细 描 述 , 请 参 阅 第 4-126 页 的 LDR <strong>ARM</strong> 伪 指 令 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-29


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

放 置 文 字 池<br />

汇 编 程 序 将 文 字 池 放 在 每 个 段 的 末 尾 。 它 们 是 由 后 面 的 段 开 始 处 的 AREA 命 令 定<br />

义 的 , 或 者 由 汇 编 代 码 末 尾 的 END 命 令 加 以 定 义 。 一 个 包 含 文 件 末 尾 的 END 命 令<br />

并 不 表 示 一 个 段 的 结 束 。<br />

在 大 型 段 中 , 默 认 的 文 字 池 可 能 会 超 出 一 个 或 多 个 LDR 指 令 的 范 围 。 从 程 序 计 数<br />

器 到 该 常 数 的 偏 移 量 必 须 是 :<br />

• 在 <strong>ARM</strong> 状 态 中 小 于 4KB, 但 可 以 沿 每 个 方 向 ;<br />

• 在 Thumb 状 态 中 小 于 1KB 并 且 向 前 。<br />

当 LDR Rd,=const 伪 指 令 要 求 将 常 数 放 入 文 字 池 中 时 , 汇 编 程 序 将 :<br />

• 检 查 前 面 的 任 何 文 字 池 是 否 可 用 。 如 果 是 , 则 用 前 面 的 文 字 池 来 寻 址 这 个<br />

常 数 。<br />

• 如 果 前 面 的 文 字 池 已 经 不 可 用 , 则 尝 试 将 该 常 数 放 入 下 一 个 文 字 池 中 。<br />

如 果 下 一 个 文 字 池 超 出 范 围 , 汇 编 程 序 将 产 生 一 条 出 错 信 息 。 在 这 种 情 况 下 , 必<br />

须 使 用 LTORG 命 令 来 在 代 码 中 放 置 一 个 附 加 的 文 字 池 。 将 LTORG 命 令 放 在 失 败 LDR<br />

伪 指 令 后 , 并 且 在 4KB (<strong>ARM</strong>) 或 1KB (Thumb) 范 围 内 。 详 细 描 述 请 参 阅 第 7-14<br />

页 的 LTORG。<br />

必 须 把 文 字 池 放 在 处 理 器 不 会 试 图 将 其 当 作 指 令 来 执 行 的 位 置 上 。 将 其 放 在 无<br />

条 件 跳 转 指 令 后 , 或 放 在 一 个 子 程 序 末 尾 的 返 回 指 令 之 后 。<br />

示 例 2-5 给 出 了 一 个 工 作 实 例 。 该 实 例 的 代 码 在 RVCT 的 examples\asm 子 目 录 下<br />

的 loadcon.s 文 件 中 。 作 为 注 释 列 出 的 指 令 是 由 汇 编 程 序 生 成 的 <strong>ARM</strong> 指 令 。 有<br />

关 如 何 汇 编 、 链 接 和 执 行 该 示 例 的 操 作 说 明 , 请 参 阅 第 2-2 页 的 代 码 示 例 。<br />

示 例 2-5<br />

AREA Loadcon, CODE, READONLY<br />

ENTRY<br />

; Mark first instruction to execute<br />

start BL func1 ; Branch to first subroutine<br />

BL func2 ; Branch to second subroutine<br />

stop MOV r0, #0x18 ; angel_SWIreason_ReportException<br />

LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit<br />

SWI 0x123456 ; <strong>ARM</strong> semihosting SWI<br />

func1<br />

LDR r0, =42 ; => MOV R0, #42<br />

LDR r1, =0x55555555 ; => LDR R1, [PC, #offset to<br />

; Literal Pool 1]<br />

LDR r2, =0xFFFFFFFF ; => MVN R2, #0<br />

MOV pc, lr<br />

LTORG<br />

; Literal Pool 1 contains<br />

2-30 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

; literal Ox55555555<br />

func2<br />

LDR r3, =0x55555555 ; => LDR R3, [PC, #offset to<br />

; Literal Pool 1]<br />

; LDR r4, =0x66666666 ; If this is uncommented it<br />

; fails, because Literal Pool 2<br />

; is out of reach<br />

MOV pc, lr<br />

LargeTable<br />

SPACE 4200 ; Starting at the current location,<br />

; clears a 4200 byte area of memory<br />

; to zero<br />

END<br />

; Literal Pool 2 is empty<br />

2.6.3 装 载 浮 点 常 数<br />

利 用 FLD 伪 指 令 , 可 以 在 单 个 指 令 中 装 载 任 何 单 精 度 或 双 精 度 浮 点 常 数 。<br />

详 细 信 息 请 参 阅 第 6-36 页 的 FLD 伪 指 令 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-31


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.7 将 地 址 装 载 到 寄 存 器 中<br />

经 常 需 要 将 一 个 地 址 装 载 到 一 个 寄 存 器 中 。 可 能 需 要 装 载 变 量 、 字 符 串 常 数 或 跳<br />

转 表 开 始 位 置 的 地 址 。<br />

地 址 通 常 表 示 为 从 当 前 程 序 计 数 器 或 其 它 寄 存 器 开 始 的 偏 移 量 。<br />

这 一 节 介 绍 将 地 址 装 载 到 寄 存 器 中 的 下 列 方 法 :<br />

• 直 接 装 载 寄 存 器 , 请 参 阅 用 ADR 和 ADRL 直 接 装 载 ;<br />

• 从 一 个 文 字 池 装 载 地 址 , 请 参 阅 第 2-37 页 的 用 LDR Rd, = label 装 载 地 址 。<br />

2.7.1 用 ADR 和 ADRL 直 接 装 载<br />

ADR 和 ADRL 伪 指 令 可 以 生 成 某 个 确 定 范 围 内 的 地 址 , 而 无 需 执 行 数 据 装 载 操 作 。<br />

ADR 和 ADRL 接 受 以 下 两 种 值 之 一 :<br />

• 一 个 相 对 于 程 序 的 表 达 式 , 这 是 带 有 可 选 偏 移 量 的 一 个 标 号 , 其 中 标 号 地<br />

址 是 相 对 于 当 前 程 序 计 数 器 的 ;<br />

• 一 个 相 对 于 寄 存 器 的 表 达 式 , 这 是 带 有 可 选 偏 移 量 的 一 个 标 号 , 其 中 标 号<br />

地 址 是 相 对 于 存 放 在 指 定 的 通 用 寄 存 器 中 的 地 址 的 。 有 关 指 定 相 对 寄 存 器<br />

表 达 式 的 信 息 , 请 参 阅 第 2-53 页 的 用 MAP 和 FIELD 命 令 描 述 数 据 结 构 。<br />

通 过 生 成 以 下 指 令 或 消 息 , 汇 编 程 序 转 换 一 条 ADR rn,label 伪 指 令 :<br />

• 如 果 地 址 在 范 围 内 , 则 生 成 装 载 该 地 址 的 单 个 ADD 或 SUB 指 令 ;<br />

• 如 果 不 能 在 单 个 指 令 中 访 问 到 该 地 址 , 则 生 成 一 条 出 错 消 息 。<br />

对 于 相 对 非 字 对 齐 地 址 的 偏 移 , 偏 移 量 范 围 是 ±255 字 节 ; 对 于 相 对 字 对 齐 地 址<br />

的 偏 移 , 偏 移 量 范 围 是 ±1020 字 节 (255 字 )。( 对 于 Thumb 状 态 , 地 址 必 须 是<br />

字 对 齐 的 , 并 且 偏 移 量 必 须 是 正 值 。)<br />

通 过 生 成 以 下 指 令 或 消 息 , 汇 编 程 序 转 换 一 条 ADRL rn,label 伪 指 令 :<br />

• 如 果 地 址 在 范 围 内 , 则 生 成 两 个 装 载 地 址 的 数 据 处 理 指 令 ;<br />

• 如 果 不 能 在 两 个 指 令 中 构 造 该 地 址 , 则 生 成 一 条 出 错 消 息 。<br />

对 于 非 字 对 齐 地 址 , ADRL 伪 指 令 的 范 围 是 ±64KB ; 对 于 字 对 齐 地 址 , 其 范 围 是<br />

±256KB。( 没 有 用 于 Thumb 状 态 的 ADRL 伪 指 令 。)<br />

如 果 成 功 的 话 , ADRL 汇 编 为 两 条 指 令 。 即 使 可 以 在 单 条 指 令 中 装 载 该 地 址 , 汇<br />

编 程 序 也 产 生 两 条 指 令 。<br />

有 关 装 载 超 出 ADRL 伪 指 令 范 围 的 地 址 的 信 息 , 请 参 阅 第 2-37 页 的 用 LDR Rd, =<br />

label 装 载 地 址 。<br />

2-32 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

备 注<br />

用 于 ADR 或 ADRL 的 标 号 必 须 位 于 相 同 的 代 码 段 内 。 对 于 在 相 同 段 中 对 超 出 范 围 的<br />

标 号 的 引 用 , 汇 编 程 序 将 做 出 错 处 理 。 对 于 在 其 它 代 码 段 中 对 超 出 范 围 的 标 号 的<br />

引 用 , 链 接 程 序 将 做 出 错 处 理 。<br />

在 Thumb 状 态 下 , ADR 只 能 产 生 字 对 齐 的 地 址 。<br />

ADRL 不 能 用 于 Thumb 代 码 。 只 能 在 <strong>ARM</strong> 代 码 内 使 用 它 。<br />

示 例 2-6 说 明 了 在 汇 编 ADR 和 ADRL 伪 指 令 时 , 由 汇 编 程 序 产 生 的 代 码 类 型 。 该 实<br />

例 的 代 码 在 RVCT 的 examples\asm 子 目 录 下 的 adrlabel.s 文 件 中 。 有 关 如 何 汇<br />

编 、 链 接 和 执 行 该 实 例 的 操 作 说 明 , 请 参 阅 第 2-2 页 的 代 码 示 例 。<br />

注 释 中 列 出 的 指 令 是 由 汇 编 程 序 生 成 的 <strong>ARM</strong> 指 令 。<br />

示 例 2-6<br />

AREA adrlabel, CODE,READONLY<br />

ENTRY<br />

; Mark first instruction to execute<br />

Start<br />

BL func ; Branch to subroutine<br />

stop MOV r0, #0x18 ; angel_SWIreason_ReportException<br />

LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit<br />

SWI 0x123456 ; <strong>ARM</strong> semihosting SWI<br />

LTORG<br />

; Create a literal pool<br />

func ADR r0, Start ; => SUB r0, PC, #offset to Start<br />

ADR r1, DataArea ; => ADD r1, PC, #offset to DataArea<br />

; ADR r2, DataArea+4300 ; This would fail because the offset<br />

; cannot be expressed by operand2<br />

; of an ADD<br />

ADRL r2, DataArea+4300 ; => ADD r2, PC, #offset1<br />

; ADD r2, r2, #offset2<br />

MOV pc, lr ; Return<br />

DataArea SPACE 8000 ; Starting at the current location,<br />

; clears a 8000 byte area of memory<br />

; to zero<br />

END<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-33


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

用 ADR 实 现 跳 转 表<br />

第 2-35 页 的 示 例 2-7 给 出 了 实 现 跳 转 表 的 <strong>ARM</strong> 代 码 。 该 实 例 的 代 码 在 RVCT 的<br />

examples\asm 子 目 录 的 jump.s 文 件 中 。 有 关 如 何 汇 编 、 链 接 和 执 行 该 实 例 的 操 作<br />

说 明 , 请 参 阅 第 2-2 页 的 代 码 示 例 。<br />

ADR 伪 指 令 装 载 跳 转 表 的 地 址 。<br />

在 此 例 中 , 函 数 arithfunc 获 取 三 个 自 变 量 , 并 将 结 果 返 回 r0。 第 一 个 自 变 量 确<br />

定 对 第 二 和 第 三 个 自 变 量 执 行 哪 种 操 作 :<br />

自 变 量 1 = 0 结 果 = 自 变 量 2 + 自 变 量 3。<br />

自 变 量 1 = 1 结 果 = 自 变 量 2 – 自 变 量 3。<br />

跳 转 表 用 下 列 指 令 和 汇 编 程 序 命 令 来 实 现 :<br />

EQU<br />

DCD<br />

是 一 个 汇 编 程 序 命 令 。 它 用 于 为 一 个 符 号 赋 值 。 在 此 例 中 , 其 将<br />

值 2 赋 予 num。 当 在 代 码 中 其 它 位 置 使 用 num 时 , 将 用 值 2 替 代<br />

它 。 以 这 种 方 式 使 用 EQU 时 , 类 似 于 在 C 语 言 中 使 用 #define 定 义<br />

一 个 常 数 。<br />

声 明 一 个 或 多 个 存 储 器 字 。 在 此 例 中 , 每 个 DCD 存 储 一 个 程 序 的 地<br />

址 , 该 程 序 处 理 跳 转 表 的 一 个 特 定 子 句 。<br />

LDR LDR pc,[r3,r0,LSL#2] 指 令 将 跳 转 表 的 所 需 子 句 的 地 址 装 载 到 pc 中 。<br />

该 指 令 :<br />

• 将 r0 中 的 子 句 数 值 乘 以 4 以 给 出 一 个 字 偏 移 ;<br />

• 将 结 果 加 到 跳 转 表 的 地 址 上 ;<br />

• 将 组 合 地 址 的 内 容 装 载 到 程 序 计 数 器 中 。<br />

2-34 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

示 例 2-7 <strong>ARM</strong> 代 码 跳 转 表<br />

AREA Jump, CODE, READONLY ; Name this block of code<br />

CODE32<br />

; Following code is <strong>ARM</strong> code<br />

num EQU 2 ; Number of entries in jump table<br />

ENTRY<br />

; Mark first instruction to execute<br />

start<br />

; First instruction to call<br />

MOV r0, #0 ; Set up the three parameters<br />

MOV r1, #3<br />

MOV r2, #2<br />

BL arithfunc ; Call the function<br />

stop MOV r0, #0x18 ; angel_SWIreason_ReportException<br />

LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit<br />

SWI 0x123456 ; <strong>ARM</strong> semihosting SWI<br />

arithfunc<br />

; Label the function<br />

CMP r0, #num ; Treat function code as unsigned integer<br />

MOVHS pc, lr ; If code is >= num then simply return<br />

ADR r3, JumpTable ; Load address of jump table<br />

LDR pc, [r3,r0,LSL#2] ; Jump to the appropriate routine<br />

JumpTable<br />

DCD DoAdd<br />

DCD DoSub<br />

DoAdd ADD r0, r1, r2 ; Operation 0<br />

MOV pc, lr ; Return<br />

DoSub SUB r0, r1, r2 ; Operation 1<br />

MOV pc, lr ; Return<br />

END<br />

; Mark the end of this file<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-35


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

转 换 为 Thumb<br />

示 例 2-8 说 明 了 转 换 为 Thumb 代 码 的 跳 转 表 的 实 现 。<br />

大 多 数 Thumb 代 码 版 本 与 <strong>ARM</strong> 代 码 相 同 。 两 者 的 差 别 在 Thumb 版 本 中 做 出 了<br />

注 释 。<br />

在 Thumb 状 态 中 , 不 能 :<br />

• 在 LDR 和 STR 指 令 中 增 加 基 址 寄 存 器 ;<br />

• 使 用 LDR 指 令 将 一 个 值 装 载 到 pc 中 ;<br />

• 对 寄 存 器 中 存 放 的 值 执 行 内 联 移 位 。<br />

示 例 2-8 Thumb 代 码 跳 转 表<br />

AREA Jump, CODE, READONLY<br />

CODE16<br />

; Following code is Thumb code<br />

num EQU 2<br />

ENTRY<br />

start<br />

MOV r0, #0<br />

MOV r1, #3<br />

MOV r2, #2<br />

BL arithfunc<br />

stop MOV r0, #0x18<br />

LDR r1, =0x20026<br />

SWI 0xAB ; Thumb semihosting SWI<br />

arithfunc<br />

CMP r0, #num<br />

BHS exit ; MOV pc, lr cannot be conditional<br />

ADR r3, JumpTable<br />

LSL r0, r0, #2 ; 3 instructions needed to replace<br />

LDR r0, [r3,r0] ; LDR pc, [r3,r0,LSL#2]<br />

MOV pc, r0<br />

ALIGN<br />

; Ensure that the table is aligned on a<br />

; 4-byte boundary<br />

JumpTable<br />

DCD DoAdd<br />

DCD DoSub<br />

DoAdd ADD r0, r1, r2<br />

exit MOV pc, lr<br />

DoSub SUB r0, r1, r2<br />

MOV pc, lr<br />

END<br />

2-36 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.7.2 用 LDR Rd, = label 装 载 地 址<br />

LDR Rd,= 伪 指 令 可 以 将 任 何 32 位 常 数 装 载 到 寄 存 器 中 。 请 参 阅 第 2-29 页 的 使<br />

用 LDR Rd, =const 装 载 。 它 也 接 受 相 对 程 序 的 表 达 式 , 例 如 标 号 , 以 及 带 偏 移<br />

的 标 号 。<br />

汇 编 程 序 通 过 完 成 下 列 操 作 来 转 换 一 条 LDR r0,=label 伪 指 令 :<br />

• 把 label 的 地 址 放 入 一 个 文 字 池 ( 嵌 入 在 代 码 中 的 一 部 分 存 储 器 , 用 于 存<br />

放 常 数 值 )。<br />

• 产 生 相 对 程 序 的 LDR 指 令 , 来 从 文 字 池 读 取 该 地 址 , 例 如 :<br />

LDR<br />

rn [pc, #offset to literal pool]<br />

; load register n with one word<br />

; from the address [pc + offset]<br />

必 须 要 确 保 范 围 内 有 一 个 文 字 池 。 有 关 详 细 信 息 请 参 阅 第 2-30 页 的 放 置 文<br />

字 池 。<br />

与 ADR 和 ADRL 伪 指 令 不 同 的 是 ,LDR 可 以 使 用 当 前 段 之 外 的 标 号 。 如 果 标 号 在 当<br />

前 段 之 外 , 那 么 当 汇 编 源 文 件 时 , 汇 编 程 序 在 目 标 代 码 中 放 置 一 个 重 定 位 命 令 。<br />

重 定 位 命 令 指 示 链 接 程 序 在 链 接 时 确 定 地 址 。 无 论 链 接 程 序 将 包 含 LDR 和 文 字 池<br />

的 段 放 在 何 处 , 该 地 址 都 保 持 有 效 。<br />

示 例 2-9 说 明 了 这 一 实 现 过 程 。 该 示 例 的 代 码 在 RVCT 的 examples\asm 子 目 录 的<br />

ldrlabel.s 文 件 中 。 有 关 如 何 汇 编 、 链 接 和 执 行 该 示 例 的 操 作 说 明 , 请 参 阅 第 2-2<br />

页 的 代 码 示 例 。<br />

注 释 中 列 出 的 指 令 是 由 汇 编 程 序 生 成 的 <strong>ARM</strong> 指 令 。<br />

示 例 2-9<br />

AREA LDRlabel, CODE,READONLY<br />

ENTRY<br />

; Mark first instruction to execute<br />

start<br />

BL func1 ; Branch to first subroutine<br />

BL func2 ; Branch to second subroutine<br />

stop MOV r0, #0x18 ; angel_SWIreason_ReportException<br />

LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit<br />

SWI 0x123456 ; <strong>ARM</strong> semihosting SWI<br />

func1<br />

LDR r0, =start ; => LDR R0,[PC, #offset into<br />

; Literal Pool 1]<br />

LDR r1, =Darea + 12 ; => LDR R1,[PC, #offset into<br />

; Literal Pool 1]<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-37


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

LDR r2, =Darea + 6000 ; => LDR R2, [PC, #offset into<br />

; Literal Pool 1]<br />

MOV pc,lr ; Return<br />

LTORG ; Literal Pool 1<br />

func2<br />

LDR r3, =Darea + 6000 ; => LDR r3, [PC, #offset into<br />

; Literal Pool 1]<br />

; (sharing with previous literal)<br />

; LDR r4, =Darea + 6004 ; If uncommented produces an error<br />

; as Literal Pool 2 is out of range<br />

MOV pc, lr ; Return<br />

Darea SPACE 8000 ; Starting at the current location,<br />

; clears a 8000 byte area of memory<br />

; to zero<br />

END<br />

; Literal Pool 2 is out of range of<br />

; the LDR instructions above<br />

2-38 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

一 个 LDR Rd, =label 示 例 : 字 符 串 复 制<br />

示 例 2-10 说 明 用 一 个 字 符 串 覆 盖 另 一 个 字 符 串 的 <strong>ARM</strong> 代 码 例 程 。 其 使 用 LDR 伪<br />

指 令 来 从 一 个 数 据 段 中 装 载 两 个 字 符 串 的 地 址 。 以 下 内 容 需 要 特 别 注 意 :<br />

DCB<br />

DCB 命 令 定 义 一 个 或 多 个 存 储 器 字 节 。 除 整 数 值 外 ,DCB 也 可 接 受 引<br />

号 内 的 字 符 串 。 字 符 串 内 的 每 个 字 符 存 放 在 连 续 的 字 节 中 。 有 关 详<br />

细 信 息 请 参 阅 第 7-18 页 的 DCB。<br />

LDR/STR LDR 和 STR 指 令 使 用 后 索 引 寻 址 来 更 新 其 地 址 寄 存 器 。 例 如 , 指 令 :<br />

LDRB r2,[r1],#1<br />

用 r1 所 指 地 址 的 内 容 装 载 r2, 然 后 将 r1 增 加 1。<br />

示 例 2-10 字 符 串 复 制<br />

AREA StrCopy, CODE, READONLY<br />

ENTRY<br />

; Mark first instruction to execute<br />

start LDR r1, =srcstr ; Pointer to first string<br />

LDR r0, =dststr ; Pointer to second string<br />

BL strcopy ; Call subroutine to do copy<br />

stop MOV r0, #0x18 ; angel_SWIreason_ReportException<br />

LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit<br />

SWI 0x123456 ; <strong>ARM</strong> semihosting SWI<br />

strcopy<br />

LDRB r2, [r1],#1 ; Load byte and update address<br />

STRB r2, [r0],#1 ; Store byte and update address<br />

CMP r2, #0 ; Check for zero terminator<br />

BNE strcopy ; Keep going if not<br />

MOV pc,lr ; Return<br />

AREA<br />

srcstr DCB<br />

dststr DCB<br />

END<br />

Strings, DATA, READWRITE<br />

"First string - source",0<br />

"Second string - destination",0<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-39


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

转 换 为 Thumb<br />

对 于 Thumb LDR 和 STR 指 令 , 不 存 在 后 索 引 寻 址 模 式 。 因 此 , 在 LDR 和 STR 指 令<br />

之 后 , 必 须 使 用 一 个 ADD 指 令 来 增 加 地 址 寄 存 器 。 例 如 :<br />

LDRB r2, [r1] ; load register 2<br />

ADD r1, #1 ; increment the address in<br />

; register 1.<br />

2-40 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.8 装 载 和 存 储 多 个 寄 存 器 指 令<br />

<strong>ARM</strong> 和 Thumb 指 令 集 包 含 的 指 令 用 来 从 存 储 器 装 载 到 多 个 寄 存 器 和 将 寄 存 器<br />

内 容 存 储 到 存 储 器 。<br />

多 个 寄 存 器 传 送 指 令 提 供 了 一 种 高 效 的 方 法 , 来 将 几 个 寄 存 器 的 内 容 移 动 到 存<br />

储 器 , 以 及 从 存 储 器 将 内 容 移 动 到 寄 存 器 。 它 们 最 常 用 于 块 复 制 以 及 用 于 在 子 程<br />

序 入 口 点 和 退 出 点 的 栈 操 作 。 使 用 多 个 寄 存 器 传 送 指 令 来 代 替 一 系 列 单 个 数 据<br />

传 送 指 令 的 优 点 包 括 :<br />

• 代 码 更 小 。<br />

• 一 次 指 令 存 取 开 销 , 而 不 是 多 次 指 令 存 取 开 销 。<br />

• 在 不 带 高 速 缓 存 的 <strong>ARM</strong> 处 理 器 上 , 由 装 载 多 个 或 存 储 多 个 指 令 传 送 的 数<br />

据 的 第 一 个 字 总 是 非 顺 序 的 存 储 器 周 期 , 但 随 后 传 送 的 所 有 字 可 以 是 顺 序<br />

的 存 储 器 周 期 。 在 大 多 数 系 统 中 , 顺 序 存 储 器 周 期 更 快 一 些 。<br />

备 注<br />

最 低 编 号 的 寄 存 器 被 传 送 到 或 传 送 自 所 访 问 的 最 低 存 储 器 地 址 , 最 高 编 号 的 寄<br />

存 器 被 传 送 到 或 传 送 自 所 访 问 的 最 高 存 储 器 地 址 。 指 令 的 寄 存 器 列 表 中 的 寄 存<br />

器 顺 序 没 有 影 响 。<br />

使 用 -checkreglist 汇 编 程 序 命 令 行 选 项 , 来 确 保 寄 存 器 列 表 中 的 寄 存 器 是 按 递<br />

增 顺 序 提 供 的 。 有 关 详 细 信 息 请 参 阅 第 3-2 页 的 命 令 语 法 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-41


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.8.1 <strong>ARM</strong> LDM 和 STM 指 令<br />

装 载 多 个 ( 或 存 储 多 个 ) 指 令 将 16 个 通 用 寄 存 器 的 任 意 子 集 , 用 单 条 指 令 从 存<br />

储 器 中 装 载 或 存 储 到 存 储 器 中 。<br />

语 法<br />

LDM 指 令 的 语 法 是 :<br />

LDM{cond}address-mode Rn{!},reg-list{^}<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 。 有 关 详 细 信 息 请 参 阅 第 2-22 页 的 条 件 执 行 。<br />

address-mode<br />

Rn<br />

指 定 该 指 令 的 寻 址 模 式 。 详 细 信 息 请 参 阅 第 2-43 页 的 LDM 和 STM<br />

寻 址 模 式 。<br />

是 装 载 操 作 的 基 址 寄 存 器 。 该 寄 存 器 中 存 储 的 地 址 是 装 载 操 作 的 起<br />

始 地 址 。 不 要 指 定 r15 (pc) 作 为 基 址 寄 存 器 。<br />

! 指 定 基 址 寄 存 器 回 写 。 如 果 指 定 了 该 项 , 则 在 传 送 后 更 新 基 址 寄<br />

存 器 中 的 地 址 。 对 于 寄 存 器 列 表 中 的 每 个 寄 存 器 , 将 减 小 或 增 加<br />

一 个 字 。<br />

register-list<br />

^<br />

是 括 在 大 括 号 内 的 、 以 逗 号 分 隔 的 符 号 化 寄 存 器 名 称 和 寄 存 器 范<br />

围 。 列 表 中 必 须 至 少 有 一 个 寄 存 器 。 寄 存 器 范 围 用 一 个 短 划 线 指<br />

定 。 例 如 :<br />

{r0,r1,r4-r6,pc}<br />

如 果 基 址 寄 存 器 Rn 位 于 register-list 中 , 则 不 能 指 定 回 写 选 项 。<br />

在 [User] 模 式 或 [System] 模 式 下 不 能 使 用 此 选 项 。 有 关 该 指 令 在 特<br />

权 模 式 下 的 使 用 方 法 的 信 息 , 请 参 阅 <strong>RealView</strong> 编 译 工 具 2.0 版 开 发<br />

人 员 指 南 中 的 处 理 处 理 器 异 常 一 章 以 及 第 4-20 页 的 LDM 和 STM。<br />

STM 指 令 的 语 法 完 全 与 LDM 指 令 相 对 应 , 只 是 ^ 选 项 的 影 响 细 节 有 点 差 异 。<br />

2-42 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

用 法<br />

请 参 阅 第 2-44 页 的 用 LDM 和 STM 实 现 栈 操 作 和 第 2-46 页 的 用 LDM 和 STM 实<br />

现 块 复 制 。<br />

2.8.2 LDM 和 STM 寻 址 模 式<br />

有 四 种 不 同 的 寻 址 模 式 。 对 于 操 作 中 的 每 个 寄 存 器 , 可 以 将 基 址 寄 存 器 增 加 或 减<br />

小 一 个 字 , 并 且 这 种 增 加 或 减 小 可 以 发 生 在 操 作 之 前 或 之 后 。 这 些 选 项 的 后 缀<br />

是 :<br />

IA 之 后 增 加 。<br />

IB 之 前 增 加 。<br />

DA 之 后 减 小 。<br />

DB 之 前 减 小 。<br />

对 于 栈 操 作 , 还 有 一 些 更 容 易 使 用 的 替 代 寻 址 模 式 后 缀 。 请 参 阅 第 2-44 页 的 用<br />

LDM 和 STM 实 现 栈 操 作 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-43


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.8.3 用 LDM 和 STM 实 现 栈 操 作<br />

装 载 多 个 和 存 储 多 个 指 令 可 以 更 新 基 址 寄 存 器 。 对 于 栈 操 作 来 说 , 基 址 寄 存 器 通<br />

常 是 栈 指 针 r13。 这 就 意 味 着 , 可 以 使 用 单 个 装 载 多 个 和 存 储 多 个 指 令 , 为 任 意<br />

数 量 的 寄 存 器 实 施 推 入 和 弹 出 操 作 。<br />

装 载 多 个 和 存 储 多 个 指 令 可 以 使 用 几 种 类 型 的 栈 :<br />

降 序 或 升 序<br />

满 的 或 空 的<br />

栈 向 下 增 长 , 从 一 个 高 地 址 开 始 并 向 更 低 地 址 ( 降 序 栈 ); 或 者<br />

向 上 增 长 , 从 一 个 低 地 址 开 始 并 向 更 高 地 址 前 进 ( 升 序 栈 )<br />

栈 指 针 可 指 向 栈 中 的 最 后 一 个 条 目 ( 满 栈 ), 或 者 指 向 栈 中 的 下 一<br />

个 可 用 空 间 ( 空 栈 )。<br />

为 便 于 程 序 员 操 作 , 可 以 使 用 面 向 栈 的 后 缀 , 来 代 替 后 缀 之 前 或 之 后 的 增 量 或 减<br />

量 。 请 参 阅 表 2-5 中 的 面 向 栈 的 后 缀 列 表 。<br />

栈 类 型 推 进 弹 出<br />

表 2-5 用 于 装 载 多 个 和 存 储 多 个 指 令 的 后 缀<br />

满 降 序 STMFD (STMDB) LDMFD (LDMIA)<br />

满 升 序 STMFA (STMIB) LDMFA (LDMDA)<br />

空 降 序 STMED (STMDA) LDMED (LDMIB)<br />

空 升 序 STMEA (STMIA) LDMEA (LDMDB)<br />

例 如 :<br />

STMFD<br />

LDMFD<br />

r13!, {r0-r5} ; Push onto a Full Descending Stack<br />

r13!, {r0-r5} ; Pop from a Full Descending Stack.<br />

备 注<br />

<strong>ARM</strong>-Thumb 程 序 调 用 标 准 (ATPCS) 以 及 <strong>ARM</strong> 和 Thumb C 与 C++ 编 译 程 序 总 是<br />

使 用 满 降 序 栈 。<br />

2-44 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

用 于 嵌 套 子 程 序 的 栈 寄 存 器<br />

在 子 程 序 入 口 点 和 退 出 点 处 , 栈 操 作 是 非 常 有 用 的 。 在 一 个 子 程 序 的 开 始 处 , 可<br />

以 把 需 要 的 任 何 工 作 寄 存 器 保 存 在 栈 上 , 在 退 出 点 处 再 将 其 弹 出 。<br />

此 外 , 如 果 在 入 口 点 处 将 链 接 寄 存 器 推 到 栈 上 , 就 可 以 安 全 地 进 行 其 它 子 程 序 调<br />

用 , 而 不 会 导 致 返 回 地 址 丢 失 。 如 果 这 样 做 , 就 可 以 通 过 在 退 出 点 处 将 pc 弹 出<br />

栈 , 来 从 一 个 子 程 序 中 返 回 , 而 不 必 先 弹 出 lr 然 后 将 该 值 移 动 到 pc 中 。 例 如 :<br />

subroutine STMFD<br />

; code<br />

BL<br />

; code<br />

LDMFD<br />

sp!, {r5-r7,lr} ; Push work registers and lr<br />

somewhere_else<br />

sp!, {r5-r7,pc} ; Pop work registers and pc<br />

备 注<br />

在 混 合 使 用 <strong>ARM</strong> 和 Thumb 的 系 统 中 要 谨 慎 使 用 这 种 方 法 。 在 <strong>ARM</strong> 体 系 结 构<br />

v4T 系 统 中 , 不 能 通 过 直 接 弹 入 到 程 序 计 数 器 中 来 改 变 状 态 。<br />

在 <strong>ARM</strong> 体 系 结 构 v5T 及 以 上 版 本 中 , 可 以 用 这 种 方 式 改 变 状 态 。<br />

有 关 混 合 使 用 <strong>ARM</strong> 和 Thumb 指 令 的 详 细 信 息 , 请 参 阅 <strong>RealView</strong> 编 译 工 具 2.0 版<br />

开 发 人 员 指 南 中 的 <strong>ARM</strong> 和 Thumb 的 互 相 连 合 使 用 一 章 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-45


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.8.4 用 LDM 和 STM 实 现 块 复 制<br />

示 例 2-11 是 一 个 <strong>ARM</strong> 代 码 程 序 , 其 通 过 一 次 复 制 单 个 字 , 来 将 一 组 字 从 源 位<br />

置 复 制 到 目 标 位 置 上 。 该 示 例 存 放 在 RVCT 的 examples\asm 子 目 录 下 的 word.s<br />

文 件 中 。 有 关 如 何 汇 编 、 链 接 和 执 行 该 示 例 的 操 作 说 明 , 请 参 阅 第 2-2 页 的 代<br />

码 示 例 。<br />

示 例 2-11 块 复 制<br />

AREA Word, CODE, READONLY ; name this block of code<br />

num EQU 20 ; set number of words to be copied<br />

ENTRY<br />

; mark the first instruction to call<br />

start<br />

LDR r0, =src ; r0 = pointer to source block<br />

LDR r1, =dst ; r1 = pointer to destination block<br />

MOV r2, #num ; r2 = number of words to copy<br />

wordcopy LDR r3, [r0], #4 ; load a word from the source and<br />

STR r3, [r1], #4 ; store it to the destination<br />

SUBS r2, r2, #1 ; decrement the counter<br />

BNE wordcopy ; ... copy more<br />

stop MOV r0, #0x18 ; angel_SWIreason_ReportException<br />

LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit<br />

SWI 0x123456 ; <strong>ARM</strong> semihosting SWI<br />

AREA BlockData, DATA, READWRITE<br />

src DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4<br />

dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0<br />

END<br />

通 过 使 用 LDM 和 STM 来 尽 可 能 多 的 复 制 , 可 以 使 这 个 模 块 的 效 率 更 高 。 在 已 知<br />

<strong>ARM</strong> 拥 有 的 寄 存 器 数 目 后 , 一 次 传 送 8 个 字 最 合 理 。 利 用 下 列 指 令 , 可 以 找 出<br />

要 复 制 的 块 所 包 含 的 8 个 字 的 倍 数 ( 如 果 r2 = 要 复 制 的 字 数 ):<br />

MOVS r3, r2, LSR #3 ; number of eight word multiples<br />

此 值 可 用 于 控 制 通 过 循 环 的 重 复 次 数 , 循 环 中 的 每 次 操 作 拷 贝 八 个 字 。 当 只 剩 下<br />

不 足 八 个 字 时 , 可 以 用 以 下 指 令 找 出 剩 余 的 字 数 ( 假 定 r2 还 未 被 破 坏 ):<br />

ANDS r2, r2, #7<br />

第 2-47 页 的 示 例 2-12 列 出 了 重 新 编 写 的 使 用 LDM 和 STM 进 行 复 制 的 块 复 制 模 块 。<br />

2-46 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

示 例 2-12<br />

AREA Block, CODE, READONLY ; name this block of code<br />

num EQU 20 ; set number of words to be copied<br />

ENTRY<br />

; mark the first instruction to call<br />

start<br />

LDR r0, =src ; r0 = pointer to source block<br />

LDR r1, =dst ; r1 = pointer to destination block<br />

MOV r2, #num ; r2 = number of words to copy<br />

MOV sp, #0x400 ; Set up stack pointer (r13)<br />

blockcopy MOVS r3,r2, LSR #3 ; Number of eight word multiples<br />

BEQ copywords ; Less than eight words to move?<br />

STMFD sp!, {r4-r11} ; Save some working registers<br />

octcopy LDMIA r0!, {r4-r11} ; Load 8 words from the source<br />

STMIA r1!, {r4-r11} ; and put them at the destination<br />

SUBS r3, r3, #1 ; Decrement the counter<br />

BNE octcopy ; ... copy more<br />

LDMFD sp!, {r4-r11} ; Don't need these now - restore<br />

; originals<br />

copywords ANDS r2, r2, #7 ; Number of odd words to copy<br />

BEQ stop ; No words left to copy?<br />

wordcopy LDR r3, [r0], #4 ; Load a word from the source and<br />

STR r3, [r1], #4 ; store it to the destination<br />

SUBS r2, r2, #1 ; Decrement the counter<br />

BNE wordcopy ; ... copy more<br />

stop MOV r0, #0x18 ; angel_SWIreason_ReportException<br />

LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit<br />

SWI 0x123456 ; <strong>ARM</strong> semihosting SWI<br />

AREA BlockData, DATA, READWRITE<br />

src DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4<br />

dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0<br />

END<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-47


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.8.5 Thumb LDM 和 STM 指 令<br />

Thumb 指 令 集 包 含 下 列 多 寄 存 器 传 送 指 令 组 :<br />

• 用 于 存 储 器 块 传 送 的 LDM 和 STM ;<br />

• 用 于 栈 操 作 的 PUSH 和 POP。<br />

LDM 和 STM<br />

这 些 指 令 可 用 于 从 存 储 器 中 装 载 到 低 位 寄 存 器 的 任 何 子 集 或 将 其 存 储 到 存 储<br />

器 。 在 多 寄 存 器 传 送 指 令 结 束 后 , 总 是 更 新 基 址 寄 存 器 。 必 须 指 定 ! 字 符 。 这 些<br />

指 令 的 唯 一 有 效 后 缀 是 IA。<br />

下 面 是 这 些 指 令 的 示 例 :<br />

LDMIA<br />

STMIA<br />

r1!, {r0,r2-r7}<br />

r4!, {r0-r3}<br />

PUSH 和 POP<br />

这 些 指 令 可 用 以 将 低 位 寄 存 器 的 任 何 子 集 和 ( 可 选 ) 链 接 寄 存 器 推 入 栈 中 , 以<br />

及 将 低 位 寄 存 器 的 任 何 子 集 和 pc( 可 选 ) 从 栈 中 弹 出 。 栈 的 基 址 存 放 在 r13 中 。<br />

下 面 是 这 些 指 令 的 示 例 :<br />

PUSH<br />

POP<br />

PUSH<br />

POP<br />

{r0-r3}<br />

{r0-r3}<br />

{r4-r7,lr}<br />

{r4-r7,pc}<br />

可 选 择 向 寄 存 器 列 表 中 添 加 lr 或 pc , 提 供 了 对 子 程 序 入 口 点 和 退 出 点 的 支 持 。<br />

栈 总 是 满 降 序 的 。<br />

Thumb 状 态 的 块 复 制 示 例<br />

块 复 制 示 例 第 2-46 页 的 示 例 2-11 可 转 换 为 Thumb 指 令 ( 请 参 阅 第 2-49 页 的 示<br />

例 2-13)。<br />

由 于 Thumb LDM 和 STM 只 能 存 取 低 位 寄 存 器 , 每 次 重 复 操 作 复 制 的 字 数 被 从 八 个<br />

减 到 四 个 。 此 外 , LDM 和 STM 指 令 可 用 于 一 次 执 行 单 个 字 复 制 , 因 为 它 们 在 每 次<br />

访 问 后 更 新 基 址 指 针 。 如 果 将 LDR 和 STR 用 于 实 现 这 种 操 作 , 则 需 要 单 独 的 ADD<br />

指 令 来 更 新 每 个 基 址 指 针 。<br />

2-48 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

示 例 2-13<br />

AREA Tblock, CODE, READONLY ; Name this block of code<br />

num EQU 20 ; Set number of words to be copied<br />

ENTRY<br />

; Mark first instruction to execute<br />

header<br />

; The first instruction to call<br />

MOV sp, #0x400 ; Set up stack pointer (r13)<br />

ADR r0, start + 1 ; Processor starts in <strong>ARM</strong> state,<br />

BX r0 ; so small <strong>ARM</strong> code header used<br />

; to call Thumb main program<br />

CODE16<br />

; Subsequent instructions are Thumb<br />

start<br />

LDR r0, =src ; r0 =pointer to source block<br />

LDR r1, =dst ; r1 =pointer to destination block<br />

MOV r2, #num ; r2 =number of words to copy<br />

blockcopy<br />

LSR r3,r2, #2 ; Number of four word multiples<br />

BEQ copywords ; Less than four words to move?<br />

PUSH {r4-r7} ; Save some working registers<br />

quadcopy<br />

LDMIA r0!, {r4-r7} ; Load 4 words from the source<br />

STMIA r1!, {r4-r7} ; and put them at the destination<br />

SUB r3, #1 ; Decrement the counter<br />

BNE quadcopy ; ... copy more<br />

POP {r4-r7} ; Don't need these now-restore originals<br />

copywords<br />

MOV r3, #3 ; Bottom two bits represent number<br />

AND r2, r3 ; ...of odd words left to copy<br />

BEQ stop ; No words left to copy?<br />

wordcopy<br />

LDMIA r0!, {r3} ; load a word from the source and<br />

STMIA r1!, {r3} ; store it to the destination<br />

SUB r2, #1 ; Decrement the counter<br />

BNE wordcopy ; ... copy more<br />

stop MOV r0, #0x18 ; angel_SWIreason_ReportException<br />

LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit<br />

SWI 0xAB ; Thumb semihosting SWI<br />

AREA BlockData, DATA, READWRITE<br />

src DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4<br />

dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0<br />

END<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-49


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.9 使 用 宏<br />

宏 定 义 是 位 于 MACRO 和 MEND 命 令 之 间 的 一 块 代 码 。 它 定 义 了 一 个 名 称 , 可 用 于 代<br />

替 重 复 的 整 块 代 码 。 宏 的 主 要 用 途 是 :<br />

• 通 过 用 单 个 有 意 义 的 名 称 代 替 一 块 代 码 , 使 得 更 容 易 理 解 源 代 码 的 逻 辑 性 ;<br />

• 为 了 避 免 多 次 重 复 一 块 代 码 。<br />

详 细 信 息 请 参 阅 第 7-27 页 的 MACRO 和 MEND。<br />

2.9.1 测 试 和 跳 转 的 宏 示 例<br />

一 个 测 试 和 跳 转 操 作 需 要 两 个 <strong>ARM</strong> 指 令 来 实 现 。<br />

您 可 以 定 义 类 似 下 面 这 样 的 宏 定 义 :<br />

MACRO<br />

$label TestAndBranch $dest, $reg, $cc<br />

$label CMP $reg, #0<br />

B$cc $dest<br />

MEND<br />

MACRO 命 令 后 的 行 是 宏 原 型 语 句 。 宏 原 型 语 句 定 义 了 用 于 调 用 宏 的 名 称<br />

(TestAndBranch)。 它 也 定 义 了 参 数 ($label、$dest、$reg 和 $cc)。 在 调 用 宏 时 必<br />

须 为 这 些 参 数 提 供 值 。 汇 编 程 序 用 所 提 供 的 值 替 换 到 代 码 中 。<br />

可 以 按 以 下 方 式 调 用 这 个 宏 :<br />

test TestAndBranch NonZero, r0, NE<br />

...<br />

...<br />

NonZero<br />

在 替 换 后 将 变 成 :<br />

test CMP r0, #0<br />

BNE NonZero<br />

...<br />

...<br />

NonZero<br />

2-50 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.9.2 无 符 号 整 数 除 法 的 宏 示 例<br />

示 例 2-14 给 出 了 一 个 执 行 无 符 号 整 数 除 法 的 宏 。 它 带 有 四 个 参 数 :<br />

$Bot 存 放 除 数 的 寄 存 器 。<br />

$Top 存 放 指 令 执 行 前 被 除 数 的 寄 存 器 。 执 行 指 令 之 后 , 它 存 放 余 数 。<br />

$Div 存 放 除 法 的 商 的 寄 存 器 。 如 果 只 需 求 余 数 , 它 可 以 是 NULL ("")。<br />

$Temp 计 算 时 使 用 的 临 时 寄 存 器 。<br />

示 例 2-14<br />

MACRO<br />

$Lab DivMod $Div,$Top,$Bot,$Temp<br />

ASSERT $Top $Bot<br />

; Produce an error message if the<br />

ASSERT $Top $Temp<br />

; registers supplied are<br />

ASSERT $Bot $Temp<br />

; not all different<br />

IF "$Div" ""<br />

ASSERT $Div $Top<br />

; These three only matter if $Div<br />

ASSERT $Div $Bot ; is not null ("")<br />

ASSERT $Div $Temp ;<br />

ENDIF<br />

$Lab<br />

MOV $Temp, $Bot ; Put divisor in $Temp<br />

CMP $Temp, $Top, LSR #1 ; double it until<br />

90 MOVLS $Temp, $Temp, LSL #1 ; 2 * $Temp > $Top<br />

CMP $Temp, $Top, LSR #1<br />

BLS %b90 ; The b means search backwards<br />

IF "$Div" "" ; Omit next instruction if $Div is<br />

null<br />

MOV $Div, #0 ; Initialize quotient<br />

ENDIF<br />

91 CMP $Top, $Temp ; Can we subtract $Temp?<br />

SUBCS $Top, $Top,$Temp ; If we can, do so<br />

IF "$Div" "" ; Omit next instruction if $Div is<br />

null<br />

ADC $Div, $Div, $Div ; Double $Div<br />

ENDIF<br />

MOV $Temp, $Temp, LSR #1 ; Halve $Temp,<br />

CMP $Temp, $Bot ; and loop until<br />

BHS %b91 ; less than divisor<br />

MEND<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-51


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

这 个 宏 确 认 任 何 两 个 参 数 不 使 用 相 同 的 寄 存 器 。 如 果 只 需 要 计 算 余 数 , 它 也 优 化<br />

所 产 生 的 代 码 。<br />

如 果 在 汇 编 程 序 源 代 码 中 多 次 使 用 了 DivMod, 为 了 避 免 标 号 的 多 次 定 义 , 宏 将 使<br />

用 局 部 标 号 (90, 91)。 有 关 详 细 信 息 请 参 阅 第 2-14 页 的 局 部 标 号 。<br />

示 例 2-15 说 明 了 按 如 下 方 式 调 用 宏 时 它 所 生 成 的 代 码 :<br />

ratio DivMod r0,r5,r4,r2<br />

示 例 2-15<br />

ASSERT r5 r4<br />

; Produce an error if the<br />

ASSERT r5 r2<br />

; registers supplied are<br />

ASSERT r4 r2<br />

; not all different<br />

ASSERT r0 r5<br />

; These three only matter if $Div<br />

ASSERT r0 r4 ; is not null ("")<br />

ASSERT r0 r2 ;<br />

ratio<br />

MOV r2, r4 ; Put divisor in $Temp<br />

CMP r2, r5, LSR #1 ; double it until<br />

90 MOVLS r2, r2, LSL #1 ; 2 * r2 > r5<br />

CMP r2, r5, LSR #1<br />

BLS %b90 ; The b means search backwards<br />

MOV r0, #0 ; Initialize quotient<br />

91 CMP r5, r2 ; Can we subtract r2?<br />

SUBCS r5, r5, r2 ; If we can, do so<br />

ADC r0, r0, r0 ; Double r0<br />

MOV r2, r2, LSR #1 ; Halve r2,<br />

CMP r2, r4 ; and loop until<br />

BHS %b91 ; less than divisor<br />

2-52 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.10 用 MAP 和 FIELD 命 令 描 述 数 据 结 构<br />

可 以 使 用 MAP 和 FIELD 命 令 来 描 述 数 据 结 构 。 这 些 命 令 总 是 一 起 使 用 的 。<br />

使 用 MAP 和 FIELD 定 义 的 数 据 结 构 :<br />

• 容 易 维 护 ;<br />

• 可 用 于 描 述 相 同 结 构 的 多 个 实 例 ;<br />

• 使 得 易 于 高 效 地 存 取 数 据 。<br />

MAP 命 令 指 定 数 据 结 构 的 基 址 。 有 关 详 细 信 息 请 参 阅 第 7-15 页 的 MAP。<br />

FIELD 命 令 指 定 一 个 数 据 项 所 需 的 存 储 器 数 量 , 并 可 为 该 数 据 项 提 供 一 个 标 号 。<br />

对 结 构 中 的 每 个 数 据 项 重 复 该 命 令 。 有 关 详 细 信 息 请 参 阅 第 7-16 页 的 FIELD。<br />

备 注<br />

当 定 义 一 个 映 射 时 , 不 分 配 存 储 器 空 间 。 使 用 定 义 常 数 的 命 令 ( 如 DCD) 来 分 配<br />

存 储 器 空 间 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-53


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.10.1 相 对 映 射<br />

要 存 取 当 前 指 令 4KB 范 围 外 的 数 据 , 可 以 使 用 相 对 寄 存 器 的 指 令 , 例 如 :<br />

LDR<br />

r4,[r9,#offset]<br />

offset 被 限 制 为 4096, 因 此 r9 必 须 已 包 含 位 于 数 据 地 址 的 4KB 范 围 内 的 一 个 值 。<br />

示 例 2-16<br />

MAP 0<br />

consta FIELD 4 ; consta uses four bytes, located at offset 0<br />

constb FIELD 4 ; constb uses four bytes, located at offset 4<br />

x FIELD 8 ; x uses eight bytes, located at offset 8<br />

y FIELD 8 ; y uses eight bytes, located at offset 16<br />

string FIELD 256 ; string is up to 256 bytes long, starting at offset 24<br />

利 用 示 例 2-16 中 的 映 射 , 可 以 使 用 下 列 指 令 来 访 问 数 据 结 构 :<br />

MOV<br />

LDR<br />

r9,#4096<br />

r4,[r9,#constb]<br />

标 号 是 相 对 于 数 据 结 构 的 开 始 位 置 的 。 用 于 存 放 映 射 的 起 始 地 址 的 寄 存 器 ( 此<br />

例 中 为 r9) 称 为 基 址 寄 存 器 。<br />

可 能 有 很 多 LDR 或 STR 指 令 访 问 此 数 据 结 构 中 的 数 据 。<br />

此 映 射 不 包 含 数 据 结 构 的 位 置 。 数 据 结 构 的 位 置 是 由 运 行 时 装 载 到 基 址 寄 存 器<br />

的 值 确 定 的 。<br />

同 一 映 射 可 以 用 于 描 述 数 据 结 构 的 多 个 实 例 。 它 们 可 以 位 于 存 储 器 中 的 任 何<br />

位 置 。<br />

对 可 用 MOV 指 令 装 载 到 寄 存 器 中 的 地 址 有 一 些 限 制 。 有 关 如 何 装 载 任 意 地 址 的 详<br />

细 信 息 , 请 参 阅 第 2-32 页 的 将 地 址 装 载 到 寄 存 器 中 。<br />

备 注<br />

r9 是 “<strong>ARM</strong>-Thumb 程 序 调 用 标 准 ” 中 的 静 态 基 址 寄 存 器 (sb)。 有 关 详 细 信 息 ,<br />

请 参 阅 <strong>RealView</strong> 编 译 工 具 2.0 版 开 发 人 员 指 南 中 的 使 用 程 序 调 用 标 准 一 章 。<br />

2-54 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.10.2 基 于 寄 存 器 的 映 射<br />

在 很 多 情 况 下 , 每 次 访 问 一 个 数 据 结 构 时 可 以 使 用 相 同 的 寄 存 器 作 为 基 址 寄 存<br />

器 。 可 以 在 映 射 的 基 址 中 包 含 该 寄 存 器 的 名 称 。 示 例 2-17 说 明 了 这 样 一 个 基 于<br />

寄 存 器 的 映 射 。 映 射 中 定 义 的 标 号 包 含 有 该 寄 存 器 。<br />

示 例 2-17<br />

MAP 0,r9<br />

consta FIELD 4 ; consta uses four bytes, located at offset 0 (from r9)<br />

constb FIELD 4 ; constb uses four bytes, located at offset 4<br />

x FIELD 8 ; x uses eight bytes, located at offset 8<br />

y FIELD 8 ; y uses eight bytes, located at offset 16<br />

string FIELD 256 ; string is up to 256 bytes long, starting at offset 24<br />

利 用 示 例 2-17 中 的 映 射 , 可 以 访 问 数 据 结 构 而 不 管 它 在 什 么 位 置 :<br />

ADR r9,datastart<br />

LDR r4,constb ; => LDR r4,[r9,#4]<br />

constb 包 含 从 数 据 结 构 开 始 位 置 算 起 的 数 据 项 的 偏 移 量 , 也 包 含 基 址 寄 存 器 。 在<br />

此 例 中 , 基 址 寄 存 器 是 在 MAP 命 令 中 定 义 的 r9。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-55


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.10.3 相 对 于 程 序 的 映 射<br />

可 以 使 用 程 序 计 数 器 (r15) 作 为 一 个 映 射 的 基 址 寄 存 器 。 在 此 例 中 , 每 个 STM 或<br />

LDM 指 令 必 须 在 其 寻 址 的 数 据 项 的 4KB 范 围 内 , 因 为 偏 移 量 被 限 制 为 4KB。 数<br />

据 结 构 与 指 令 必 须 位 于 相 同 的 段 内 , 因 为 否 则 不 能 保 证 在 链 接 后 数 据 项 将 在 范<br />

围 内 。<br />

示 例 2-18 说 明 了 含 有 这 种 映 射 的 程 序 片 段 。 其 中 包 含 一 个 为 数 据 结 构 分 配 存 储<br />

器 空 间 的 命 令 , 也 包 含 存 取 它 的 一 条 指 令 。<br />

示 例 2-18<br />

datastruc SPACE 280 ; reserves 280 bytes of memory for datastruc<br />

MAP datastruc<br />

consta FIELD 4<br />

constb FIELD 4<br />

x FIELD 8<br />

y FIELD 8<br />

string FIELD 256<br />

code LDR r2,constb ; => LDR r2,[pc,offset]<br />

在 此 例 中 , 不 需 要 在 装 载 数 据 之 前 装 载 基 址 寄 存 器 , 因 为 程 序 计 数 器 已 经 存 放 了<br />

正 确 的 地 址 。( 因 为 处 理 器 里 面 的 流 水 线 , 这 与 LDR 指 令 的 实 际 地 址 并 不 相 同 。<br />

但 是 , 汇 编 程 序 会 处 理 这 个 问 题 。)<br />

2-56 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.10.4 查 找 已 分 配 的 数 据 的 结 束 位 置<br />

可 以 使 用 带 有 0 操 作 数 的 FIELD 命 令 , 来 标 记 结 构 内 的 一 个 位 置 。 标 记 位 置 后 ,<br />

位 置 计 数 器 并 未 增 加 。<br />

示 例 2-19 中 定 义 的 数 据 结 构 的 大 小 依 赖 于 MaxStrLen 和 ArrayLen 的 值 。 如 果 这 些<br />

值 太 大 , 该 结 构 会 超 过 可 用 存 储 器 的 结 束 位 置 。<br />

示 例 2-19 使 用 :<br />

• 一 个 EQU 命 令 定 义 可 用 内 存 的 结 束 位 置 ;<br />

• 一 个 带 有 0 操 作 数 的 FIELD 命 令 , 来 标 记 数 据 结 构 的 结 束 位 置 。<br />

一 个 ASSERT 命 令 确 认 数 据 结 构 的 结 束 位 置 并 未 超 出 可 用 内 存 。<br />

示 例 2-19<br />

StartOfData EQU 0x1000<br />

EndOfData EQU 0x2000<br />

MAP StartOfData<br />

Integer FIELD 4<br />

Integer2 FIELD 4<br />

String FIELD MaxStrLen<br />

Array FIELD ArrayLen*8<br />

BitMask FIELD 4<br />

EndOfUsedData FIELD 0<br />

ASSERT EndOfUsedData


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.10.5 强 制 正 确 对 齐<br />

像 示 例 2-20 中 一 样 , 如 果 在 数 据 结 构 中 包 含 一 些 字 符 变 量 , 就 可 能 会 有 问 题 。<br />

这 是 因 为 很 多 字 是 未 对 齐 的 。<br />

示 例 2-20<br />

StartOfData EQU 0x1000<br />

EndOfData EQU 0x2000<br />

MAP StartOfData<br />

Char FIELD 1<br />

Char2 FIELD 1<br />

Char3 FIELD 1<br />

Integer FIELD 4 ; alignment= 3<br />

Integer2 FIELD 4<br />

String FIELD MaxStrLen<br />

Array FIELD ArrayLen*8<br />

BitMask FIELD 4<br />

EndOfUsedData FIELD 0<br />

ASSERT EndOfUsedData


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

示 例 2-21<br />

StartOfData EQU 0x1000<br />

EndOfData EQU 0x2000<br />

MAP StartOfData<br />

Char FIELD 1<br />

Char2 FIELD 1<br />

Char3 FIELD 1<br />

EndOfChars FIELD 0<br />

Padding FIELD (-EndOfChars):AND:3<br />

Integer FIELD 4<br />

Integer2 FIELD 4<br />

String FIELD MaxStrLen<br />

Array FIELD ArrayLen*8<br />

BitMask FIELD 4<br />

EndOfUsedData FIELD 0<br />

ASSERT EndOfUsedData


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.10.6 使 用 基 于 寄 存 器 的 MAP 和 FIELD 命 令<br />

基 于 寄 存 器 的 MAP 和 FIELD 命 令 定 义 基 于 寄 存 器 的 符 号 。 基 于 寄 存 器 的 符 号 的 主<br />

要 用 途 是 :<br />

• 定 义 与 C 语 言 结 构 类 似 的 结 构 ;<br />

• 更 快 地 访 问 不 是 由 基 于 寄 存 器 的 MAP 和 FIELD 命 令 描 述 的 存 储 器 段 。<br />

定 义 基 于 寄 存 器 的 符 号<br />

基 于 寄 存 器 的 符 号 可 以 非 常 有 用 , 但 使 用 时 必 须 小 心 。 作 为 通 则 , 请 仅 按 下 列 方<br />

式 使 用 它 们 :<br />

• 作 为 一 个 装 载 或 存 储 指 令 的 装 载 或 存 储 地 址 。 如 果 Location 是 基 于 寄 存 器<br />

的 符 号 ( 基 于 寄 存 器 Rb 并 带 有 数 字 偏 移 量 ), 汇 编 程 序 会 自 动 进 行 切 换 ,<br />

例 如 将 LDR Rn,Location 转 换 为 LDR Rn,[Rb,#offset]。<br />

在 ADR 或 ADRL 指 令 中 ,ADR Rn,Location 将 由 汇 编 程 序 转 换 为 ADD<br />

Rn,Rb,#offset 。<br />

• 将 一 个 常 规 的 数 字 表 达 式 加 到 一 个 基 于 寄 存 器 的 符 号 上 , 以 获 得 另 一 个 基<br />

于 寄 存 器 的 符 号 。<br />

• 从 一 个 基 于 寄 存 器 的 符 号 减 去 一 个 常 规 的 数 字 表 达 式 , 以 获 得 另 一 个 基 于<br />

寄 存 器 的 符 号 。<br />

• 从 一 个 基 于 寄 存 器 的 符 号 减 去 另 一 个 基 于 寄 存 器 的 符 号 , 以 获 得 一 个 常 规<br />

的 数 字 表 达 式 。 除 非 两 个 基 于 寄 存 器 的 符 号 是 基 于 同 一 个 寄 存 器 的 , 否 则<br />

不 能 执 行 这 种 操 作 。 不 然 的 话 , 将 得 到 两 个 寄 存 器 和 一 个 数 字 值 的 组 合 。<br />

这 样 会 导 致 一 个 汇 编 程 序 错 误 。<br />

• 作 为 :BASE: 或 :INDEX: 运 算 符 的 操 作 数 。 这 些 运 算 符 主 要 用 于 宏 中 。<br />

其 它 用 法 通 常 会 导 致 汇 编 程 序 产 生 出 错 消 息 。 例 如 , 如 果 编 写 了 LDR Rn,=Location<br />

指 令 , 其 中 Location 是 基 于 寄 存 器 的 , 则 意 味 着 让 汇 编 程 序 从 一 个 存 储 器 位 置 装<br />

载 Rn, 该 位 置 总 是 含 有 寄 存 器 Rb 的 当 前 值 加 上 其 中 的 偏 移 量 。 汇 编 程 序 不 能 执<br />

行 这 条 指 令 , 因 为 不 存 在 这 样 的 存 储 器 位 置 。<br />

类 似 地 , 如 果 编 写 了 ADD Rd,Rn,#expression 指 令 , 其 中 expression 是 基 于 寄 存 器<br />

的 , 则 该 指 令 请 求 执 行 一 条 ADD 指 令 , 将 expression 的 两 个 基 址 寄 存 器 及 其 对 Rn<br />

的 偏 移 量 相 加 。 再 一 次 , 汇 编 程 序 不 能 执 行 这 一 指 令 。 您 必 须 使 用 两 个 ADD 指 令<br />

来 执 行 这 两 个 加 法 。<br />

2-60 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

建 立 C 语 言 类 型 的 结 构<br />

使 用 C 语 言 中 的 结 构 时 需 要 :<br />

1. 声 明 该 结 构 包 含 的 字 段 。<br />

2. 在 存 储 器 中 生 成 结 构 再 使 用 它 。<br />

例 如 , 下 面 的 typedef 语 句 定 义 了 一 个 点 结 构 , 其 中 包 含 三 个 名 为 x、 y 和 z 的<br />

float 字 段 , 但 它 不 分 配 任 何 存 储 器 。 第 二 条 语 句 在 存 储 器 中 分 配 名 为 origin、<br />

oldloc 和 newloc 的 三 个 Point 类 型 的 结 构 :<br />

typedef struct Point<br />

{<br />

float x,y,z;<br />

} Point;<br />

Point origin,oldloc,newloc;<br />

下 列 汇 编 语 言 代 码 等 价 于 上 面 的 typedef 语 句 :<br />

PointBase RN r11<br />

MAP 0,PointBase<br />

Point_x FIELD 4<br />

Point_y FIELD 4<br />

Point_z FIELD 4<br />

下 列 汇 编 语 言 代 码 分 配 存 储 器 空 间 : 其 等 价 于 C 语 言 代 码 的 最 后 一 行 :<br />

origin SPACE 12<br />

oldloc SPACE 12<br />

newloc SPACE 12<br />

在 使 用 映 射 中 定 义 的 标 号 之 前 , 必 须 将 数 据 结 构 的 基 址 装 载 到 基 址 寄 存 器 中 。<br />

例 如 :<br />

LDR<br />

MOV<br />

STR<br />

MOV<br />

STR<br />

MOV<br />

STR<br />

PointBase,=origin<br />

r0,#0<br />

r0,Point_x<br />

r0,#2<br />

r0,Point_y<br />

r0,#3<br />

r0,Point_z<br />

等 价 于 下 列 C 语 言 代 码 :<br />

origin.x = 0;<br />

origin.y = 2;<br />

origin.z = 3;<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-61


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

获 得 尽 可 能 快 的 访 问 速 度<br />

如 要 更 快 速 地 访 问 存 储 器 段 :<br />

1. 将 存 储 器 段 描 述 为 一 个 结 构 。<br />

2. 使 用 一 个 寄 存 器 来 寻 址 该 结 构 。<br />

例 如 , 考 虑 示 例 2-22 中 的 定 义 。<br />

示 例 2-22<br />

StartOfData EQU 0x1000<br />

EndOfData EQU 0x2000<br />

MAP StartOfData<br />

Integer FIELD 4<br />

String FIELD MaxStrLen<br />

Array FIELD ArrayLen*8<br />

BitMask FIELD 4<br />

EndOfUsedData FIELD 0<br />

ASSERT EndOfUsedData


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

第 2-62 页 的 示 例 2-23 包 含 单 独 的 LDR 伪 指 令 来 装 载 每 个 数 据 项 的 地 址 。 每 个 LDR<br />

伪 指 令 将 由 汇 编 程 序 转 换 为 一 条 独 立 的 指 令 。 但 可 用 单 个 LDR 伪 指 令 来 访 问 整 个<br />

数 据 段 。 示 例 2-24 说 明 了 这 种 实 现 方 法 。 速 度 和 代 码 大 小 都 得 以 改 进 。<br />

示 例 2-24<br />

AREA data, DATA<br />

StartOfData EQU 0x1000<br />

EndOfData EQU 0x2000<br />

DataAreaBase RN r11<br />

MAP 0,DataAreaBase<br />

StartOfUsedData FIELD 0<br />

Integer FIELD 4<br />

String FIELD MaxStrLen<br />

Array FIELD ArrayLen*8<br />

BitMask FIELD 4<br />

EndOfUsedData FIELD 0<br />

UsedDataLen EQU EndOfUsedData - StartOfUsedData<br />

ASSERT UsedDataLen


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

如 果 您 想 将 相 同 的 技 巧 用 于 包 含 存 储 器 映 射 I/O 的 ( 或 者 因 其 它 原 因 不 得 改 变 其<br />

绝 对 地 址 的 ) 存 储 器 段 , 则 须 注 意 保 持 代 码 的 可 维 护 性 。<br />

一 个 方 法 是 为 代 码 添 加 注 释 , 以 警 告 维 护 者 在 修 改 定 义 时 要 小 心 。 另 一 个 更 好 的<br />

方 法 是 使 用 绝 对 地 址 定 义 来 控 制 基 于 寄 存 器 的 定 义 。<br />

使 用 MAP offset,reg, 后 面 跟 着 label FIELD 0 , 使 label 变 成 一 个 基 于 寄 存 器 的<br />

符 号 , 寄 存 器 部 分 为 reg , 数 字 部 分 为 offset。 示 例 2-25 说 明 了 这 种 方 法 。<br />

示 例 2-25<br />

StartOfIOArea EQU 0x1000000<br />

SendFlag_Abs EQU 0x1000000<br />

SendData_Abs EQU 0x1000004<br />

RcvFlag_Abs EQU 0x1000008<br />

RcvData_Abs EQU 0x100000C<br />

IOAreaBase RN r11<br />

MAP (SendFlag_Abs-StartOfIOArea),IOAreaBase<br />

SendFlag FIELD 0<br />

MAP (SendData_Abs-StartOfIOArea),IOAreaBase<br />

SendData FIELD 0<br />

MAP (RcvFlag_Abs-StartOfIOArea),IOAreaBase<br />

RcvFlag FIELD 0<br />

MAP (RcvData_Abs-StartOfIOArea),IOAreaBase<br />

RcvData FIELD 0<br />

使 用 LDR IOAreaBase,=StartOfIOArea 装 载 基 址 。 这 就 允 许 用 类 似 LDR R0,RcvFlag 和<br />

STR R4,SendData 的 语 句 来 访 问 单 独 的 位 置 。<br />

2-64 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.10.7 使 用 两 个 基 于 寄 存 器 的 结 构<br />

有 时 候 需 要 同 时 操 作 具 有 相 同 类 型 的 两 个 结 构 。 例 如 , 如 果 需 要 等 价 的 伪 代 码 :<br />

newloc.x = oldloc.x + (value in r0);<br />

newloc.y = oldloc.y + (value in r1);<br />

newloc.z = oldloc.z + (value in r2);<br />

基 址 寄 存 器 需 要 交 替 地 指 向 oldloc 结 构 和 newloc 结 构 。 反 复 改 变 基 址 寄 存 器 将<br />

将 是 低 效 率 的 作 法 。 而 应 该 使 用 一 个 非 基 于 寄 存 器 的 映 射 , 并 像 示 例 2-26 中 一<br />

样 , 在 两 个 不 同 的 寄 存 器 中 设 置 两 个 指 针 。<br />

示 例 2-26<br />

MAP 0 ; Non-register based relative map used twice, for<br />

Pointx FIELD 4 ; old and new data at oldloc and newloc<br />

Pointy FIELD 4 ; oldloc and newloc are labels for<br />

Pointz FIELD 4 ; memory allocated in other sections<br />

; code<br />

ADR<br />

ADR<br />

LDR<br />

ADD<br />

STR<br />

LDR<br />

ADD<br />

STR<br />

LDR<br />

ADD<br />

STR<br />

r8,oldloc<br />

r9,newloc<br />

r3,[r8,Pointx] ; load from oldloc (r8)<br />

r3,r3,r0<br />

r3,[r9,Pointx] ; store to newloc (r9)<br />

r3,[r8,Pointy]<br />

r3,r3,r1<br />

r3,[r9,Pointy]<br />

r3,[r8,Pointz]<br />

r3,r3,r2<br />

r3,[r9,Pointz]<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-65


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.10.8 避 免 使 用 MAP 和 FIELD 命 令 时 出 现 的 问 题<br />

使 用 MAP 和 FIELD 命 令 会 有 助 于 生 成 可 维 护 的 数 据 结 构 。 但 是 , 只 有 当 各 种 代 码<br />

元 素 放 到 存 储 器 中 的 次 序 对 程 序 员 或 程 序 不 重 要 时 , 才 是 这 样 。<br />

如 果 在 单 条 指 令 中 装 载 或 存 储 一 个 结 构 的 多 个 元 素 时 , 就 可 能 会 有 问 题 。 这 些 问<br />

题 发 生 类 似 如 下 的 操 作 中 :<br />

• 将 几 个 单 字 节 元 素 装 载 到 一 个 寄 存 器 ;<br />

• 使 用 一 条 存 储 多 个 或 装 载 多 个 指 令 (STM 和 LDM), 来 为 多 个 寄 存 器 存 储 或<br />

装 载 多 个 字 。<br />

这 些 操 作 要 求 结 构 中 的 数 据 元 素 在 存 储 器 中 是 相 邻 的 , 并 且 遵 循 一 个 特 定 的 顺<br />

序 。 如 果 改 变 了 元 素 的 顺 序 , 或 者 添 加 了 新 的 元 素 , 程 序 将 被 破 坏 为 汇 编 程 序 无<br />

法 检 测 到 的 形 式 。<br />

有 几 个 方 法 可 避 免 类 似 这 样 的 问 题 :<br />

示 例 2-27 说 明 了 一 个 结 构 示 例 。<br />

示 例 2-27<br />

MiscBase RN r10<br />

MAP 0,MiscBase<br />

MiscStart FIELD 0<br />

Misc_a FIELD 1<br />

Misc_b FIELD 1<br />

Misc_c FIELD 1<br />

Misc_d FIELD 1<br />

MiscEndOfChars FIELD 0<br />

MiscPadding FIELD (-:INDEX:MiscEndOfChars) :AND: 3<br />

Misc_I FIELD 4<br />

Misc_J FIELD 4<br />

Misc_K FIELD 4<br />

Misc_data FIELD 4*20<br />

MiscEnd FIELD 0<br />

MiscLen EQU MiscEnd-MiscStart<br />

在 使 用 LDM 和 STM 指 令 来 访 问 大 于 一 个 字 的 单 一 数 据 元 素 时 ( 如 数 组 ), 就 不 会<br />

出 现 问 题 。 一 个 例 子 是 20 个 字 的 元 素 Misc_data。 可 以 按 如 下 方 式 访 问 它 :<br />

ArrayBase RN R9<br />

ADR ArrayBase, MiscBase<br />

LDMIA ArrayBase, {R0-R5}<br />

2-66 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

第 2-66 页 的 示 例 2-27 装 载 数 组 Misc_data 的 前 六 项 。 该 数 组 是 一 个 单 一 元 素 ,<br />

因 此 覆 盖 相 邻 的 存 储 器 位 置 。 今 后 任 何 人 都 不 太 可 能 将 其 分 解 成 单 独 的 数 组 。<br />

但 是 , 如 果 要 装 载 Misc_I、 Misc_J 和 Misc_K 到 寄 存 器 r0、 r1 和 r2 中 , 下 列 代 码<br />

也 起 作 用 , 但 今 后 可 能 会 引 起 问 题 :<br />

ArrayBase<br />

RN r9<br />

ADR<br />

LDMIA<br />

ArrayBase, Misc_I<br />

ArrayBase, {r0-r2}<br />

如 果 改 变 了 Misc_I、Misc_J 和 Misc_K 的 顺 序 , 或 者 如 果 在 其 之 间 添 加 了 一 个 新 元<br />

素 Misc_New, 就 可 能 会 出 现 问 题 。 这 些 小 变 化 都 会 破 坏 代 码 。<br />

如 果 在 其 它 位 置 单 独 访 问 这 些 元 素 , 则 不 能 将 其 合 并 到 一 个 单 一 数 组 元 素 中 。<br />

在 这 种 情 况 下 , 必 须 改 正 代 码 。 第 一 种 解 决 方 法 是 注 释 该 结 构 , 以 防 止 更 改 影<br />

响 此 段 :<br />

Misc_I FIELD 4 ; ==} Do not split/reorder<br />

Misc_J FIELD 4 ; } these 3 elements, STM<br />

Misc_K FIELD 4 ; ==} and LDM instructions used.<br />

如 果 代 码 含 有 详 尽 的 注 释 , 也 许 就 不 需 要 特 意 做 出 影 响 程 序 工 作 方 式 的 改 变 。 不<br />

幸 的 是 , 也 会 出 现 错 误 。 捕 获 这 些 问 题 的 第 二 种 方 法 是 在 STM 和 LDM 指 令 之 前 添<br />

加 ASSERT 命 令 , 以 确 认 标 号 是 连 续 的 , 并 且 遵 循 正 确 的 顺 序 :<br />

ArrayBase RN R9<br />

; Check that the structure elements<br />

; are correctly ordered for LDM<br />

ASSERT (((Misc_J-Misc_I) = 4) :LAND: ((Misc_K-Misc_J) = 4))<br />

ADR ArrayBase, Misc_I<br />

LDMIA ArrayBase, {r0-r2}<br />

如 果 该 结 构 不 符 合 用 LDM 装 载 的 正 确 顺 序 , 则 此 ASSERT 命 令 将 在 此 位 置 停 止 汇 编 。<br />

要 记 住 , 具 有 最 低 地 址 的 元 素 , 总 是 从 最 低 编 号 的 寄 存 器 装 载 或 存 储 到 最 低 编 号<br />

的 寄 存 器 中 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 2-67


编 写 <strong>ARM</strong> 和 Thumb 汇 编 语 言<br />

2.11 使 用 框 架 命 令<br />

如 果 想 要 执 行 下 列 操 作 之 一 , 则 必 须 使 用 框 架 命 令 来 描 述 代 码 使 用 栈 的 方 式 :<br />

• 利 用 栈 展 开 来 调 试 应 用 程 序 ;<br />

• 使 用 普 通 的 或 调 用 图 剖 析 功 能 。<br />

有 关 这 些 命 令 的 详 细 信 息 , 请 参 阅 第 7-34 页 的 结 构 描 述 命 令 。<br />

汇 编 程 序 使 用 这 些 命 令 来 将 DWARF2 调 试 框 架 信 息 插 入 到 其 所 生 成 的 ELF 格 式<br />

的 目 标 文 件 中 。 调 试 器 进 行 栈 展 开 和 程 序 剖 析 时 需 要 的 这 些 信 息 。 有 关 栈 展 开 的<br />

详 细 信 息 , 请 参 阅 <strong>RealView</strong> 编 译 工 具 2.0 版 开 发 人 员 指 南 中 的 使 用 程 序 调 用 标<br />

准 一 章 。<br />

框 架 命 令 不 影 响 由 armasm 生 成 的 代 码 。<br />

2-68 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


第 3 章<br />

汇 编 程 序 参 考<br />

本 章 提 供 <strong>ARM</strong> 汇 编 程 序 的 一 般 性 参 考 材 料 。 其 中 包 含 下 列 各 部 分 :<br />

• 第 3-2 页 的 命 令 语 法 ;<br />

• 第 3-8 页 的 源 语 句 行 格 式 ;<br />

• 第 3-9 页 的 预 定 义 的 寄 存 器 和 协 处 理 器 名 称 ;<br />

• 第 3-10 页 的 内 置 变 量 ;<br />

• 第 3-12 页 的 符 号 ;<br />

• 第 3-18 页 的 表 达 式 、 文 本 和 运 算 符 。<br />

本 章 不 介 绍 如 何 编 写 <strong>ARM</strong> 汇 编 语 言 。 有 关 教 程 信 息 请 参 阅 第 2 章 编 写 <strong>ARM</strong> 和<br />

Thumb 汇 编 语 言 。<br />

也 不 描 述 指 令 、 命 令 或 伪 指 令 。 请 参 阅 有 关 各 章 了 解 这 些 方 面 的 参 考 信 息 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 3-1


汇 编 程 序 参 考<br />

3.1 命 令 语 法<br />

此 部 分 仅 与 armasm 相 关 。 内 联 汇 编 程 序 是 C 和 C++ 编 译 器 的 组 成 部 分 , 并 且 没<br />

有 其 独 立 的 命 令 语 法 。<br />

除 了 文 件 名 称 和 另 加 指 定 外 , armasm 命 令 行 是 区 分 大 小 写 的 。<br />

使 用 此 命 令 调 用 <strong>ARM</strong> 汇 编 程 序 :<br />

armasm [-16|-32] [-apcs [none|[/qualifier[/qualifier[...]]]]]<br />

[-bigend|-littleend] [-checkreglist] [-cpu cpu] [-depend dependfile|-m|-md]<br />

[-errors errorfile] [-fpu name] [-g] [-help] [-i dir [,dir]…] [-keep] [-list<br />

[listingfile] [options]] [-maxcache n] [-memaccess attributes] [-nocache]<br />

[-noesc] [-noregs] [-nowarn] [-o filename] [-predefine "directive"]<br />

[-split_ldm] [-unsafe] [-via file] inputfile<br />

其 中 :<br />

-16 指 示 汇 编 程 序 将 指 令 解 释 为 Thumb 指 令 。 其 等 价 于 源 文 件 开 头 的<br />

CODE16 命 令 。<br />

-32 指 示 汇 编 程 序 将 指 令 解 释 为 <strong>ARM</strong> 指 令 。 这 是 默 认 选 项 。<br />

-apcs [none|[/qualifier[/qualifier[...]]]]<br />

指 定 是 否 正 在 使 用 <strong>ARM</strong>-Thumb 程 序 调 用 标 准 (ATPCS)。 其 也 指 定<br />

代 码 节 的 某 些 属 性 。 有 关 ATPCS 的 详 细 信 息 , 请 参 阅 <strong>RealView</strong> 编<br />

译 工 具 2.0 版 开 发 者 指 南 。<br />

/none 指 定 inputfile 不 使 用 ATPCS。 未 设 置 ATPCS 寄 存 器 。<br />

不 允 许 使 用 限 定 符 。<br />

备 注<br />

ATPCS 限 定 符 不 影 响 汇 编 程 序 生 成 的 代 码 。 它 们 是 由 程 序 员 指 定<br />

的 使 用 ATPCS 里 哪 一 种 标 准 来 编 译 inputfile 的 标 识 , 使 汇 编 程 序<br />

在 生 成 的 目 标 文 件 中 设 置 了 某 些 属 性 。 链 接 程 序 使 用 这 些 属 性 来<br />

检 查 文 件 的 兼 容 性 和 选 择 适 当 的 库 变 体 。<br />

qualifier 的 值 有 :<br />

/interwork<br />

指 示 inputfile 中 的 代 码 适 合 于 <strong>ARM</strong>/Thumb 交<br />

互 操 作 。 有 关 交 互 操 作 的 详 细 信 息 , 请 参 阅<br />

<strong>RealView</strong> 编 译 工 具 2.0 版 开 发 者 指 南 。<br />

3-2 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


汇 编 程 序 参 考<br />

-bigend<br />

/nointerwork 指 示 inputfile 中 的 代 码 不 适 合 于 <strong>ARM</strong>/Thumb<br />

交 互 操 作 。 这 是 默 认 选 项 。<br />

/ropi 指 示 inputfile 的 内 容 是 只 读 且 位 置 无 关 的 。<br />

/noropi 指 示 inputfile 的 内 容 不 是 只 读 且 位 置 无 关 的 。<br />

这 是 默 认 选 项 。<br />

/pic 是 /ropi 的 一 个 同 义 字 。<br />

/nopic 是 /noropi 的 一 个 同 义 字 。<br />

/rwpi 指 示 inputfile 的 内 容 是 读 写 且 位 置 无 关 的 。<br />

/norwpi<br />

指 示 inputfile 的 内 容 不 是 与 读 写 且 位 置 无 关<br />

的 。 这 是 默 认 选 项 。<br />

/pid 是 /rwpi 的 一 个 同 义 字 。<br />

/nopid 是 /norwpi 的 一 个 同 义 字 。<br />

/swstackcheck 指 示 inputfile 中 的 代 码 执 行 软 件 堆 栈 限 制 检 查 。<br />

/noswstackcheck 指 示 inputfile 中 的 代 码 不 执 行 软 件 堆 栈 限 制 检<br />

查 。 这 是 默 认 选 项 。<br />

/swstna<br />

指 定 inputfile 中 的 代 码 既 与 执 行 堆 栈 检 查 的 代<br />

码 兼 容 , 又 与 不 执 行 堆 栈 检 查 的 代 码 兼 容 。<br />

指 示 汇 编 程 序 汇 编 适 合 于 大 端 <strong>ARM</strong> 的 代 码 。 默 认 选 项 是<br />

-littleend。<br />

-littleend 指 示 汇 编 程 序 汇 编 适 合 于 小 端 <strong>ARM</strong> 的 代 码 。<br />

-checkreglist<br />

-cpu cpu<br />

指 示 汇 编 程 序 检 查 RLIST、 LDM 和 STM 寄 存 器 列 表 , 以 确 保 所 有 寄 存<br />

器 以 升 序 方 式 排 列 。 如 果 寄 存 器 未 按 顺 序 列 出 , 则 给 出 一 条 警 告<br />

信 息 。<br />

设 置 目 标 CPU。 如 果 为 错 误 的 目 标 CPU 执 行 汇 编 , 有 些 指 令 会 生<br />

成 错 误 或 警 告 ( 另 请 参 阅 -unsafe 汇 编 程 序 选 项 )。 cpu 的 有 效 值<br />

可 以 是 体 系 结 构 名 称 , 例 如 3、 4T 或 5TE, 或 者 是 型 号 , 例 如<br />

<strong>ARM</strong>7TDMI ® 。 有 关 体 系 结 构 的 详 细 信 息 , 请 参 阅 <strong>ARM</strong> 体 系 结 构<br />

参 考 手 册 。 默 认 值 是 <strong>ARM</strong>7TDMI。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 3-3


汇 编 程 序 参 考<br />

-depend dependfile<br />

指 示 汇 编 程 序 将 源 文 件 相 关 性 列 表 保 存 到 dependfile 中 。 这 些 选 项<br />

适 合 与 make 实 用 程 序 一 起 使 用 。<br />

-m 指 示 汇 编 程 序 将 源 文 件 相 关 性 列 表 输 出 到 stdout 中 。<br />

-md 指 示 汇 编 程 序 将 源 文 件 相 关 性 列 表 输 出 到 inputfile.d 中 。<br />

-errors errorfile<br />

指 示 汇 编 程 序 将 错 误 信 息 输 出 到 errorfile 文 件 中 。<br />

-fpu name<br />

此 选 项 选 择 目 标 浮 点 单 元 (FPU) 体 系 结 构 。 如 果 指 定 了 此 选 项 , 其<br />

将 覆 盖 由 -cpu 选 项 设 置 的 任 何 隐 含 FPU。 如 果 为 错 误 的 目 标 FPU<br />

汇 编 浮 点 指 令 , 会 生 成 错 误 或 警 告 。<br />

汇 编 程 序 设 置 与 目 标 文 件 中 的 name 相 对 应 的 编 译 属 性 。 链 接 程 序<br />

相 应 地 确 定 目 标 文 件 与 选 择 的 库 之 间 的 兼 容 性 。<br />

有 效 的 选 项 是 :<br />

none<br />

选 择 无 浮 点 选 项 。 这 将 使 汇 编 的 目 标 文 件 与 任 何 其 它 目<br />

标 文 件 兼 容 。<br />

vfp 这 是 -fpu vfpv1 的 一 个 同 义 字 。<br />

vfpv1 选 择 符 合 VFPv1 体 系 结 构 的 硬 件 向 量 浮 点 单 元 。<br />

vfpv2 选 择 符 合 VFPv2 体 系 结 构 的 硬 件 向 量 浮 点 单 元 。<br />

fpa 选 择 硬 件 浮 点 加 速 器 。<br />

softfpa 选 择 带 有 混 合 端 序 双 精 度 型 的 浮 点 库 。<br />

softvfp<br />

选 择 带 有 纯 端 序 双 精 度 型 的 软 件 浮 点 库 (FPLib)。 当 未 指<br />

定 -fpu 选 项 时 , 这 是 默 认 值 。<br />

softvfp+vfp<br />

选 择 硬 件 向 量 浮 点 单 元 。<br />

对 于 armasm 而 言 , 这 等 价 于 -fpu vfpv1。 有 关 在 链 接 时<br />

选 择 软 件 程 序 库 的 效 果 的 详 细 信 息 , 请 参 阅 <strong>RealView</strong> 编<br />

译 工 具 2.0 编 译 器 和 程 序 库 指 南 中 的 C 和 C++ 编 译 器<br />

一 章 。<br />

3-4 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


汇 编 程 序 参 考<br />

softvfp+vfpv2<br />

选 择 硬 件 向 量 浮 点 单 元 。<br />

对 于 armasm 而 言 , 这 等 价 于 -fpu vfpv2。 有 关 在 链 接 时<br />

选 择 软 件 程 序 库 的 效 果 的 详 细 信 息 , 请 参 阅 <strong>RealView</strong> 编<br />

译 工 具 2.0 编 译 器 和 程 序 库 指 南 中 的 C 和 C++ 编 译 器<br />

一 章 。<br />

-g 指 示 汇 编 程 序 生 成 DWARF2 调 试 表 。 为 了 提 供 向 后 兼 容 性 , 允 许<br />

使 用 以 下 命 令 行 选 项 , 但 不 是 必 需 的 :<br />

-dwarf2<br />

-help 指 示 汇 编 程 序 显 示 汇 编 程 序 命 令 行 选 项 的 概 要 。<br />

-i dir [,dir]…<br />

-keep<br />

向 源 文 件 搜 索 路 径 中 添 加 目 录 , 使 得 不 需 要 完 全 限 定 GET、 INCLUDE<br />

或 INCBIN 指 令 的 参 数 ( 请 参 阅 第 7-64 页 的 GET 或 INCLUDE)。<br />

指 示 汇 编 程 序 在 目 标 文 件 的 符 号 表 中 保 留 局 部 标 号 , 以 供 调 试 器 使<br />

用 ( 请 参 阅 第 7-67 页 的 KEEP)。<br />

-list [listingfile] [options]<br />

-maxcache n<br />

指 示 汇 编 程 序 将 汇 编 程 序 生 成 的 汇 编 语 言 详 细 列 表 输 出 到<br />

listingfile 文 件 中 。 如 果 指 定 - 作 为 listingfile, 则 将 列 表 发 送 到<br />

stdout 中 。 如 果 未 指 定 listingfile, 则 将 列 表 发 送 到 inputfile.lst<br />

中 。<br />

使 用 下 列 命 令 行 选 项 控 制 -list 的 行 为 :<br />

-noterse 关 闭 terse 标 志 。 当 此 选 项 为 打 开 时 , 因 条 件 汇 编 而 被 跳<br />

过 的 行 不 出 现 在 列 表 中 。 如 果 关 闭 了 terse 选 项 , 则 这 些<br />

行 出 现 在 列 表 中 。 默 认 值 是 打 开 。<br />

-width 设 置 列 表 页 面 宽 度 。 默 认 值 是 79 个 字 符 。<br />

-length 设 置 列 表 页 面 长 度 。 长 度 为 零 表 示 不 分 页 的 列 表 。 默 认 值<br />

是 66 行 。<br />

-xref 指 示 汇 编 程 序 列 出 宏 内 、 外 符 号 的 交 叉 引 用 信 息 , 包 括 定<br />

义 位 置 和 使 用 位 置 。 默 认 值 是 关 闭 。<br />

将 最 大 的 源 缓 冲 区 大 小 设 置 为 n。 默 认 值 是 8MB。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 3-5


汇 编 程 序 参 考<br />

-memaccess attributes<br />

-nocache<br />

-noesc<br />

-noregs<br />

指 定 目 标 存 储 器 系 统 的 存 储 访 问 属 性 。 默 认 值 是 允 许 字 节 、 半 字 和<br />

字 的 对 齐 加 载 和 保 存 。 attributes 修 改 默 认 值 。 它 们 可 以 是 下 面 任<br />

一 个 值 之 一 :<br />

+L41 允 许 未 对 齐 的 LDR。<br />

-L22 不 允 许 加 载 半 字 。<br />

-S22 不 允 许 存 储 半 字 。<br />

-L22-S22 不 允 许 加 载 和 存 储 半 字 。<br />

关 闭 源 高 速 缓 存 。 在 默 认 情 况 下 , 汇 编 程 序 在 第 一 次 传 递 时 缓 存 源<br />

文 件 , 并 在 第 二 次 传 递 时 从 存 储 器 中 读 取 它 们 。<br />

指 示 汇 编 程 序 忽 略 C 语 言 风 格 的 转 义 特 殊 字 符 , 例 如 \n 和 \t。<br />

指 示 汇 编 程 序 不 预 先 定 义 寄 存 器 名 称 。 请 参 阅 第 3-9 页 的 预 定 义 的<br />

寄 存 器 和 协 处 理 器 名 称 中 的 预 定 义 寄 存 器 名 称 列 表 。<br />

-nowarn 关 闭 警 告 信 息 。<br />

-o filename 命 名 输 出 目 标 文 件 。 如 果 未 指 定 此 选 项 , 那 么 汇 编 程 序 使 用 不 是 有<br />

效 的 命 令 行 选 项 的 第 二 个 命 令 行 参 数 作 为 输 出 文 件 名 称 。 如 果 没<br />

有 指 定 这 样 的 参 数 , 那 么 汇 编 程 序 创 建 inputfilename.o 形 式 的 目<br />

标 文 件 名 。<br />

-predefine "directive"<br />

指 示 汇 编 程 序 预 先 执 行 一 个 SET 命 令 。 必 须 将 directive 包 含 在 引<br />

号 中 。 请 参 阅 第 7-7 页 的 SETA、 SETL 和 SETS。<br />

汇 编 程 序 在 定 义 其 值 之 前 , 执 行 相 应 的 GBLL、 GBLS 或 GBLA 命 令 。<br />

变 量 名 是 区 分 大 小 写 的 。<br />

备 注<br />

您 的 系 统 的 命 令 行 接 口 可 能 要 求 您 输 入 特 殊 的 字 符 组 合 ( 如 \”) 来<br />

将 字 符 串 包 含 在 directive 中 。 另 外 , 可 以 使 用 -via file 来 包 含 一<br />

个 -predefine 参 数 。 命 令 行 接 口 不 改 变 来 自 -via 文 件 的 参 数 。<br />

3-6 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


汇 编 程 序 参 考<br />

-split_ldm<br />

如 果 超 过 了 传 送 的 最 大 寄 存 器 数 目 , 此 选 项 指 示 汇 编 程 序 对 LDM 和<br />

STM 指 令 做 出 错 处 理 :<br />

• 对 于 所 有 STM 以 及 未 加 载 PC 的 LDM, 最 大 数 目 是 5 ;<br />

• 对 于 加 载 PC 的 LDM, 最 大 数 目 是 4。<br />

避 免 较 大 的 多 寄 存 器 传 送 可 以 减 少 下 列 <strong>ARM</strong> 系 统 上 的 中 断 响 应<br />

时 间 :<br />

• 没 有 高 速 缓 存 或 写 缓 存 器 ( 例 如 , 没 有 高 速 缓 存 的<br />

<strong>ARM</strong>7TDMI);<br />

• 使 用 零 等 待 状 态 , 32 位 存 储 器 。<br />

备 注<br />

避 免 较 大 的 多 寄 存 器 传 送 数 目 会 增 加 代 码 大 小 并 略 微 降 低 性 能 。<br />

避 免 较 大 的 多 寄 存 器 传 送 数 目 对 有 高 速 缓 存 的 系 统 或 带 有 写 缓 存<br />

器 的 处 理 器 没 有 明 显 好 处 。<br />

避 免 较 大 的 多 寄 存 器 传 送 数 目 对 没 有 零 等 待 状 态 存 储 器 带 有 慢 速<br />

外 部 设 备 的 的 系 统 也 没 有 多 大 好 处 。 在 这 些 系 统 中 , 中 断 响 应 时 间<br />

是 由 最 慢 的 存 储 器 或 外 设 访 问 所 需 的 周 期 数 决 定 的 。 这 一 时 间 一 般<br />

远 大 于 由 多 寄 存 器 传 送 所 引 起 的 等 待 时 间 。<br />

-unsafe 允 许 汇 编 包 含 有 指 定 的 体 系 结 构 或 处 理 器 上 不 支 持 的 指 令 的 文 件 ,<br />

将 相 应 的 出 错 信 息 改 为 警 告 信 息 。 同 时 也 关 闭 了 有 关 运 算 符 优 先 级<br />

的 警 告 ( 请 参 阅 第 3-28 页 的 二 元 运 算 符 )。<br />

-via file<br />

inputfile<br />

指 示 汇 编 程 序 在 命 令 行 参 数 中 打 开 file 文 件 , 并 读 取 到 汇 编 程 序<br />

中 。 有 关 详 细 信 息 , 请 参 阅 <strong>RealView</strong> 编 译 工 具 2.0 版 编 译 器 和 程 序<br />

库 指 南 中 的 Via 文 件 语 法 附 录 。<br />

指 定 汇 编 程 序 的 输 入 文 件 。 输 入 文 件 必 须 是 <strong>ARM</strong> 或 Thumb 汇 编 语<br />

言 源 文 件 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 3-7


汇 编 程 序 参 考<br />

3.2 源 语 句 行 格 式<br />

<strong>ARM</strong> 汇 编 语 言 模 块 的 源 语 句 行 的 一 般 格 式 是 :<br />

{symbol} {instruction|directive|pseudo-instruction} {;comment}<br />

源 语 句 行 的 所 有 三 部 分 都 是 可 选 的 。<br />

指 令 不 能 从 第 一 列 开 始 。 即 使 没 有 前 缀 符 号 , 其 前 面 也 必 须 有 空 格 。<br />

可 以 用 全 大 写 字 母 编 写 指 令 , 就 像 在 本 手 册 中 一 样 。 此 外 , 可 以 用 全 小 写 字 母 编<br />

写 指 令 。 不 得 用 混 合 大 小 写 字 母 编 写 指 令 。<br />

可 以 使 用 空 行 来 使 代 码 更 具 可 读 性 。<br />

symbol 通 常 是 一 个 标 号 ( 请 参 阅 第 3-15 页 的 标 号 )。 在 指 令 和 伪 指 令 中 , 其 总<br />

是 一 个 标 号 。 在 某 些 指 令 中 , 其 是 代 表 一 个 变 量 或 常 数 的 符 号 。 在 各 种 情 况 下 ,<br />

对 指 令 进 行 说 明 都 使 程 序 更 清 晰 明 了 。<br />

symbol 必 须 从 第 一 列 开 始 , 并 且 不 能 包 含 任 何 空 白 字 符 ( 如 空 格 或 制 表 符 )<br />

( 请 参 阅 第 3-12 页 的 符 号 命 名 规 则 )。<br />

3-8 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


汇 编 程 序 参 考<br />

3.3 预 定 义 的 寄 存 器 和 协 处 理 器 名 称<br />

所 有 寄 存 器 和 协 处 理 器 名 称 都 区 分 大 小 写 。<br />

3.3.1 预 先 声 明 的 寄 存 器 名 称<br />

下 列 寄 存 器 名 称 是 预 先 声 明 的 :<br />

• r0-r15 和 R0-R15 ;<br />

• a1-a4 ( 参 数 、 结 果 或 暂 存 寄 存 器 , r0 到 r3 的 同 义 字 );<br />

• v1-v8 ( 变 量 寄 存 器 , r4 到 r11);<br />

• sb 和 SB ( 静 态 基 数 , r9);<br />

• sl 和 SL ( 堆 栈 限 制 , r10);<br />

• fp 和 FP ( 框 架 指 针 , r11);<br />

• ip 和 IP ( 程 序 内 调 用 暂 存 寄 存 器 , r12);<br />

• sp 和 SP ( 堆 栈 指 针 , r13);<br />

• lr 和 LR ( 链 接 寄 存 器 , r14);<br />

• pc 和 PC ( 程 序 计 数 器 , r15)。<br />

3.3.2 预 先 声 明 的 程 序 状 态 寄 存 器 名 称<br />

下 列 程 序 状 态 寄 存 器 名 称 是 预 先 声 明 的 :<br />

• cpsr 和 CPSR ( 当 前 程 序 状 态 寄 存 器 );<br />

• spsr 和 SPSR ( 保 存 的 程 序 状 态 寄 存 器 )。<br />

3.3.3 预 先 声 明 的 浮 点 寄 存 器 名 称<br />

下 列 浮 点 寄 存 器 名 称 是 预 先 声 明 的 :<br />

• f0-f7 和 F0-F7 (FPA 寄 存 器 );<br />

• s0-s31 和 S0-S31 (VFP 单 精 度 寄 存 器 );<br />

• d0-d15 和 D0-D15 (VFP 双 精 度 寄 存 器 )。<br />

3.3.4 预 先 声 明 的 协 处 理 器 名 称<br />

下 列 协 处 理 器 名 称 和 协 处 理 器 寄 存 器 名 称 是 预 先 声 明 的 :<br />

• p0-p15 ( 协 处 理 器 0-15);<br />

• c0-c15 ( 协 处 理 器 寄 存 器 0-15)。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 3-9


汇 编 程 序 参 考<br />

3.4 内 置 变 量<br />

表 3-1 列 出 了 由 <strong>ARM</strong> 汇 编 程 序 定 义 的 内 置 变 量 。<br />

表 3-1 内 置 变 量<br />

{PC} 或 . 当 前 指 令 的 地 址 。<br />

{VAR} 或 @ 存 储 区 域 位 置 计 数 器 的 当 前 值 。<br />

{TRUE} 逻 辑 常 数 “ 真 ”。<br />

{FALSE} 逻 辑 常 数 “ 假 ”。<br />

{OPT}<br />

{CONFIG}<br />

{ENDIAN}<br />

当 前 设 置 的 列 表 选 项 的 值 。 OPT 指 令 可 用 于 保 存 当 前 列 表 选 项 , 强 迫 改 变 其 中 的 值 , 或<br />

恢 复 其 原 始 值 。<br />

如 果 汇 编 程 序 正 在 汇 编 <strong>ARM</strong> 代 码 , 其 值 是 32, 如 果 其 正 在 汇 编 Thumb 代 码 , 则 其 值<br />

是 16。<br />

如 果 汇 编 程 序 是 大 端 模 式 , 其 值 是 big, 如 果 小 端 模 式 , 则 其 值 是 little。<br />

{CODESIZE} 是 {CONFIG} 的 一 个 同 义 字 。<br />

{CPU}<br />

{FPU}<br />

存 放 所 选 择 的 CPU 的 名 称 。 默 认 值 是 <strong>ARM</strong>7TDMI。 如 果 在 命 令 行 -cpu 选 项 中 指 定 了 一 个<br />

体 系 结 构 , 则 {CPU} 存 放 值 “Generic <strong>ARM</strong>”。<br />

存 放 所 选 择 的 FPU 的 名 称 。 默 认 值 是 SoftVFP。<br />

{ARCHITECTURE} 存 放 所 选 择 的 <strong>ARM</strong> 体 系 结 构 的 名 称 。<br />

{PCSTOREOFFSET}<br />

{<strong>ARM</strong>ASM_VERSION}<br />

是 STR pc,[...] 的 地 址 之 间 的 偏 移 , 或 者 是 STM Rb,{..., pc} 指 令 和 pc 存 储 输 出 的 地 址<br />

之 间 的 偏 移 。 这 因 所 指 定 的 CPU 或 体 系 结 构 而 变 化 。<br />

存 放 随 版 本 增 加 的 一 个 整 数 。 另 请 参 阅 第 3-11 页 的 在 汇 编 时 确 定 armasm 的 版 本<br />

|ads$version| 与 {<strong>ARM</strong>ASM_VERSION} 拥 有 相 同 的 值 , 参 见 上 文 。<br />

{INTER}<br />

{ROPI}<br />

{RWPI}<br />

{SWST}<br />

{NOSWST}<br />

如 果 设 置 了 /inter, 则 拥 有 值 [True]。 默 认 值 是 [False]。<br />

如 果 设 置 了 /ropi, 则 拥 有 值 [True]。 默 认 值 是 [False]。<br />

如 果 设 置 了 /rwpi, 则 拥 有 值 [True]。 默 认 值 是 [False]。<br />

如 果 设 置 了 /swst, 则 拥 有 值 [True]。 默 认 值 是 [False]。<br />

如 果 设 置 了 /noswst, 则 拥 有 值 [True]。 默 认 值 是 [False]。<br />

{AREANAME} 存 放 当 前 区 域 的 名 称 。<br />

3-10 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


汇 编 程 序 参 考<br />

表 3-1 内 置 变 量 ( 续 )<br />

{COMMANDLINE} 存 放 命 令 行 的 内 容 。<br />

{LINENUM} 存 放 指 示 当 前 源 文 件 中 行 号 的 一 个 整 数 。<br />

{INPUTFILE} 存 放 当 前 源 文 件 的 名 称 。<br />

不 能 使 用 SETA、 SETL 或 SETS 指 令 来 设 置 内 置 变 量 。 内 置 变 量 可 用 在 表 达 式 或 条<br />

件 中 , 例 如 :<br />

IF {ARCHITECTURE} = "4T"<br />

|ads$version| 必 须 全 部 是 小 写 。 其 它 内 置 变 量 可 以 是 大 写 、 小 写 或 混 合 大 小 写 。<br />

3.4.1 在 汇 编 时 确 定 armasm 的 版 本<br />

可 以 使 用 内 置 变 量 {<strong>ARM</strong>ASM$VERSION} 来 辨 别 armasm 的 版 本 。 但 是 ,armasm 的 前 期<br />

(SDT) 版 本 没 有 此 内 置 变 量 。<br />

如 果 您 需 要 编 译 出 代 码 的 RVCT 和 SDT 版 本 , 可 以 测 试 内 置 变 量<br />

|ads$version|。 使 用 与 下 面 类 似 的 代 码 :<br />

IF :DEF: |ads$version|<br />

; code for RVCT or ADS<br />

ELSE<br />

; code for SDT<br />

ENDIF<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 3-11


汇 编 程 序 参 考<br />

3.5 符 号<br />

可 以 使 用 符 号 来 表 示 变 量 、 地 址 和 数 字 常 数 。 表 示 地 址 的 符 号 也 称 为 标 号 。 请<br />

参 阅 :<br />

• 第 3-13 页 的 变 量 ;<br />

• 第 3-13 页 的 数 字 常 数 ;<br />

• 第 3-15 页 的 标 号 ;<br />

• 第 3-16 页 的 局 部 标 号 。<br />

3.5.1 符 号 命 名 规 则<br />

下 列 一 般 性 规 则 适 用 于 符 号 名 称 :<br />

• 可 以 在 符 号 名 称 中 使 用 大 写 字 母 、 小 写 字 母 、 数 字 字 符 或 下 划 线 字 符 ;<br />

• 除 了 在 局 部 标 号 中 外 , 请 不 要 使 用 数 字 字 符 作 为 符 号 名 称 的 第 一 个 字 符<br />

( 请 参 阅 第 3-16 页 的 局 部 标 号 );<br />

• 符 号 名 称 区 分 大 小 写 ;<br />

• 符 号 名 中 的 所 有 字 符 都 是 有 效 的 ;<br />

• 符 号 名 在 其 范 围 内 必 须 是 唯 一 的 ;<br />

• 符 号 不 得 使 用 内 置 变 量 名 或 预 定 义 符 号 名 ( 请 参 阅 第 3-9 页 的 预 定 义 的 寄<br />

存 器 和 协 处 理 器 名 称 和 第 3-10 页 的 内 置 变 量 );<br />

• 符 号 不 得 使 用 与 助 记 码 或 命 令 相 同 的 名 称 。 如 果 使 用 了 与 一 个 指 令 助 记 码<br />

或 命 令 相 同 的 名 称 , 应 使 用 双 竖 杠 来 定 界 符 号 名 。 例 如 :<br />

||ASSERT||<br />

双 竖 杠 不 是 符 号 的 一 部 分 。<br />

如 果 需 要 在 符 号 中 使 用 更 宽 的 字 符 范 围 ( 例 如 在 使 用 编 译 器 时 ), 应 使 用 单 杠 来<br />

定 界 符 号 名 。 例 如 :<br />

|.text|<br />

竖 杠 不 是 符 号 的 一 部 分 。 不 能 在 竖 杠 内 使 用 竖 杠 、 分 号 或 换 行 符 。<br />

3-12 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


汇 编 程 序 参 考<br />

3.5.2 变 量<br />

变 量 的 值 可 以 在 汇 编 过 程 中 改 变 。 有 三 种 类 型 的 变 量 :<br />

• 数 字 ;<br />

• 逻 辑 ;<br />

• 字 符 串 。<br />

变 量 的 类 型 不 能 改 变 。<br />

数 字 变 量 的 可 能 值 范 围 与 数 字 常 数 或 表 达 式 的 可 能 值 范 围 相 同 ( 请 参 阅 数 字 常<br />

数 和 第 3-20 页 的 数 字 表 达 式 )。<br />

逻 辑 变 量 的 可 能 的 值 是 {TRUE} 或 {FALSE} ( 请 参 阅 第 3-23 页 的 逻 辑 表 达 式 )。<br />

字 符 串 变 量 的 可 能 值 范 围 与 字 符 串 表 达 式 的 可 能 值 范 围 相 同 ( 请 参 阅 第 3-19 页<br />

的 字 符 串 表 达 式 )。<br />

使 用 GBLA、GBLL、GBLS、LCLA、LCLL 和 LCLS 命 令 来 声 明 表 示 变 量 的 符 号 , 并 使 用<br />

SETA、 SETL 和 SETS 命 令 为 其 赋 值 。 请 参 阅 :<br />

• 第 7-4 页 的 GBLA、 GBLL 和 GBLS ;<br />

• 第 7-6 页 的 LCLA、 LCLL 和 LCLS ;<br />

• 第 7-7 页 的 SETA、 SETL 和 SETS。<br />

3.5.3 数 字 常 数<br />

数 字 常 数 是 32 位 整 数 。 可 以 将 其 设 置 为 0 到 2 32 – 1 范 围 内 的 无 符 号 整 数 , 或 者<br />

设 置 为 –2 31 到 2 31 – 1 范 围 内 的 有 符 号 整 数 。 但 是 汇 编 程 序 不 区 分 –n 和 2 32 – n 之<br />

间 的 整 数 。 类 似 于 >= 的 关 系 运 算 符 使 用 无 符 号 解 释 。 这 意 味 着 0 > –1 关 系 式 是<br />

{FALSE}。<br />

使 用 EQU 命 令 来 定 义 常 数 ( 请 参 阅 第 7-60 页 的 EQU)。 在 定 义 了 数 字 常 数 后 ,<br />

就 不 能 改 变 其 值 。<br />

另 请 参 阅 第 3-20 页 的 数 字 表 达 式 和 第 3-21 页 的 数 字 文 本 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 3-13


汇 编 程 序 参 考<br />

3.5.4 汇 编 时 的 变 量 替 换<br />

可 以 使 用 一 个 字 符 串 变 量 表 示 整 行 汇 编 语 言 或 一 行 中 的 任 何 部 分 。 在 要 用 值 替<br />

换 变 量 的 位 置 处 使 用 带 有 $ 前 缀 的 变 量 。$ 字 符 指 示 汇 编 程 序 在 检 查 该 行 的 语 法<br />

之 前 , 用 该 字 符 串 替 换 到 源 代 码 行 中 。<br />

也 可 以 替 换 数 字 和 逻 辑 变 量 。 在 替 换 之 前 , 变 量 的 当 前 值 被 转 换 为 十 六 进 制 字<br />

符 串 ( 或 逻 辑 变 量 的 T 或 F 值 )。<br />

如 果 变 量 名 后 面 的 字 符 会 造 成 变 量 名 的 混 淆 , 可 以 使 用 点 号 来 显 式 地 标 识 一 个<br />

变 量 名 的 结 束 ( 请 参 阅 第 3-12 页 的 符 号 命 名 规 则 )。 在 使 用 变 量 之 前 , 必 须 设<br />

置 其 内 容 。<br />

如 果 需 要 使 用 不 被 替 换 的 $ 字 符 , 可 使 用 $$。 其 将 被 转 换 为 单 个 $。<br />

可 以 在 字 符 串 中 包 含 带 有 $ 前 缀 的 变 量 。 替 换 方 式 与 其 它 位 置 处 的 相 同 。<br />

在 竖 杠 内 一 般 不 进 行 替 换 , 除 非 双 引 号 内 的 竖 杠 不 影 响 替 换 。<br />

示 例<br />

; straightforward substitution<br />

GBLS add4ff<br />

;<br />

add4ff SETS "ADD r4,r4,#0xFF" ; set up add4ff<br />

$add4ff.00<br />

; invoke add4ff<br />

; this produces<br />

ADD r4,r4,#0xFF00<br />

; elaborate substitution<br />

GBLS s1<br />

GBLS s2<br />

GBLS fixup<br />

GBLA count<br />

;<br />

count SETA 14<br />

s1 SETS "a$$b$count" ; s1 now has value a$b0000000E<br />

s2 SETS "abc"<br />

fixup SETS "|xy$s2.z|" ; fixup now has value |xyabcz|<br />

|C$$code| MOV r4,#16 ; but the label here is C$$code<br />

3-14 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


汇 编 程 序 参 考<br />

3.5.5 标 号<br />

标 号 是 表 示 指 令 或 数 据 在 内 存 中 地 址 的 符 号 。 它 们 可 以 是 相 对 于 程 序 的 、 相 对 寄<br />

存 器 的 或 绝 对 的 地 址 。<br />

与 程 序 相 关 的 标 号<br />

这 些 标 号 代 表 程 序 计 数 器 , 加 上 或 减 去 一 个 数 字 常 数 。 使 用 这 些 标 号 作 为 跳 转 指<br />

令 的 目 标 , 或 者 用 于 访 问 嵌 入 在 代 码 段 里 面 的 小 型 数 据 项 。 可 以 使 用 一 个 指 令 上<br />

的 或 下 面 一 种 数 据 定 义 命 令 上 的 标 号 , 来 定 义 与 程 序 相 关 的 标 号 。 请 参 阅 :<br />

• 第 7-18 页 的 DCB ;<br />

• 第 7-19 页 的 DCD 和 DCDU ;<br />

• 第 7-21 页 的 DCFD 和 DCFDU ;<br />

• 第 7-22 页 的 DCFS 和 DCFSU ;<br />

• 第 7-23 页 的 DCI ;<br />

• 第 7-24 页 的 DCQ 和 DCQU ;<br />

• 第 7-25 页 的 DCW 和 DCWU。<br />

相 对 寄 存 器 的 标 号<br />

这 些 标 号 表 示 命 名 寄 存 器 加 上 一 个 数 字 常 数 。 它 们 最 常 用 于 访 问 数 据 段 中 的 数<br />

据 。 可 以 与 存 储 器 映 射 一 起 定 义 它 们 。 可 以 根 据 存 储 器 映 射 中 定 义 的 标 号 , 使 用<br />

EQU 命 令 来 定 义 相 对 寄 存 器 的 附 加 标 号 。 请 参 阅 :<br />

• 第 7-15 页 的 MAP ;<br />

• 第 7-17 页 的 SPACE ;<br />

• 第 7-20 页 的 DCDO ;<br />

• 第 7-60 页 的 EQU。<br />

绝 对 地 址<br />

这 些 地 址 是 数 字 常 数 。 它 们 是 0 到 2 32 –1 范 围 内 的 整 数 。 它 们 直 接 寻 址 存 储 器 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 3-15


汇 编 程 序 参 考<br />

3.5.6 局 部 标 号<br />

局 部 标 号 是 0 到 99 范 围 内 的 数 字 , 后 面 可 加 上 一 个 名 称 。 在 ELF 段 中 , 同 一 个<br />

数 字 可 用 于 表 示 多 个 局 部 标 号 。<br />

局 部 标 号 一 般 用 于 循 环 和 例 程 内 的 条 件 代 码 , 或 者 用 于 仅 局 部 使 用 的 小 子 程<br />

序 。 它 们 在 宏 命 令 中 特 别 有 用 ( 请 参 阅 第 7-27 页 的 MACRO 和 MEND)。<br />

使 用 ROUT 命 令 来 限 制 局 部 标 号 的 范 围 ( 请 参 阅 第 7-71 页 的 ROUT)。 引 用 一 个<br />

局 部 标 号 时 , 将 引 用 相 同 范 围 内 匹 配 的 标 号 。 如 果 在 该 范 围 内 的 两 个 方 向 上 都<br />

没 有 匹 配 的 标 号 , 汇 编 程 序 将 生 成 一 个 出 错 信 息 , 并 且 汇 编 失 败 。<br />

即 使 在 相 同 的 范 围 内 , 也 可 以 对 多 个 局 部 标 号 使 用 同 一 数 字 。 缺 省 情 况 下 , 汇<br />

编 程 序 将 局 部 标 号 引 用 链 接 到 :<br />

• 具 有 相 同 数 字 的 最 近 的 局 部 标 号 ( 如 果 该 范 围 内 存 在 这 种 标 号 );<br />

• 具 有 相 同 数 字 的 下 一 个 局 部 标 号 ( 如 果 该 范 围 内 没 有 前 一 个 标 号 )。<br />

如 有 必 要 可 使 用 可 选 的 参 数 修 改 此 搜 索 模 式 。<br />

语 法<br />

局 部 标 号 的 语 法 为 :<br />

n{routname}<br />

对 局 部 标 号 的 引 用 语 法 为 :<br />

%{F|B}{A|T}n{routname}<br />

其 中 :<br />

n 是 局 部 标 号 的 数 字 ;<br />

routname 是 当 前 范 围 的 名 称 ;<br />

% 产 生 引 用 ;<br />

F 指 示 汇 编 程 序 仅 向 前 搜 索 ;<br />

B 指 示 汇 编 程 序 仅 向 后 搜 索 ;<br />

A 指 示 汇 编 程 序 搜 索 所 有 宏 命 令 层 ;<br />

T 指 示 汇 编 程 序 仅 查 找 此 宏 命 令 层 。<br />

如 果 既 未 指 定 F, 也 未 指 定 B, 汇 编 程 序 先 向 后 搜 索 , 然 后 向 前 搜 索 。<br />

如 果 既 未 指 定 A, 也 未 指 定 T, 汇 编 程 序 从 当 前 层 到 最 顶 层 搜 索 所 有 宏 命 令 , 但<br />

不 搜 索 较 低 层 的 宏 命 令 。<br />

3-16 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


汇 编 程 序 参 考<br />

如 果 在 标 号 中 或 对 一 个 标 号 的 引 用 中 指 定 了 routname, 汇 编 程 序 将 其 与 最 近 的<br />

前 一 个 ROUT 命 令 的 名 称 进 行 比 较 。 如 果 不 匹 配 , 汇 编 程 序 生 成 一 个 出 错 信 息 ,<br />

并 且 汇 编 失 败 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 3-17


汇 编 程 序 参 考<br />

3.6 表 达 式 、 文 本 和 运 算 符<br />

本 节 包 含 下 列 各 个 分 节 :<br />

• 第 3-19 页 的 字 符 串 表 达 式 ;<br />

• 第 3-19 页 的 字 符 串 文 本 ;<br />

• 第 3-20 页 的 数 字 表 达 式 ;<br />

• 第 3-21 页 的 数 字 文 本 ;<br />

• 第 3-22 页 的 浮 点 文 本 ;<br />

• 第 3-23 页 的 与 寄 存 器 相 关 和 与 程 序 相 关 的 表 达 式 ;<br />

• 第 3-23 页 的 逻 辑 表 达 式 ;<br />

• 第 3-23 页 的 逻 辑 文 本 ;<br />

• 第 3-24 页 的 运 算 符 优 先 级 ;<br />

• 第 3-26 页 的 一 元 运 算 符 ;<br />

• 第 3-28 页 的 二 元 运 算 符 。<br />

3-18 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


汇 编 程 序 参 考<br />

3.6.1 字 符 串 表 达 式<br />

字 符 串 表 达 式 由 字 符 串 文 本 、 字 符 串 变 量 、 字 符 串 处 理 运 算 符 和 括 号 组 成 。 请<br />

参 阅 :<br />

• 字 符 串 文 本 ;<br />

• 第 3-13 页 的 变 量 ;<br />

• 第 3-26 页 的 一 元 运 算 符 ;<br />

• 第 3-28 页 的 字 符 串 操 作 运 算 符 ;<br />

• 第 7-7 页 的 SETA、 SETL 和 SETS。<br />

对 于 不 能 放 在 字 符 串 文 本 中 的 字 符 , 可 使 用 :CHR: 一 元 运 算 符 将 其 放 在 字 符 串 表<br />

达 式 中 。 允 许 使 用 从 0 到 255 的 任 何 ASCII 字 符 。<br />

字 符 串 表 达 式 的 值 长 度 不 能 超 过 512 个 字 符 。 其 长 度 可 以 是 零 。<br />

示 例<br />

improb SETS "literal":CC:(strvar2:LEFT:4)<br />

; sets the variable improb to the value "literal"<br />

; with the left-most four characters of the<br />

; contents of string variable strvar2 appended<br />

3.6.2 字 符 串 文 本<br />

字 符 串 文 本 由 包 含 在 双 引 号 字 符 内 的 一 系 列 字 符 组 成 。 字 符 串 文 本 的 长 度 受 输<br />

入 行 长 度 的 限 制 ( 请 参 阅 第 3-8 页 的 源 语 句 行 格 式 )。<br />

如 要 在 一 个 字 符 串 中 包 含 双 引 号 字 符 或 美 元 字 符 , 可 使 用 两 个 该 字 符 。<br />

也 可 以 使 用 C 字 符 串 转 义 序 列 , 除 非 指 定 了 -noesc 选 项 ( 请 参 阅 第 3-2 页 的 命<br />

令 语 法 )。<br />

示 例<br />

abc SETS "this string contains only one "" double quote"<br />

def SETS "this string contains only one $$ dollar symbol"<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 3-19


汇 编 程 序 参 考<br />

3.6.3 数 字 表 达 式<br />

数 字 表 达 式 由 数 字 常 数 、 数 字 变 量 、 普 通 数 字 文 本 、 二 元 运 算 符 和 括 号 组 成 。<br />

请 参 阅 :<br />

• 第 3-13 页 的 数 字 常 数 ;<br />

• 第 3-13 页 的 变 量 ;<br />

• 第 3-21 页 的 数 字 文 本 ;<br />

• 第 3-28 页 的 二 元 运 算 符 ;<br />

• 第 7-7 页 的 SETA、 SETL 和 SETS。<br />

如 果 整 个 表 达 式 的 取 值 为 不 包 含 寄 存 器 或 程 序 计 数 器 的 值 , 那 么 数 字 表 达 式 也<br />

可 以 包 含 与 寄 存 器 相 关 或 与 程 序 相 关 的 表 达 式 。<br />

数 字 表 达 式 的 取 值 为 32 位 整 数 。 可 以 将 其 解 释 为 0 到 2 32 – 1 范 围 内 的 无 符 号 整<br />

数 , 或 者 设 置 为 – 2 31 到 2 31 – 1 范 围 内 的 有 符 号 整 数 。 但 是 汇 编 程 序 不 区 分 – n<br />

和 2 32 – n 之 间 的 整 数 。 类 似 于 >= 的 关 系 运 算 符 使 用 无 符 号 解 释 。 这 意 味 着 0 ><br />

–1 关 系 式 是 {FALSE}。<br />

示 例<br />

a SETA 256*256 ; 256*256 is a numeric expression<br />

MOV r1,#(a*22) ; (a*22) is a numeric expression<br />

3-20 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


汇 编 程 序 参 考<br />

3.6.4 数 字 文 本<br />

数 字 文 本 可 以 采 用 下 面 任 一 种 形 式 :<br />

十 进 制 数 字<br />

0x 十 六 进 制 数 字<br />

& 十 六 进 制 数 字<br />

n_base-n-digits (n_ 进 制 -n- 数 字 )<br />

' 字 符 '<br />

其 中<br />

十 进 制 数 字 是 仅 使 用 0 到 9 数 字 的 字 符 序 列 。<br />

十 六 进 制 数 字 是 仅 使 用 0 到 9 的 数 字 以 及 A 到 F 或 a 到 f 的 字 母 的 字 符 序<br />

列 。<br />

n_ 是 单 个 2 与 9 之 间 的 数 字 , 后 面 跟 着 一 个 下 划 线 字 符 。<br />

base-n-digits<br />

( 底 数 -n- 数 字 ) 是 仅 使 用 0 到 (n – 1) 的 数 字 的 字 符 序 列 。<br />

字 符<br />

是 除 单 引 号 外 的 任 何 单 个 字 符 。 如 果 需 要 包 含 单 引 号 , 可 使<br />

用 \' 。 在 这 种 情 况 下 , 数 字 文 本 的 值 是 字 符 的 数 字 编 码 。<br />

不 允 许 使 用 其 它 任 何 字 符 。 字 符 序 列 的 取 值 必 须 是 0 到 2 32 – 1 范 围 内 的 整 数<br />

(DCQ 和 DCQU 命 令 除 外 , 这 些 命 令 的 范 围 是 0 到 2 64 – 1)。<br />

示 例<br />

a SETA 34906<br />

addr DCD 0xA10E<br />

LDR r4,=&1000000F<br />

DCD 2_11001010<br />

c3 SETA 8_74007<br />

DCQ 0x0123456789abcdef<br />

LDR r1,='A' ; pseudo-instruction loading 65 into r1<br />

ADD r3,r2,#'\'' ; add 39 to contents of r2, result to r3<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 3-21


汇 编 程 序 参 考<br />

3.6.5 浮 点 文 本<br />

浮 点 文 本 可 以 采 用 下 面 任 一 种 形 式 :<br />

{-}digits E{-}digits<br />

{-}{digits}.digits{E{-}digits}<br />

0xhexdigits<br />

&hexdigits<br />

其 中<br />

digits<br />

是 仅 使 用 数 字 0 到 9 的 字 符 序 列 。 可 以 用 大 写 或 小 写 编 写 E。 这 些<br />

形 式 对 应 于 常 规 的 浮 点 记 号 。<br />

hexdigits 是 仅 由 0 到 9 的 数 字 以 及 A 到 F 或 a 到 f 的 字 母 组 成 的 字 符 序 列 。<br />

这 些 形 式 对 应 于 数 字 在 计 算 机 中 的 内 部 记 号 。 使 用 这 些 形 式 来 输<br />

入 无 穷 大 和 NaN, 或 者 如 果 想 确 定 正 在 使 用 的 准 确 的 位 结 构 。<br />

单 精 度 浮 点 值 的 范 围 是 :<br />

• 最 大 值 3.40282347e+38 ;<br />

• 最 小 值 1.17549435e–38。<br />

双 精 度 浮 点 值 的 范 围 是 :<br />

• 最 大 值 1.79769313486231571e+308 ;<br />

• 最 小 值 2.22507385850720138e–308。<br />

示 例<br />

DCFD 1E308,-4E-100<br />

DCFS 1.0<br />

DCFD 3.725e15<br />

LDFS 0x7FC00000 ; Quiet NaN<br />

LDFD &FFF0000000000000 ; Minus infinity<br />

3-22 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


汇 编 程 序 参 考<br />

3.6.6 与 寄 存 器 相 关 和 与 程 序 相 关 的 表 达 式<br />

相 对 寄 存 器 的 表 达 式 的 取 值 是 一 个 命 名 的 寄 存 器 加 上 或 减 去 一 个 数 字 常 数 ( 请<br />

参 阅 第 7-15 页 的 MAP)。<br />

与 程 序 相 关 的 表 达 式 的 取 值 是 程 序 计 数 器 (pc), 加 上 或 减 去 一 个 数 字 常 数 。 其<br />

通 常 是 一 个 与 数 字 表 达 式 相 结 合 的 标 号 。<br />

示 例<br />

LDR r4,=data+4*n ; n is an assembly-time variable<br />

; code<br />

MOV pc,lr<br />

data DCD value0<br />

; n-1 DCD directives<br />

DCD valuen ; data+4*n points here<br />

; more DCD directives<br />

3.6.7 逻 辑 表 达 式<br />

逻 辑 表 达 式 由 逻 辑 文 本 ({TRUE} 或 {FALSE})、 逻 辑 变 量 、 布 尔 运 算 符 、 关 系 式<br />

和 括 号 组 合 而 成 ( 请 参 阅 第 3-31 页 的 布 尔 运 算 符 )。<br />

关 系 式 由 变 量 、 文 本 、 常 数 或 表 达 式 与 适 当 的 关 系 运 算 符 组 合 而 成 ( 请 参 阅 第<br />

3-30 页 的 关 系 运 算 符 )。<br />

3.6.8 逻 辑 文 本<br />

逻 辑 文 本 是 :<br />

• {TRUE} ;<br />

• {FALSE}。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 3-23


汇 编 程 序 参 考<br />

3.6.9 运 算 符 优 先 级<br />

本 汇 编 程 序 包 含 丰 富 的 运 算 符 集 合 , 可 用 于 表 达 式 中 。 很 多 运 算 符 与 其 在 C 等<br />

高 级 语 言 中 的 相 应 运 算 符 类 似 ( 请 参 阅 第 3-26 页 的 一 元 运 算 符 和 第 3-28 页 的<br />

二 元 运 算 符 )。<br />

在 对 其 求 值 时 有 严 格 的 优 先 级 顺 序 :<br />

1. 首 先 计 算 括 号 中 的 表 达 式 的 值 。<br />

2. 按 优 先 级 顺 序 应 用 运 算 符 。<br />

3. 对 相 邻 的 一 元 运 算 符 从 右 到 左 求 值 。<br />

4. 同 等 优 先 级 的 二 元 运 算 符 从 左 到 右 求 值 。<br />

备 注<br />

优 先 级 顺 序 与 C 语 言 中 不 完 全 相 同 。<br />

例 如 , 在 armasm 中 ,(1 + 2 :SHR; 3) 的 计 算 结 果 为 (1 + (2 :SHR: 3)) = 1。C 语 言<br />

中 的 等 价 表 达 式 的 求 值 结 果 为 ((1 + 2) >> 3) = 0。<br />

建 议 使 用 花 括 号 来 明 确 优 先 级 。<br />

表 3-2 显 示 了 armasm 中 运 算 符 的 优 先 级 顺 序 , 并 与 C 语 言 中 的 顺 序 进 行 了 比 较 。<br />

如 果 代 码 中 包 含 在 C 语 言 中 按 不 同 方 式 分 析 的 表 达 式 , armasm 通 常 给 出 一 条 警<br />

告 信 息 :<br />

A1466W: Operator precedence means that expression would evaluate differently in C<br />

如 果 使 用 了 -unsafe 命 令 行 选 项 , 就 不 产 生 此 警 告 。<br />

表 3-2 armasm 中 的 运 算 符 优 先 级<br />

armasm 优 先 级<br />

一 元 运 算 符<br />

等 价 的 C 运 算 符<br />

一 元 运 算 符<br />

* / :MOD: * / %<br />

字 符 串 操 作<br />

不 可 用<br />

:SHL: :SHR: :ROR: :ROL: ><br />

3-24 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


汇 编 程 序 参 考<br />

表 3-2 armasm 中 的 运 算 符 优 先 级<br />

armasm 优 先 级<br />

等 价 的 C 运 算 符<br />

+ - :AND: :OR: :EOR: + - & |<br />

= > >= < >= < <br />

< >=<br />

== !=<br />

&<br />

^<br />

|<br />

&&<br />

||<br />

优 先 级 最 高 的 运 算 符 位 于 列 表 顶 部 。<br />

首 先 求 优 先 级 最 高 的 运 算 符 的 值 。<br />

同 等 优 先 级 的 运 算 符 从 左 到 右 求 值 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 3-25


汇 编 程 序 参 考<br />

3.6.10 一 元 运 算 符<br />

一 元 运 算 符 拥 有 最 高 优 先 级 , 并 且 首 先 求 值 。 一 元 运 算 符 优 先 于 其 运 算 数 。 对<br />

相 邻 的 一 元 运 算 符 从 右 到 左 求 值 。<br />

表 3-4 列 出 了 一 元 运 算 符 。<br />

运 算 符 用 法 说 明<br />

? ?A 由 定 义 符 号 A 的 行 产 生 的 执 行 代 码 的 字 节 数 。<br />

表 3-4 一 元 运 算 符<br />

BASE :BASE:A 如 果 A 是 一 个 相 对 于 程 序 计 算 器 或 相 对 寄 存 器 的 表 达 式 , 那 么 BASE<br />

返 回 其 寄 存 器 分 量 的 数 值<br />

BASE 在 宏 命 令 中 最 有 用 。<br />

INDEX :INDEX:A 如 果 A 是 一 个 相 对 寄 存 器 的 表 达 式 , 那 么 INDEX 返 回 从 该 基 址 寄 存<br />

器 的 偏 移 值 。<br />

INDEX 在 宏 命 令 中 最 有 用 。<br />

+ 和 - +A<br />

-A<br />

一 元 加 法 。 一 元 减 法 。 + 和 – 可 作 用 在 数 字 和 与 程 序 相 关 的 表 达<br />

式 上 。<br />

LEN :LEN:A 字 符 串 A 的 长 度 。<br />

CHR :CHR:A 一 个 字 符 的 字 符 串 , ASCII 码 A。<br />

STR :STR:A A 的 十 六 进 制 字 符 串 。<br />

NOT :NOT:A A 的 按 位 补 码 。<br />

LNOT :LNOT:A A 的 逻 辑 补 码 。<br />

STR 返 回 与 数 字 表 达 式 对 应 的 八 位 十 六 进 制 字 符 串 , 或 者 如 果 用 在<br />

逻 辑 表 达 式 上 则 返 回 "T" 或 "F"。<br />

DEF :DEF:A { 如 果 定 义 了 A 则 返 回 {TRUE}, 否 则 返 回 {FALSE}。<br />

SB_OFFSET_19_12 :SB_OFFSET_19_12: 标 号 ( 标 号 – sb) 的 [19:12] 位 。 请 参 阅 第 3-27 页 的 使 用<br />

:SB_OFFSET_19_12: 和 :SB_OFFSET_11_ 0 的 示 例<br />

SB_OFFSET_11_0 :SB_OFFSET_11_0: label ( 标 号 – sb) 的 低 位 12 字 节 。<br />

3-26 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


汇 编 程 序 参 考<br />

使 用 :SB_OFFSET_19_12: 和 :SB_OFFSET_11_ 0 的 示 例<br />

MyIndex EQU 0<br />

AREA area1, CODE<br />

LDR IP, [SB, #0]<br />

LDR IP, [IP, #MyIndex]<br />

ADD IP, IP, # :SB_OFFSET_19_12: label<br />

LDR PC, [IP, # :SB_OFFSET_11_0: label]<br />

AREA area2, DATA<br />

label<br />

IMPORT FunctionAddress<br />

DCD FunctionAddress<br />

END<br />

这 些 运 算 符 只 能 用 于 ADD 和 LDR 命 令 中 。 它 们 只 能 按 所 说 明 的 方 式 使 用 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 3-27


汇 编 程 序 参 考<br />

3.6.11 二 元 运 算 符<br />

二 元 运 算 符 写 在 其 运 算 的 一 对 子 表 达 式 之 间 。<br />

二 元 运 算 符 的 优 先 级 比 一 元 运 算 符 低 。 二 元 运 算 符 在 按 优 先 级 顺 序 出 现 在 本 节 。<br />

备 注<br />

优 先 级 顺 序 与 C 语 言 中 不 相 同 , 请 参 阅 第 3-24 页 的 运 算 符 优 先 级 。<br />

乘 法 运 算 符<br />

乘 法 运 算 符 在 所 有 二 元 运 算 符 中 拥 有 最 高 的 优 先 级 。 其 只 作 用 在 数 字 表 达 式 上 。<br />

表 3-5 说 明 乘 法 运 算 符 。<br />

表 3-5 乘 法 运 算 符<br />

运 算 符 用 法 说 明<br />

* A*B 乘 法<br />

/ A/B 除 法<br />

MOD A:MOD:B A 对 B 的 模<br />

字 符 串 操 作 运 算 符<br />

表 3-6 说 明 字 符 串 操 作 运 算 符 。<br />

在 分 块 运 算 符 LEFT 和 RIGHT 中 :<br />

• A 必 须 是 一 个 字 符 串 ;<br />

• B 必 须 是 一 个 数 字 表 达 式 。<br />

在 CC 中 , A 和 B 都 必 须 是 字 符 串 。<br />

表 3-6 字 符 串 操 作 运 算 符<br />

运 算 符 用 法 说 明<br />

LEFT A:LEFT:B A 的 最 左 边 B 个 字 符<br />

RIGHT A:RIGHT:B A 的 最 右 边 B 个 字 符<br />

CC A:CC:B 将 B 连 接 到 A 的 末 尾<br />

3-28 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


汇 编 程 序 参 考<br />

移 位 运 算 符<br />

移 位 运 算 符 作 用 在 数 字 表 达 式 上 , 移 位 或 循 环 第 一 个 操 作 数 , 移 动 位 数 由 第 二<br />

个 操 作 数 指 定 。<br />

表 3-7 说 明 移 位 运 算 符 。<br />

表 3-7 移 位 运 算 符<br />

运 算 符 用 法 说 明<br />

ROL A:ROL:B 将 A 向 左 循 环 B 位<br />

ROR A:ROR:B 将 A 向 右 循 环 B 位<br />

SHL A:SHL:B 将 A 向 左 移 B 位<br />

SHR A:SHR:B 将 A 向 右 移 B 位<br />

备 注<br />

SHR 是 逻 辑 移 位 , 不 扩 展 符 号 位 。<br />

加 法 、 减 法 和 逻 辑 运 算 符<br />

加 法 和 减 法 运 算 符 作 用 在 数 字 表 达 式 上 。<br />

逻 辑 运 算 符 作 用 在 数 字 表 达 式 。 运 算 是 按 位 执 行 的 , 也 即 产 生 的 结 果 不 依 赖 于<br />

运 算 数 的 每 个 位 。<br />

表 3-8 说 明 加 法 、 减 法 和 逻 辑 运 算 符 。<br />

表 3-8 加 法 、 减 法 和 逻 辑 运 算 符<br />

运 算 符 用 法 说 明<br />

+ A+B 将 A 加 到 B 上<br />

- A-B 从 A 减 去 B<br />

AND A:AND:B A 和 B 按 位 与<br />

OR A:OR:B A 和 B 按 位 或<br />

EOR A:EOR:B A 和 B 按 位 异 或<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 3-29


汇 编 程 序 参 考<br />

关 系 运 算 符<br />

表 3-9 说 明 关 系 运 算 符 。 关 系 运 算 符 作 用 在 相 同 类 型 的 两 个 运 算 数 上 , 以 产 生<br />

一 个 逻 辑 值 。<br />

运 算 数 可 以 是 下 列 类 型 之 一 :<br />

• 数 字 ;<br />

• 相 对 程 序 的 ;<br />

• 相 对 寄 存 器 的 ;<br />

• 字 符 串 。<br />

字 符 串 按 ASCII 顺 序 排 序 。 如 果 字 符 串 A 是 字 符 串 B 的 前 导 子 串 , 或 者 如 果 使<br />

两 个 字 符 串 产 生 差 异 的 A 的 最 左 边 字 符 小 于 B 的 最 左 边 字 符 , 那 么 A 小 于 B。<br />

算 术 值 是 无 符 号 的 , 因 此 表 达 式 0>-1 的 值 是 {FALSE}。<br />

运 算 符 用 法 说 明<br />

= A=B A 等 于 B<br />

> A>B A 大 于 B<br />

>= A>=B A 大 于 或 等 于 B<br />

< A


汇 编 程 序 参 考<br />

布 尔 运 算 符<br />

这 些 运 算 符 拥 有 最 低 的 优 先 级 。 它 们 对 其 运 算 数 执 行 标 准 的 逻 辑 运 算 。<br />

在 所 有 三 种 情 况 下 , A 和 B 必 须 是 值 为 {TRUE} 或 {FALSE} 的 表 达 式 。<br />

表 3-10 说 明 布 尔 运 算 符 。<br />

表 3-10 布 尔 运 算 符<br />

运 算 符 用 法 说 明<br />

LAND A:LAND:B A 和 B 的 逻 辑 与<br />

LOR A:LOR:B A 和 B 的 逻 辑 或<br />

LEOR A:LEOR:B A 和 B 的 逻 辑 异 或<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 3-31


汇 编 程 序 参 考<br />

3-32 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


第 4 章<br />

<strong>ARM</strong> 指 令 参 考<br />

本 章 介 绍 <strong>ARM</strong> 汇 编 程 序 所 支 持 的 <strong>ARM</strong> 指 令 。 其 中 包 含 以 下 各 节 :<br />

• 第 4-6 页 的 条 件 执 行 ;<br />

• 第 4-8 页 的 <strong>ARM</strong> 存 储 器 访 问 指 令 ;<br />

• 第 4-32 页 的 <strong>ARM</strong> 通 用 数 据 处 理 指 令 ;<br />

• 第 4-51 页 的 <strong>ARM</strong> 乘 法 指 令 ;<br />

• 第 4-77 页 的 <strong>ARM</strong> 饱 和 指 令 ;<br />

• 第 4-82 页 的 <strong>ARM</strong> 并 行 指 令 ;<br />

• 第 4-90 页 的 <strong>ARM</strong> 组 合 和 分 离 指 令 ;<br />

• 第 4-97 页 的 <strong>ARM</strong> 跳 转 指 令 ;<br />

• 第 4-103 页 的 协 处 理 器 指 令 ;<br />

• 第 4-113 页 的 其 它 <strong>ARM</strong> 指 令 ;<br />

• 第 4-122 页 的 <strong>ARM</strong> 伪 指 令 。<br />

参 阅 第 4-2 上 的 表 4-1 查 找 单 个 指 令 和 伪 指 令 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-1


<strong>ARM</strong> 指 令 参 考<br />

表 4-1 <strong>ARM</strong> 指 令 的 位 置<br />

助 记 码 简 单 描 述 页 码 体 系 结 构 a<br />

ADC、 ADD 带 进 位 的 加 法 , 加 法 第 4-36 页 全 部<br />

ADR 伪 指 令 装 载 相 对 程 序 的 或 相 对 寄 存 器 的 地 址 ( 短 范 围 ) 第 4-123 页 全 部<br />

ADRL 伪 指 令<br />

将 相 对 程 序 的 或 相 对 寄 存 器 的 地 址 装 载 到 一 个 寄 存<br />

器 中 ( 中 等 范 围 )<br />

第 4-124 页<br />

AND 逻 辑 “ 与 ” 第 4-39 页 全 部<br />

B 跳 转 第 4-98 页 全 部<br />

BIC 位 清 除 第 4-39 页 全 部<br />

BKPT 断 点 第 4-120 页 5<br />

BL 带 链 接 的 跳 转 第 4-98 页 全 部<br />

BLX 跳 转 、 链 接 和 交 换 第 4-100 页 5T b<br />

BX 跳 转 和 交 换 第 4-99 页 4T b<br />

CDP, CDP2 协 处 理 器 数 据 操 作 第 4-104 页 2, 5<br />

CLZ 计 算 前 导 零 数 目 第 4-47 页 5<br />

CMN, CMP 负 向 比 较 , 比 较 第 4-43 页 全 部<br />

CPS 更 改 处 理 器 状 态 第 4-117 页 6<br />

CPY 复 制 第 4-41 页 6<br />

EOR 异 或 第 4-39 页 全 部<br />

LDC, LDC2 装 载 协 处 理 器 第 4-109 页 2, 5<br />

LDM 装 载 多 个 寄 存 器 第 4-20 页 全 部<br />

LDR 装 载 寄 存 器 第 4-8 页 全 部<br />

LDR 伪 指 令 装 载 寄 存 器 伪 指 令 第 4-122 页 全 部<br />

LDREX 独 占 装 载 寄 存 器 第 4-28 页 6<br />

MAR 从 寄 存 器 移 动 到 40 位 累 加 器 第 4-121 页 XScale c<br />

MCR,MCR2,MCRR,MCRR2 从 寄 存 器 移 动 到 协 处 理 器 第 4-105 页 2、 5、 5E d 、 6<br />

MIA、 MIAPH、 MIAxy 带 内 部 40 位 累 加 的 乘 法 第 4-75 页 XScale<br />

MLA 乘 加 第 4-53 页 2<br />

MOV 移 动 第 4-41 页 全 部<br />

全 部<br />

4-2 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

表 4-1 <strong>ARM</strong> 指 令 的 位 置 ( 续 )<br />

助 记 码 简 单 描 述 页 码 体 系 结 构 a<br />

MRA 从 40 位 累 加 器 移 动 到 寄 存 器 第 4-121 页 XScale<br />

MRC、 MRC2 从 协 处 理 器 移 动 到 寄 存 器 第 4-107 页 2, 5<br />

MRRC、 MRRC2 从 协 处 理 器 移 动 到 2 个 寄 存 器 第 4-108 页 5E d 、 6<br />

MRS 从 PSR 移 动 到 寄 存 器 第 4-115 页 3<br />

MSR 从 寄 存 器 移 动 到 PSR 第 4-116 页 3<br />

MUL 乘 法 第 4-53 页 2<br />

MVN 取 反 移 动 第 4-41 页 全 部<br />

NOP 伪 指 令 生 成 首 选 的 无 操 作 代 码 。 第 4-129 页 全 部<br />

ORR 逻 辑 “ 或 ” 第 4-39 页 全 部<br />

PKHBT、 PKHTB 组 合 半 字 第 4-95 页 6<br />

PLD 缓 存 预 载 第 4-22 页 5E d<br />

QADD、QDADD、QDSUB、QSUB 饱 和 算 法 第 4-78 页 5ExP e<br />

QADD8、 QADD16、<br />

QADDSUBX、 QSUB8、<br />

QSUB16、 QSUBADDX<br />

字 节 方 式 和 半 字 方 式 的 并 行 有 符 号 饱 和 算 法 第 4-83 页 6<br />

REV、 REV16、 REVSH 反 转 字 节 次 序 第 4-50 页 6<br />

RFE 从 异 常 中 返 回 第 4-26 页 6<br />

RSB、 RSC、 SBC 反 向 减 法 、 带 进 位 的 反 向 减 法 、 带 进 位 的 减 法 第 4-36 页 全 部<br />

SADD8、SADD16、SADDSUBX 字 节 方 式 和 半 字 方 式 的 并 行 有 符 号 算 法 第 4-83 页 6<br />

SADD8TO16、 SADD8TO32、<br />

SADD16TO32<br />

符 号 扩 展 和 加 法 第 4-93 页 6<br />

SEL 根 据 CPSR GE 标 志 选 择 字 节 第 4-48 页 6<br />

SETEND 设 置 存 储 器 访 问 的 端 序 第 4-119 页 6<br />

SHADD8、 SHADD16、<br />

SHADDSUBX、<br />

SHSUB8、 SHSUB16、<br />

SHSUBADDX<br />

SMLAD<br />

字 节 方 式 和 半 字 方 式 的 并 行 有 符 号 均 分 算 法 第 4-83 页 6<br />

两 个 有 符 号 乘 加<br />

(32


<strong>ARM</strong> 指 令 参 考<br />

表 4-1 <strong>ARM</strong> 指 令 的 位 置 ( 续 )<br />

助 记 码 简 单 描 述 页 码 体 系 结 构 a<br />

SMLALD<br />

两 个 有 符 号 长 整 数 乘 加<br />

(64


<strong>ARM</strong> 指 令 参 考<br />

表 4-1 <strong>ARM</strong> 指 令 的 位 置 ( 续 )<br />

助 记 码 简 单 描 述 页 码 体 系 结 构 a<br />

SWP 交 换 寄 存 器 和 存 储 器 第 4-31 页 3<br />

TEQ、 TST 相 等 测 试 、 测 试 第 4-45 页 全 部<br />

UADD8、UADD16、UADDSUBX 字 节 方 式 和 半 字 方 式 的 并 行 无 符 号 算 法 第 4-83 页 6<br />

UADD8TO16、 UADD8TO32、<br />

UADD16TO32<br />

UHADD8、 UHADD16、<br />

UHADDSUBX,<br />

UHSUB8、 UHSUB16、<br />

UHSUBADDX<br />

零 扩 展 和 加 法 第 4-93 页 6<br />

字 节 方 式 和 半 字 方 式 的 并 行 无 符 号 均 分 算 法 第 4-83 页 6<br />

UMAAL<br />

无 符 号 乘 加 , 长 整 数 累 加<br />

(64


<strong>ARM</strong> 指 令 参 考<br />

4.1 条 件 执 行<br />

几 乎 所 有 <strong>ARM</strong> 指 令 都 可 包 含 可 选 的 条 件 码 。 这 在 语 法 描 述 中 表 示 为 {cond}。 只<br />

有 CPSR 中 的 条 件 码 标 志 满 足 指 定 的 条 件 时 , 才 会 执 行 带 有 条 件 码 的 指 令 。 可 用<br />

的 条 件 码 如 表 4-2 所 示 。<br />

后 缀 标 志 含 义<br />

EQ Z 设 置 等 于<br />

NE Z 清 除 不 等 于<br />

表 4-2 <strong>ARM</strong> 条 件 码<br />

CS/HS C 设 置 大 于 或 等 于 ( 无 符 号 的 >= )<br />

CC/LO C 清 除 小 于 ( 无 符 号 的


<strong>ARM</strong> 指 令 参 考<br />

有 些 指 令 只 更 新 标 志 的 一 个 子 集 。 其 它 标 志 不 被 这 些 指 令 改 变 。 在 指 令 的 描 述 中<br />

提 供 了 详 细 信 息 。<br />

可 以 根 据 其 它 指 令 中 设 置 的 标 志 , 有 条 件 地 执 行 一 个 指 令 , 或 者 :<br />

• 在 更 新 标 志 的 指 令 后 立 即 执 行<br />

• 在 任 意 数 目 的 未 更 新 标 志 的 插 入 指 令 之 后 执 行 。<br />

有 关 详 细 信 息 , 请 参 阅 第 2-22 页 的 条 件 执 行 。<br />

4.1.1 Q 标 志<br />

Q 标 志 只 存 在 于 5TE 版 、6 版 及 更 高 版 本 的 <strong>ARM</strong> 体 系 结 构 中 。 它 用 于 检 测 特 殊<br />

饱 和 算 法 指 令 中 的 饱 和 状 态 ( 参 阅 第 4-78 页 的 QADD、 QSUB、 QDADD 和<br />

QDSUB) 或 某 些 乘 法 指 令 中 的 溢 出 ( 参 阅 第 4-58 页 的 SMLAxy 和 第 4-61 页 的<br />

SMLAWy)。<br />

Q 标 志 是 一 个 粘 性 标 志 。 虽 然 这 些 指 令 可 设 置 标 志 , 但 它 们 不 能 清 除 标 志 。 您 可<br />

以 执 行 一 系 列 这 种 指 令 , 然 后 测 试 标 志 , 以 找 出 是 否 在 其 中 的 某 点 发 生 了 饱 和 或<br />

溢 出 , 而 无 需 在 每 条 指 令 之 后 检 查 标 志 。<br />

要 清 除 Q 标 志 , 可 使 用 MSR 指 令 ( 参 阅 第 4-116 页 的 MSR)。<br />

不 能 通 过 条 件 码 来 直 接 测 试 Q 标 志 的 状 态 。 要 读 取 Q 标 志 的 状 态 , 请 使 用 MRS<br />

指 令 ( 参 阅 第 4-115 页 的 MRS)。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-7


<strong>ARM</strong> 指 令 参 考<br />

4.2 <strong>ARM</strong> 存 储 器 访 问 指 令<br />

本 节 包 含 下 列 各 个 小 节 :<br />

• 第 4-9 页 的 LDR 和 STR, 字 和 无 符 号 字 节<br />

装 载 寄 存 器 和 存 储 寄 存 器 , 32 位 字 或 8 位 无 符 号 字 节 。<br />

• 第 4-14 页 的 LDR 和 STR, 半 字 和 有 符 号 字 节<br />

装 载 寄 存 器 , 8 位 有 符 号 字 节 和 有 符 号 及 无 符 号 16 位 半 字 。<br />

存 储 寄 存 器 , 16 位 半 字 。<br />

• 第 4-17 页 的 LDR 和 STR, 双 字<br />

装 载 两 个 连 续 的 寄 存 器 和 存 储 两 个 连 续 的 寄 存 器 。<br />

• 第 4-20 页 的 LDM 和 STM<br />

装 载 和 存 储 多 个 寄 存 器 。<br />

• 第 4-22 页 的 PLD<br />

缓 存 预 载 。<br />

• 第 4-24 页 的 SRS<br />

存 储 返 回 状 态 。<br />

• 第 4-26 页 的 RFE<br />

从 异 常 中 返 回 。<br />

• 第 4-28 页 的 LDREX 和 STREX<br />

独 占 装 载 和 存 储 寄 存 器 。<br />

• 第 4-31 页 的 SWP 和 SWPB<br />

在 寄 存 器 和 存 储 器 之 间 交 换 数 据 。<br />

备 注<br />

还 有 一 个 LDR 伪 指 令 ( 参 阅 第 4-126 页 的 LDR <strong>ARM</strong> 伪 指 令 )。 此 伪 指 令 或 者 汇<br />

编 为 LDR 指 令 , 或 者 汇 编 为 MOV 或 MVN 指 令 。<br />

4-8 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.2.1 LDR 和 STR, 字 和 无 符 号 字 节<br />

装 载 寄 存 器 和 存 储 寄 存 器 , 32 位 字 或 8 位 无 符 号 字 节 。 字 节 装 载 值 用 零 扩 展 为<br />

32 位 。<br />

备 注<br />

另 请 参 阅 第 4-122 页 的 <strong>ARM</strong> 伪 指 令 。<br />

语 法<br />

LDR 和 STR 都 有 四 种 可 能 的 形 式 :<br />

• 零 偏 移<br />

• 前 索 引 的 偏 移<br />

• 相 对 程 序 的<br />

• 后 索 引 的 偏 移<br />

四 种 形 式 的 语 法 ( 按 同 一 顺 序 ) 是 :<br />

op{cond}{B}{T} Rd, [Rn]<br />

op{cond}{B} Rd, [Rn, FlexOffset]{!}<br />

op{cond}{B} Rd, label<br />

op{cond}{B}{T} Rd, [Rn], FlexOffset<br />

其 中 :<br />

op 是 LDR ( 装 载 寄 存 器 ) 或 STR ( 存 储 寄 存 器 )。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

B<br />

T<br />

是 一 个 可 选 的 后 缀 。 如 果 存 在 B, 则 传 送 Rd 的 最 低 位 字 节 。 如 果 op<br />

是 LDR, 则 清 除 Rd 的 其 它 字 节 。<br />

否 则 传 送 一 个 32 位 字 。<br />

是 一 个 可 选 的 后 缀 。 如 果 存 在 T, 那 么 存 储 器 系 统 处 理 访 问 的 方 式<br />

如 同 处 理 器 处 于 [User] 模 式 下 的 处 理 方 式 , 即 便 它 处 于 特 权 模 式<br />

( 参 阅 第 2-4 页 的 处 理 器 模 式 ) 也 是 如 此 。 在 [User] 模 式 下 , 没 有<br />

影 响 。 不 能 将 T 与 前 索 引 偏 移 一 起 使 用 。<br />

Rd 是 要 装 载 或 保 存 的 <strong>ARM</strong> 寄 存 器 。<br />

Rn 是 保 存 存 储 器 基 地 址 的 寄 存 器 。<br />

如 果 指 令 是 以 下 情 形 之 一 , 则 Rn 不 得 与 Rd 相 同 :<br />

• 是 带 回 写 的 前 索 引 的 (! 后 缀 )<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-9


<strong>ARM</strong> 指 令 参 考<br />

FlexOffset<br />

label<br />

• 是 后 索 引 的<br />

• 使 用 T 后 缀 。<br />

是 应 用 到 Rn 中 的 值 上 的 可 变 偏 移 ( 参 阅 第 4-11 页 的 灵 活 的 偏 移 语<br />

法 )。<br />

是 一 个 相 对 程 序 的 表 达 式 。 有 关 详 细 信 息 请 参 阅 第 3-23 页 的 与 寄 存<br />

器 相 关 和 与 程 序 相 关 的 表 达 式 。<br />

label 必 须 位 于 当 前 指 令 的 ±4KB 范 围 内 。<br />

! 是 一 个 可 选 的 后 缀 。 如 果 存 在 ! 后 缀 , 则 包 含 偏 移 的 地 址 被 写 回 到<br />

Rn 中 。 如 果 Rn 是 r15, 则 不 能 使 用 ! 后 缀 。<br />

零 偏 移<br />

Rn 中 的 值 被 用 作 传 送 地 址 。<br />

前 索 引 偏 移<br />

在 发 生 数 据 传 送 之 前 , 将 该 偏 移 应 用 到 Rn 中 的 值 上 。 所 得 结 果 用 作 传 送 的 存 储<br />

器 地 址 。 如 果 存 在 ! 后 缀 , 则 将 结 果 写 回 到 Rn 中 。 如 果 使 用 ! 后 缀 , 则 Rn 不 能<br />

是 r15。<br />

相 对 程 序<br />

这 是 前 索 引 形 式 的 另 一 种 版 本 。 汇 编 程 序 计 算 相 对 于 PC 的 偏 移 量 , 并 将 PC 作<br />

为 Rn, 生 成 前 索 引 的 指 令 。<br />

不 能 使 用 ! 后 缀 。<br />

后 索 引 偏 移<br />

Rn 中 的 值 被 用 作 传 送 的 存 储 器 地 址 。 在 发 生 数 据 传 送 之 后 , 将 该 偏 移 应 用 到 Rn<br />

中 的 值 上 。 将 结 果 写 到 Rn 中 。 Rn 不 能 是 r15。<br />

4-10 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

灵 活 的 偏 移 语 法<br />

前 索 引 偏 移 和 后 索 引 偏 移 都 可 以 是 下 列 形 式 :<br />

#expr<br />

{-}Rm{, shift}<br />

其 中 :<br />

- 是 一 个 可 选 的 减 号 。 如 果 存 在 -, 则 从 Rn 中 减 去 偏 移 量 。 否 则 将 偏<br />

移 量 加 到 Rn 中 。<br />

expr 是 一 个 表 达 式 , 其 取 值 为 -4095 到 +4095 范 围 内 的 整 数 。 这 通 常 是<br />

一 个 数 值 常 数 ( 参 见 下 面 的 示 例 )。<br />

Rm 是 一 个 寄 存 器 , 包 含 要 用 作 偏 移 量 的 一 个 值 。 Rm 不 能 是 r15。<br />

shift 是 一 个 要 应 用 到 Rm 上 的 可 选 移 位 。 它 可 以 是 下 列 选 项 之 一 :<br />

ASR #n 算 术 右 移 n 位 。 1 ≤ n ≤ 32。<br />

LSL #n 逻 辑 左 移 n 位 。 0 ≤ n ≤ 31。<br />

LSR #n 逻 辑 右 移 n 位 。 1 ≤ n ≤ 32。<br />

ROR #n 循 环 右 移 n 位 。 1 ≤ n ≤ 31。<br />

RRX 循 环 右 移 一 位 , 带 扩 展 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-11


<strong>ARM</strong> 指 令 参 考<br />

字 传 送 时 的 地 址 对 齐<br />

在 大 多 数 情 况 下 , 必 须 确 保 32 位 传 送 的 地 址 是 32 位 字 对 齐 的 。<br />

如 果 系 统 含 有 系 统 协 处 理 器 (cp15), 则 可 以 启 用 对 齐 检 查 。 如 果 启 用 了 对 齐 检<br />

查 , 那 么 非 字 对 齐 的 32 位 传 送 将 导 致 对 齐 异 常 。<br />

如 果 系 统 没 有 系 统 协 处 理 器 (cp15), 或 者 禁 用 了 对 齐 检 查 , 那 么 :<br />

• 对 于 STR, 将 指 定 的 地 址 向 下 舍 入 为 4 的 倍 数 。<br />

• 对 于 LDR:<br />

1. 将 指 定 的 地 址 向 下 舍 入 为 4 的 倍 数 。<br />

2. 从 产 生 的 结 果 地 址 中 装 载 四 字 节 数 据 。<br />

3. 根 据 该 地 址 的 [1:0] 位 , 将 装 载 的 数 据 向 右 循 环 移 位 一 、 二 或 三 个 字<br />

节 。<br />

对 于 小 端 存 储 器 系 统 , 这 样 会 使 寻 址 的 字 节 占 用 寄 存 器 的 最 低 位 字 节 。<br />

对 于 大 端 存 储 器 系 统 , 这 样 会 使 寻 址 的 字 节 占 用 :<br />

— [31:24] 位 , 如 果 地 址 的 [0] 位 是 0<br />

— [15:8] 位 , 如 果 地 址 的 [0] 位 是 1<br />

装 载 到 r15 中<br />

装 载 到 r15 ( 程 序 计 数 器 ) 中 会 造 成 指 令 在 所 装 载 地 址 处 发 生 跳 转 。<br />

所 装 载 值 的 [1:0] 位 :<br />

• 在 v3 及 更 低 版 本 的 体 系 结 构 中 被 忽 略 ;<br />

• 在 v4 体 系 结 构 中 必 须 是 零 。<br />

在 v5 及 更 高 版 本 的 体 系 结 构 中 :<br />

• 装 载 到 r15 的 值 的 [1:0] 位 必 须 不 能 为 值 0b10 ;<br />

• 如 果 已 设 置 了 装 载 到 r15 的 值 的 [0] 位 , 则 处 理 器 改 变 到 Thumb 状 态 。<br />

当 装 载 到 r15 中 时 , 不 能 使 用 B 或 T 后 缀 。<br />

4-12 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

从 r15 中 保 存<br />

一 般 情 况 下 , 尽 可 能 避 免 从 r15 中 保 存 。<br />

如 果 确 实 保 存 了 r15 中 的 值 , 则 所 保 存 的 是 当 前 指 令 的 地 址 , 另 加 上 一 个 由 实 现<br />

定 义 的 常 数 。 对 于 特 定 的 处 理 器 , 该 常 数 总 是 相 同 的 。<br />

如 果 汇 编 代 码 可 以 用 在 不 同 的 处 理 器 上 , 可 以 用 类 似 以 下 的 代 码 来 查 看 该 常 数<br />

在 运 行 时 的 值 :<br />

SUB R1, PC, #4 ; R1 = address of following STR instruction<br />

STR PC, [R0] ; Store address of STR instruction + offset,<br />

LDR R0, [R0] ; then reload it<br />

SUB R0, R0, R1 ; Calculate the offset as the difference<br />

如 果 汇 编 代 码 要 用 于 某 个 特 定 处 理 器 上 , 在 armasm 中 可 以 用 {PCSTOREOFFSET} 获 得<br />

该 常 数 的 值 。<br />

体 系 结 构<br />

这 些 指 令 在 所 有 版 本 的 <strong>ARM</strong> 体 系 结 构 中 有 效 。<br />

在 v5 及 更 高 版 本 体 系 结 构 的 T 变 体 中 , 如 果 设 置 了 装 载 值 的 [0] 位 , 那 么 装 载<br />

到 r15 会 导 致 处 理 器 改 为 执 行 Thumb 指 令 。<br />

示 例<br />

LDR r8,[r10] ; loads r8 from the address in r10.<br />

LDRNE r2,[r5,#960]! ; (conditionally) loads r2 from a word<br />

; increments r5 by 960.<br />

STR r2,[r9,#consta-struc] ; consta-struc is an expression evaluating<br />

; to a constant in the range 0-4095.<br />

STRB<br />

r0,[r3,-r8,ASR #2] ; stores the least significant byte from<br />

; r0 to a byte at an address equal to<br />

; contents(r3) minus contents(r8)/4.<br />

; r3 and r8 are not altered.<br />

STR r5,[r7],#-8 ; stores a word from r5 to the address<br />

; in r7, and then decrements r7 by 8.<br />

LDR r0,localdata ; loads a word located at label localdata<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-13


<strong>ARM</strong> 指 令 参 考<br />

4.2.2 LDR 和 STR, 半 字 和 有 符 号 字 节<br />

装 载 寄 存 器 , 8 位 有 符 号 字 节 和 有 符 号 及 无 符 号 16 位 半 字 。<br />

存 储 寄 存 器 , 16 位 半 字 。<br />

有 符 号 装 载 值 用 符 号 扩 展 为 32 位 。 无 符 号 装 载 值 用 零 扩 展 为 32 位 。<br />

语 法<br />

这 些 指 令 有 四 种 可 能 的 形 式 :<br />

• 零 偏 移<br />

• 前 索 引 偏 移<br />

• 相 对 程 序<br />

• 后 索 引 偏 移<br />

四 种 形 式 的 语 法 ( 按 相 同 的 顺 序 ) 是 :<br />

op{cond}type Rd, [Rn]<br />

op{cond}type Rd, [Rn, Offset]{!}<br />

op{cond}type Rd, label<br />

op{cond}type Rd, [Rn], Offset<br />

其 中 :<br />

op<br />

是 LDR 或 STR。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

type 必 须 是 下 面 几 个 值 之 一 :<br />

SH 用 于 有 符 号 半 字 ( 仅 LDR 适 用 )<br />

H 用 于 无 符 号 半 字<br />

SB 用 于 有 符 号 字 节 ( 仅 LDR 适 用 )<br />

Rd 是 要 装 载 或 存 储 的 <strong>ARM</strong> 寄 存 器 。<br />

Rn 是 作 为 存 储 器 地 址 的 基 址 的 寄 存 器 。<br />

如 果 指 令 是 以 下 两 种 情 况 之 一 , 则 Rn 不 得 与 Rd 相 同 :<br />

• 带 回 写 的 前 索 引 的 ;<br />

• 后 索 引 的 。<br />

4-14 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

label 是 一 个 相 对 程 序 的 表 达 式 。 有 关 详 细 信 息 请 参 阅 第 3-23 页 的 与 寄 存<br />

器 相 关 和 与 程 序 相 关 的 表 达 式 。label 必 须 位 于 当 前 指 令 的 ±255 字<br />

节 范 围 内 。<br />

Offset 是 应 用 到 Rn 中 的 值 上 的 一 个 偏 移 ( 参 阅 偏 移 量 语 法 )。<br />

! 是 一 个 可 选 的 后 缀 。 如 果 存 在 !, 则 包 含 偏 移 的 地 址 被 写 回 到 Rn<br />

中 。 如 果 Rn 是 r15, 则 不 能 使 用 ! 后 缀 。<br />

零 偏 移<br />

Rn 中 的 值 被 用 作 传 送 地 址 。<br />

前 索 引 偏 移<br />

在 发 生 传 送 之 前 , 将 该 偏 移 应 用 到 Rn 中 的 值 上 。 所 得 结 果 用 作 传 送 的 存 储 器 地<br />

址 。 如 果 使 用 了 ! 后 缀 , 则 将 结 果 写 回 到 Rn 中 。<br />

相 对 程 序<br />

这 是 前 索 引 形 式 的 另 一 个 版 本 。 汇 编 程 序 计 算 相 对 于 PC 的 偏 移 量 , 并 将 PC 作<br />

为 Rn, 生 成 前 索 引 的 指 令 。<br />

不 能 使 用 ! 后 缀 。<br />

后 索 引 偏 移<br />

Rn 中 的 值 被 用 作 传 送 的 存 储 器 地 址 。 在 传 送 之 后 , 将 该 偏 移 应 用 到 Rn 中 的 值 上 。<br />

将 结 果 写 到 Rn 中 。<br />

偏 移 量 语 法<br />

前 索 引 偏 移 和 后 索 引 偏 移 都 可 以 是 下 列 形 式 :<br />

#expr<br />

{-}Rm<br />

其 中 :<br />

- 是 一 个 可 选 的 减 号 。 如 果 存 在 -, 则 从 Rn 中 减 去 该 偏 移 量 。 否 则 将<br />

偏 移 量 加 到 Rn 中 。<br />

expr 是 一 个 表 达 式 , 其 取 值 为 -255 到 +255 范 围 内 的 整 数 。 这 通 常 是 一<br />

个 数 值 常 数 ( 参 见 下 面 的 示 例 )。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-15


<strong>ARM</strong> 指 令 参 考<br />

Rm 是 一 个 寄 存 器 , 包 含 要 用 作 偏 移 量 的 一 个 值 。<br />

偏 移 量 语 法 与 第 4-17 页 的 LDR 和 STR, 双 字 相 同 。<br />

半 字 传 送 时 的 地 址 对 齐<br />

对 于 半 字 传 送 , 地 址 必 须 是 偶 数 。<br />

如 果 系 统 含 有 系 统 协 处 理 器 (cp15), 则 可 以 启 用 对 齐 检 查 。 如 果 启 用 了 对 齐 检<br />

查 , 那 么 非 半 字 对 齐 的 16 位 传 送 将 导 致 对 齐 异 常 。<br />

如 果 系 统 没 有 系 统 协 处 理 器 (cp15), 或 者 禁 用 了 对 齐 检 查 :<br />

• 非 半 字 对 齐 的 16 位 装 载 会 破 坏 Rd ;<br />

• 非 半 字 对 齐 的 16 位 装 载 会 破 坏 位 于 [address] 和 [address-1] 处 的 两 个 字 节 。<br />

装 载 到 r15 中<br />

不 能 将 半 字 或 字 节 装 入 到 r15 中 。<br />

体 系 结 构<br />

这 些 指 令 可 用 在 v2 及 以 上 版 本 的 体 系 结 构 中 。<br />

示 例<br />

LDREQSH r11,[r6]<br />

; (conditionally) loads r11 with a 16-bit halfword<br />

; from the address in r6. Sign extends to 32 bits.<br />

LDRH r1,[r0,#22] ; load r1 with a 16 bit halfword from 22 bytes<br />

; above the address in r0. Zero extend to 32 bits.<br />

STRH r4,[r0,r1]! ; store the least significant halfword from r4<br />

; to two bytes at an address equal to contents(r0)<br />

; plus contents(r1). Write address back into r0.<br />

LDRSB r6,constf ; load a byte located at label constf. Sign extend.<br />

不 正 确 的 示 例<br />

LDRSB r1,[r6],r3,LSL#4 ; This format is only available for word and<br />

; unsigned byte transfers.<br />

4-16 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.2.3 LDR 和 STR, 双 字<br />

加 载 两 个 连 续 的 寄 存 器 和 存 储 两 个 连 续 的 寄 存 器 , 操 作 64 位 双 字 。<br />

语 法<br />

这 些 指 令 有 四 种 可 能 的 形 式 :<br />

• 零 偏 移 ;<br />

• 变 址 前 偏 移 ;<br />

• 相 对 程 序 的 ;<br />

• 变 址 后 偏 移 。<br />

四 种 形 式 的 语 法 ( 按 相 同 的 顺 序 ) 是 :<br />

op{cond}D Rd, [Rn]<br />

op{cond}D Rd, [Rn, Offset]{!}<br />

op{cond}D Rd, label<br />

op{cond}D Rd, [Rn], Offset<br />

其 中 :<br />

op<br />

是 LDR 或 STR。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd<br />

是 要 加 载 或 存 储 的 一 个 <strong>ARM</strong> 寄 存 器 。 另 一 个 是 R(d+1)。 Rd 必 须 是<br />

一 个 编 号 为 偶 数 的 寄 存 器 , 并 且 不 能 是 r14。<br />

Rn 是 存 储 器 地 址 所 基 于 的 寄 存 器 。<br />

Offset<br />

label<br />

Rn 不 能 与 Rd 或 R(d+1) 相 同 , 除 非 该 指 令 是 以 下 之 一 :<br />

• 零 偏 移 ;<br />

• 不 带 回 写 的 变 址 前 指 令 。<br />

是 应 用 到 Rn 中 的 值 上 的 一 个 偏 移 ( 请 参 阅 第 4-18 页 的 偏 移 量 语<br />

法 )。<br />

是 一 个 相 对 程 序 的 表 达 式 。 有 关 详 细 信 息 请 参 阅 第 3-23 页 的 与 寄 存<br />

器 相 关 和 与 程 序 相 关 的 表 达 式 。<br />

label 必 须 位 于 当 前 指 令 的 ±252 字 节 范 围 内 。<br />

! 是 一 个 可 选 的 后 缀 。 如 果 存 在 ! 后 缀 , 则 包 含 偏 移 的 地 址 被 写 回 到<br />

Rn 中 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-17


<strong>ARM</strong> 指 令 参 考<br />

零 偏 移<br />

Rn 中 的 值 被 用 作 传 送 地 址 。<br />

变 址 前 偏 移<br />

在 发 生 传 送 之 前 , 将 该 偏 移 应 用 到 Rn 中 的 值 上 。 所 得 结 果 用 作 传 送 的 存 储 器 地<br />

址 。 如 果 存 在 ! 后 缀 , 则 将 地 址 写 回 到 Rn 中 。<br />

相 对 程 序 的<br />

这 是 变 址 前 形 式 的 另 一 个 版 本 。 汇 编 程 序 计 算 与 PC 的 偏 移 , 并 将 PC 作 为 Rn 来<br />

生 成 变 址 前 的 指 令 。<br />

不 能 使 用 ! 后 缀 。<br />

变 址 后 偏 移<br />

Rn 中 的 值 被 用 作 传 送 的 存 储 器 地 址 。 在 传 送 之 后 , 将 该 偏 移 应 用 到 Rn 中 的 值 上 。<br />

将 结 果 写 到 Rn 中 。<br />

偏 移 量 语 法<br />

变 址 前 的 和 变 址 后 偏 移 都 可 以 是 下 列 形 式 :<br />

#expr<br />

{-}Rm<br />

其 中 :<br />

- 是 一 个 可 选 的 减 号 。 如 果 存 在 -, 则 从 Rn 中 减 去 该 偏 移 量 。 否 则 将<br />

偏 移 量 加 到 Rn 中 。<br />

expr<br />

Rm<br />

是 一 个 表 达 式 , 其 取 值 为 -255 到 +255 范 围 内 的 整 数 。 这 通 常 是 一<br />

个 数 字 常 数 ( 参 见 下 面 的 示 例 )。<br />

是 一 个 寄 存 器 , 包 含 要 用 作 偏 移 量 的 一 个 值 。 对 于 装 载 来 说 ,Rm 不<br />

得 与 Rd 或 R(d+1) 相 同 。<br />

这 种 偏 移 量 语 法 与 第 4-14 页 的 LDR 和 STR, 半 字 和 有 符 号 字 节 相 同 。<br />

地 址 对 齐<br />

对 于 双 字 传 送 , 地 址 必 须 是 8 的 倍 数 。<br />

4-18 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

如 果 系 统 含 有 系 统 协 处 理 器 , 则 可 以 启 用 对 齐 检 查 。 如 果 启 用 了 对 齐 检 查 , 那 么<br />

非 双 字 对 齐 的 64 位 传 送 将 导 致 对 齐 异 常 。<br />

体 系 结 构<br />

这 些 指 令 在 v6 及 更 高 版 本 体 系 结 构 中 , 以 及 v5 体 系 结 构 的 E 变 体 中 有 效 。<br />

示 例<br />

LDRD r6,[r11]<br />

LDRMID r4,[r7],r2<br />

STRD r4,[r9,#24]<br />

STRD r0,[r9,-r2]!<br />

LDREQD r8,abc4<br />

不 正 确 的 示 例<br />

LDRD r1,[r6] ; Rd must be even.<br />

STRD r14,[r9,#36] ; Rd must not be r14.<br />

STRD r2,[r3],r6 ; Rn must not be Rd or R(d+1).<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-19


<strong>ARM</strong> 指 令 参 考<br />

4.2.4 LDM 和 STM<br />

装 载 和 存 储 多 个 寄 存 器 。 可 以 传 送 r0 到 r15 的 任 何 寄 存 器 组 合 。<br />

语 法<br />

op{cond}addr_mode Rn{!}, reglist{^}<br />

其 中 :<br />

op<br />

是 LDM 或 STM。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

addr_mode 是 以 下 指 令 之 一 :<br />

IA 在 每 次 传 送 后 增 加 地 址<br />

IB 在 每 次 传 送 之 前 增 加 地 址<br />

DA 在 每 次 传 送 后 减 小 地 址<br />

DB 在 每 次 传 送 之 前 减 小 地 址<br />

FD 满 的 降 序 栈<br />

ED 空 的 降 序 栈<br />

FA 满 的 升 序 栈<br />

EA 空 的 升 序 栈 。<br />

Rn 是 基 址 寄 存 器 , 包 含 传 送 初 始 地 址 的 <strong>ARM</strong> 寄 存 器 。Rn 不 能 是 r15。<br />

! 是 一 个 可 选 的 后 缀 。 如 果 存 在 !, 则 最 终 地 址 被 写 回 到 Rn 中 。<br />

reglist<br />

是 一 个 要 装 载 或 存 储 的 寄 存 器 列 表 , 括 在 大 括 号 内 。 它 可 以 包 含 寄<br />

存 器 范 围 。 如 果 它 包 含 多 个 寄 存 器 或 包 含 寄 存 器 范 围 , 则 必 须 用 逗<br />

号 分 隔 ( 参 阅 第 4-21 页 的 示 例 )。<br />

^ 是 一 个 可 选 的 后 缀 。 在 [User] 模 式 或 [System] 模 式 下 不 能 使 用 它 。<br />

此 选 项 有 下 列 用 途 :<br />

• 如 果 op 是 LDM 并 且 reglist 包 含 pc (r15), 那 么 除 了 执 行 常 规<br />

的 多 寄 存 器 传 送 外 , 也 将 SPSR 复 制 到 CPSR 中 。 这 是 为 了 从 异<br />

常 处 理 程 序 中 返 回 。 仅 在 异 常 模 式 下 使 用 这 种 形 式 。<br />

• 否 则 , 数 据 将 被 送 入 或 送 出 [User] 模 式 寄 存 器 , 而 不 是 当 前<br />

模 式 寄 存 器 。<br />

4-20 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

非 字 对 齐 的 地 址<br />

这 些 指 令 忽 略 地 址 的 [1:0] 位 。( 在 一 个 带 有 系 统 协 处 理 器 的 系 统 中 , 如 果 启 用<br />

了 对 齐 检 查 , 那 么 这 些 位 中 的 非 零 值 会 引 起 对 齐 异 常 。)<br />

装 载 到 r15 中<br />

装 载 到 r15 ( 程 序 计 数 器 ) 中 将 会 造 成 指 令 在 所 装 载 地 址 处 跳 转 。 在 v5 及 更 高<br />

版 本 的 T 变 体 中 , 如 果 设 置 了 装 载 值 的 0 位 , 那 么 装 入 到 r15 会 使 处 理 器 改 为 执<br />

行 Thumb 指 令 。<br />

装 载 或 存 储 基 址 寄 存 器 , 带 回 写<br />

如 果 Rn 位 于 reglist, 则 用 ! 后 缀 指 定 回 写 方 式 :<br />

• 如 果 op 是 STM, 并 且 Rn 是 reglist 中 的 编 号 最 低 的 寄 存 器 , 则 存 储 Rn 的<br />

初 值 ;<br />

• 否 则 , 所 装 载 或 存 储 的 Rn 的 值 是 不 可 预 测 的 。<br />

体 系 结 构<br />

这 些 指 令 在 所 有 版 本 的 <strong>ARM</strong> 体 系 结 构 中 有 效 。<br />

在 v5 及 更 高 版 本 的 T 变 体 中 , 如 果 设 置 了 装 载 值 的 0 位 , 那 么 装 入 到 r15 会 改<br />

变 为 执 行 Thumb 指 令 。<br />

示 例<br />

LDMIA<br />

STMDB<br />

STMFD<br />

LDMFD<br />

r8,{r0,r2,r9}<br />

r1!,{r3-r6,r11,r12}<br />

r13!,{r0,r4-r7,LR} ; Push registers including the<br />

;<br />

r13!,{r0,r4-r7,PC} ; Pop the same registers and<br />

; return from subroutine<br />

不 正 确 的 示 例<br />

STMIA r5!,{r5,r4,r9} ; value stored for r5 unpredictable<br />

LDMDA r2, {} ; must be at least one register in list<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-21


<strong>ARM</strong> 指 令 参 考<br />

4.2.5 PLD<br />

缓 存 预 载 。<br />

语 法<br />

PLD [Rn{, FlexOffset}]<br />

其 中 :<br />

Rn 是 作 为 存 储 器 地 址 的 基 址 的 寄 存 器 。<br />

FlexOffset 是 应 用 到 Rn 的 值 上 的 可 选 的 可 变 偏 移 。<br />

FlexOffset 可 以 是 下 列 形 式 之 一 :<br />

#expr<br />

{-}Rm{, shift}<br />

其 中 :<br />

- 是 一 个 可 选 的 减 号 。 如 果 存 在 -, 则 从 Rn 中 减 去 该 偏 移<br />

量 。 否 则 将 偏 移 量 加 到 Rn 中 。<br />

expr 是 一 个 表 达 式 , 其 取 值 为 -4095 到 +4095 范 围 内 的 整 数 。<br />

这 通 常 是 一 个 数 值 常 数 。<br />

Rm 是 一 个 寄 存 器 , 包 含 要 用 作 偏 移 量 的 一 个 值 。<br />

shift 是 一 个 要 应 用 到 Rm 上 的 可 选 移 位 。 其 可 以 是 下 面 任 一 个<br />

形 式 :<br />

ASR #n 算 术 右 移 n 位 。 1 ≤ n ≤ 32。<br />

LSL #n 逻 辑 左 移 n 位 。 0 ≤ n ≤ 31。<br />

LSR #n 逻 辑 右 移 n 位 。 1 ≤ n ≤ 32。<br />

ROR #n 循 环 右 移 n 位 。 1 ≤ n ≤ 31。<br />

RRX 循 环 右 移 一 位 , 带 扩 展 。<br />

这 种 偏 移 量 语 法 与 第 4-9 页 的 LDR 和 STR, 字 和 无 符 号 字 节 相 同 。<br />

用 法<br />

使 用 PLD 来 提 示 存 储 器 系 统 : 在 下 面 几 个 指 令 内 , 可 能 有 来 自 指 定 地 址 的 装 载<br />

指 令 。 如 果 可 能 的 话 , 存 储 器 系 统 使 用 指 令 来 加 速 稍 后 的 存 储 器 访 问 , 否 则 PLD<br />

没 有 影 响 。<br />

4-22 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

对 齐<br />

对 地 址 没 有 对 齐 限 制 。 如 果 存 在 系 统 控 制 协 处 理 器 (cp15), 那 么 它 将 不 会 为 PLD<br />

指 令 生 成 对 齐 异 常 。<br />

体 系 结 构<br />

PLD 指 令 在 v6 及 更 高 版 本 体 系 结 构 中 , 以 及 v5 体 系 结 构 的 E 变 体 中 有 效 。<br />

示 例<br />

PLD [r2]<br />

PLD [r15,#280]<br />

PLD [r9,#-2481]<br />

PLD [r0,#av*4] ; av * 4 must evaluate, at assembly time, to<br />

; an integer in the range -4095 to +4095<br />

PLD [r0,r2]<br />

PLD [r5,r8,LSL #2]<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-23


<strong>ARM</strong> 指 令 参 考<br />

4.2.6 SRS<br />

存 储 返 回 状 态 。<br />

语 法<br />

SRSaddr_mode #mode{!}<br />

其 中 :<br />

addr_mode 是 以 下 指 令 之 一 :<br />

IA 在 每 次 传 送 后 增 加 地 址 ;<br />

IB 在 每 次 传 送 之 前 增 加 地 址 ;<br />

DA 在 每 次 传 送 后 减 小 地 址 ;<br />

DB 在 每 次 传 送 之 前 减 小 地 址 ;<br />

FD 满 的 降 序 栈 ;<br />

ED 空 的 降 序 栈 ;<br />

FA 满 的 升 序 栈 ;<br />

EA 空 的 升 序 栈 。<br />

mode<br />

指 定 模 式 的 编 号 , 该 模 式 所 编 组 的 r13 被 用 作 基 址 寄 存 器 , 请 参 阅<br />

第 2-4 页 的 处 理 器 模 式 。<br />

! 是 一 个 可 选 的 后 缀 。 如 果 存 在 !, 则 最 终 地 址 被 写 回 到 r13 为 基 址<br />

寄 存 器 的 编 组 寄 存 器 中 。<br />

操 作<br />

SRS 在 由 mode 指 定 的 模 式 的 r13 所 含 地 址 及 后 续 地 址 处 , 存 储 当 前 模 式 的 r14 和<br />

SPSR。 也 可 选 择 是 否 更 新 由 mode 指 定 的 模 式 下 的 r13。 这 与 用 于 访 问 栈 的 STM 指<br />

令 的 常 规 用 法 兼 容 , 请 参 阅 第 4-20 页 的 LDM 和 STM。<br />

可 以 从 一 个 自 动 选 择 的 状 态 中 , 使 用 SRS 指 令 来 存 储 一 个 不 同 栈 上 的 异 常 处 理 程<br />

序 的 返 回 状 态 。<br />

体 系 结 构<br />

SRS 指 令 在 v6 及 更 高 版 本 <strong>ARM</strong> 体 系 结 构 中 有 效 。<br />

示 例<br />

R13_usr EQU 16<br />

SRSFD #R13_usr<br />

4-24 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

不 正 确 的 示 例<br />

SRSFD #32! ; there is no mode 32<br />

SRSEQFD #R13_usr ; SRS is always unconditional<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-25


<strong>ARM</strong> 指 令 参 考<br />

4.2.7 RFE<br />

从 异 常 中 返 回 。<br />

语 法<br />

RFEaddr_mode Rn{!}<br />

其 中 :<br />

addr_mode 是 以 下 值 之 一 :<br />

IA 在 每 次 传 送 后 增 加 地 址 ;<br />

IB 在 每 次 传 送 之 前 增 加 地 址 ;<br />

DA 在 每 次 传 送 后 减 小 地 址 ;<br />

DB 在 每 次 传 送 之 前 减 小 地 址 ;<br />

FD 满 的 降 序 栈 ;<br />

ED 空 的 降 序 栈 ;<br />

FA 满 的 升 序 栈 ;<br />

EA 空 的 升 序 栈 。<br />

Rn<br />

指 定 基 址 寄 存 器 。 不 要 将 r15 用 作 Rn。<br />

! 是 一 个 可 选 的 后 缀 。 如 果 存 在 !, 则 最 终 地 址 被 写 回 到 Rn 中 。<br />

操 作<br />

从 Rn 包 含 的 地 址 及 后 面 的 地 址 装 载 PC 和 CPSR。 也 可 选 择 是 否 更 新 Rn。<br />

如 果 此 前 使 用 SRS 指 令 保 存 了 返 回 状 态 , 可 以 使 用 FRE 指 令 来 从 异 常 中 返 回 ( 参<br />

阅 第 4-24 页 的 SRS)。<br />

体 系 结 构<br />

RFE 在 v6 及 更 高 版 本 <strong>ARM</strong> 体 系 结 构 中 有 效 。<br />

示 例<br />

RFEFD r13!<br />

4-26 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

不 正 确 的 示 例<br />

RFENEFD r13! ; RFE is always unconditional<br />

RFEFD r15 ; do not use r15<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-27


<strong>ARM</strong> 指 令 参 考<br />

4.2.8 LDREX 和 STREX<br />

独 占 装 载 寄 存 器 和 独 占 存 储 寄 存 器 。<br />

语 法<br />

LDREX{cond} Rd, [Rn]<br />

STREX{cond} Rd, Rm, [Rn]<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 的 寄 存 器 。 在 指 令 之 后 , 它 将 包 含 :<br />

• 对 于 LDREX, 是 从 存 储 器 装 载 的 字<br />

• 对 于 STREX, 则 是 下 列 值 之 一 :<br />

0 如 果 指 令 执 行 成 功<br />

1 如 果 指 令 被 锁 定 。<br />

Rd 不 能 是 r15。<br />

Rm 是 源 寄 存 器 , 包 含 要 存 储 到 存 储 器 中 的 字 。 Rm 必 须 与 Rd 不 同 , 并<br />

且 不 能 是 r15。<br />

Rn 是 包 含 存 储 器 地 址 的 寄 存 器 。Rn 不 能 是 r15, 并 且 对 于 STREX, 它 必<br />

须 不 同 于 Rd。<br />

LDREX<br />

LDREX 指 令 从 存 储 器 中 装 载 一 个 字 。<br />

• 如 果 物 理 地 址 具 有 共 享 TLB 属 性 , 那 么 LDREX 将 物 理 地 址 标 记 为 由 当 前 处<br />

理 器 独 占 访 问 , 并 且 清 除 该 处 理 器 对 任 何 其 它 物 理 地 址 的 独 占 访 问 标 记 。<br />

• 否 则 , 它 标 记 这 样 的 事 实 : 执 行 处 理 器 有 一 个 未 完 成 的 带 标 记 物 理 地 址 。<br />

4-28 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

STREX<br />

STREX 指 令 执 行 对 存 储 器 的 有 条 件 存 储 。 条 件 如 下 :<br />

• 如 果 物 理 地 址 不 具 有 共 享 TLB 属 性 , 并 且 执 行 处 理 器 含 有 未 完 成 的 带 标 记<br />

物 理 地 址 , 将 进 行 存 储 且 清 除 该 标 记 。<br />

• 如 果 物 理 地 址 不 具 有 共 享 TLB 属 性 , 并 且 执 行 处 理 器 不 含 未 完 成 的 带 标 记<br />

物 理 地 址 , 则 不 进 行 存 储 。<br />

• 如 果 物 理 地 址 具 有 共 享 TLB 属 性 , 并 且 物 理 地 址 被 标 记 为 由 执 行 处 理 器 独<br />

占 访 问 , 则 进 行 存 储 并 清 除 标 记 。<br />

• 如 果 物 理 地 址 具 有 共 享 TLB 属 性 , 并 且 物 理 地 址 未 被 标 记 为 由 执 行 处 理 器<br />

独 占 访 问 , 则 不 进 行 存 储 。<br />

用 法<br />

使 用 LDREX 和 STREX 以 在 多 处 理 器 和 共 享 存 储 器 系 统 中 实 现 进 程 间 通 讯 。<br />

由 于 性 能 方 面 的 原 因 , 将 相 应 的 LDREX 和 STREX 指 令 之 间 的 指 令 数 保 持 为 一 个 最<br />

小 值 。<br />

备 注<br />

STREX 指 令 中 使 用 的 地 址 , 必 须 与 最 近 执 行 的 LDREX 指 令 中 的 地 址 相 同 。 对 不 同 的<br />

地 址 执 行 STREX 指 令 的 结 果 是 不 可 预 测 的 。<br />

体 系 结 构<br />

这 些 指 令 在 v6 及 更 高 版 本 的 体 系 结 构 中 有 效 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-29


<strong>ARM</strong> 指 令 参 考<br />

示 例<br />

try<br />

MOV r1, #0x1<br />

; load the ‘lock taken’ value<br />

LDREX r0, [LockAddr] ; load the lock value<br />

CMP r0, #0<br />

; is the lock free?<br />

STREXEQ r0, r1, [LockAddr] ; try and claim the lock<br />

CMPEQ r0, #0<br />

; did this succeed?<br />

BNE try<br />

; no – try again<br />

.... ; yes – we have the lock<br />

不 正 确 的 示 例<br />

LDREX r0, [r2,#96]! ; no offset allowed<br />

STREX r11, r10, [r15] ; use of r15 not allowed<br />

LDREXGT r6, r4, [r10] ; LDREX has only two registers in its syntax<br />

STREX r3, r3, [r7] ; Rd must be distinct from Rn (and from Rm)<br />

4-30 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.2.9 SWP 和 SWPB<br />

在 寄 存 器 和 存 储 器 之 间 交 换 数 据 。<br />

可 以 使 用 SWP 来 实 现 信 号 标 记 。 有 关 在 v6 及 更 高 版 本 的 体 系 结 构 中 实 现 更 复 杂<br />

的 信 号 标 记 的 说 明 , 另 请 参 阅 第 4-28 页 的 LDREX 和 STREX。<br />

语 法<br />

SWP{cond}{B} Rd, Rm, [Rn]<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

B<br />

Rd<br />

是 一 个 可 选 的 后 缀 。 如 果 存 在 B, 则 交 换 一 个 字 节 。 否 则 , 交 换 一<br />

个 32 位 字 。<br />

是 一 个 <strong>ARM</strong> 寄 存 器 。 将 从 存 储 器 取 出 的 数 据 装 入 Rd。<br />

Rm 是 一 个 <strong>ARM</strong> 寄 存 器 。 将 Rm 的 内 容 保 存 到 存 储 器 中 。<br />

Rn<br />

Rm 可 以 是 与 Rd 相 同 的 寄 存 器 。 在 这 种 情 况 , 该 寄 存 器 的 内 容 与 存<br />

储 位 置 的 内 容 进 行 交 换 。<br />

是 一 个 <strong>ARM</strong> 寄 存 器 。Rn 的 内 容 指 定 存 储 器 中 含 有 要 交 换 的 数 据 的<br />

地 址 。 Rn 必 须 是 不 同 于 Rd 和 Rm 的 寄 存 器 。<br />

非 字 对 齐 的 地 址<br />

非 字 对 齐 的 地 址 的 处 理 方 式 与 LDR 和 STR 指 令 完 全 相 同 ( 参 阅 第 4-12 页 的 字 传<br />

送 时 的 地 址 对 齐 )。<br />

体 系 结 构<br />

SWP 在 版 本 2a 和 版 本 3 及 更 高 版 本 的 体 系 结 构 中 有 效 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-31


<strong>ARM</strong> 指 令 参 考<br />

4.3 <strong>ARM</strong> 通 用 数 据 处 理 指 令<br />

本 节 包 含 下 列 各 个 小 节 :<br />

• 第 4-33 页 的 灵 活 的 第 二 操 作 数<br />

• 第 4-36 页 的 ADD、 SUB、 RSB、 ADC、 SBC 和 RSC<br />

加 法 、 减 法 以 及 反 向 减 法 , 每 个 运 算 可 带 或 不 带 进 位 。<br />

• 第 4-39 页 的 AND、 ORR、 EOR 和 BIC<br />

逻 辑 “ 与 ”、“ 或 ”、“ 异 或 ” 和 位 清 除 。<br />

• 第 4-41 页 的 MOV、 CPY 和 MVN<br />

移 动 和 取 反 移 动 。<br />

• 第 4-43 页 的 CMP 和 CMN<br />

比 较 和 负 向 比 较 。<br />

• 第 4-45 页 的 TST 和 TEQ<br />

测 试 和 相 等 测 试 。<br />

• 第 4-47 页 的 CLZ<br />

计 算 前 导 零 数 目 。<br />

• 第 4-48 页 的 SEL<br />

根 据 CPSR GE 标 志 的 状 态 , 选 择 每 个 操 作 数 中 的 字 节 。<br />

• 第 4-50 页 的 REV、 REV16 和 REVSH<br />

反 转 一 个 字 或 半 字 中 的 字 节 顺 序 。 反 转 半 字 和 符 号 扩 展 中 的 字 节 顺 序 。<br />

4-32 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.3.1 灵 活 的 第 二 操 作 数<br />

大 多 数 <strong>ARM</strong> 通 用 数 据 处 理 指 令 带 有 一 个 灵 活 的 第 二 操 作 数 。 在 描 述 每 个 指 令 的<br />

语 法 时 , 其 显 示 为 Operand2。<br />

语 法<br />

Operand2 具 有 下 列 可 能 的 形 式 :<br />

#immed_8r<br />

Rm{, shift}<br />

其 中 :<br />

immed_8r<br />

Rm<br />

是 取 值 为 数 值 常 数 的 一 个 表 达 式 。 该 常 数 必 须 对 应 于 一 个 8 位 结<br />

构 , 在 一 个 32 位 字 内 循 环 移 位 偶 数 位 而 得 到 ( 但 参 阅 第 4-35 页 的<br />

指 令 替 换 )。<br />

是 存 放 第 二 个 操 作 数 的 数 据 的 <strong>ARM</strong> 寄 存 器 。 寄 存 器 中 的 位 结 构 可<br />

以 用 各 种 方 式 移 位 或 循 环 移 位 。<br />

shift 是 一 个 要 应 用 到 Rm 上 的 可 选 移 位 。 其 可 以 是 下 面 任 一 个 形 式 :<br />

ASR #n 算 术 右 移 n 位 。 1 ≤ n ≤ 32。<br />

LSL #n 逻 辑 左 移 n 位 。 0 ≤ n ≤ 31。<br />

LSR #n 逻 辑 右 移 n 位 。 1 ≤ n ≤ 32。<br />

ROR #n 循 环 右 移 n 位 。 1 ≤ n ≤ 31。<br />

RRX 循 环 右 移 一 位 , 带 扩 展 。<br />

type Rs 其 中 :<br />

type 是 ASR、 LSL、 LSR、 ROR 之 一 。<br />

Rs 是 提 供 移 位 数 的 <strong>ARM</strong> 寄 存 器 。 只 使 用 最 低 有 效<br />

字 节 。<br />

备 注<br />

移 位 运 算 的 结 果 被 用 作 指 令 中 的 Operand2, 但 Rm 本 身 不 变 。<br />

ASR<br />

如 果 把 Rm 看 成 一 个 有 符 号 整 数 的 二 进 制 补 码 , 算 术 右 移 n 位 就 是 把 Rm 除 以 2 n 。<br />

原 来 的 位 [31] 被 复 制 到 寄 存 器 的 左 边 n 位 中 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-33


<strong>ARM</strong> 指 令 参 考<br />

LSR 和 LSL<br />

如 果 内 容 被 当 作 无 符 号 整 数 , 逻 辑 右 移 n 位 , 即 Rm 中 的 值 除 以 2 n 。 寄 存 器 的 左<br />

边 n 位 被 设 为 0。<br />

如 果 内 容 被 当 作 无 符 号 整 数 , 逻 辑 左 移 n 位 , 即 Rm 中 的 值 乘 以 2 n 。 可 能 会 发 生<br />

溢 出 而 不 警 告 。 寄 存 器 的 右 边 n 位 被 设 为 0。<br />

ROR<br />

循 环 右 移 n 位 , 将 寄 存 器 的 右 边 n 位 移 入 结 果 的 左 边 n 位 中 。 与 此 同 时 , 所 有 其<br />

它 位 右 移 n 位 ( 参 阅 图 4-1)。<br />

图 4-1 ROR<br />

RRX<br />

带 扩 展 的 向 右 循 环 移 位 , 将 Rm 的 值 右 移 一 位 。 进 位 标 志 被 复 制 到 Rm 的 [31] 位 中<br />

( 参 阅 图 4-2)。<br />

如 果 指 定 了 S 后 缀 , 则 Rm 的 [0] 位 的 原 值 被 移 出 到 进 位 标 志 中 ( 参 阅 第 4-35 页<br />

的 进 位 标 志 )。<br />

图 4-2 RRX<br />

4-34 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

进 位 标 志<br />

如 果 是 下 列 指 令 之 一 , 则 进 位 标 志 被 更 新 到 从 Rm 移 出 的 最 后 一 位 中 :<br />

• 如 果 使 用 了 S 后 缀 , MOV、 MVN、 AND、 ORR、 EOR 或 BIC ;<br />

• TEQ 或 TST, 它 们 不 需 要 S 后 缀 。<br />

指 令 替 换<br />

除 了 对 immed_8r 的 求 反 值 或 逻 辑 非 之 外 , 一 些 指 令 对 (ADD 和 SUB, ADC 和 SBC,<br />

AND 和 BIC, MOV 和 MVN, CMP 和 CMN) 是 等 价 的 。<br />

如 果 immed_8r 不 能 表 示 为 一 个 可 以 循 环 的 8 位 结 构 , 但 其 负 值 或 逻 辑 非 可 以 的<br />

话 , 汇 编 程 序 将 用 其 他 的 指 令 进 行 替 换 , 并 对 immed_8r 进 行 取 反 或 求 非 。<br />

在 比 较 反 汇 编 列 表 与 源 代 码 时 , 要 清 楚 这 一 点 。<br />

示 例<br />

ADD r3,r7,#1020 ; immed_8r. 1020 is 0xFF rotated right by 30 bits.<br />

AND r0,r5,r2 ; r2 contains the data for Operand2.<br />

SUB r11,r12,r3,ASR #5 ; Operand2 is the contents of r3 divided by 32.<br />

MOVS r4,r4, LSR #32 ; Updates the C flag to r4 bit 31. Clears r4 to 0.<br />

不 正 确 的 示 例<br />

ADD r3,r7,#1023 ; 1023 (0x3FF) is not a rotated 8-bit pattern.<br />

SUB r11,r12,r3,LSL #32 ; #32 is out of range for LSL.<br />

MOVS r4,r4,RRX #3 ; Do not specify a shift amount for RRX. RRX is<br />

; always a one-bit shift.<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-35


<strong>ARM</strong> 指 令 参 考<br />

4.3.2 ADD、 SUB、 RSB、 ADC、 SBC 和 RSC<br />

加 法 、 减 法 以 及 反 向 减 法 , 每 一 指 令 可 带 或 不 带 进 位 。<br />

另 请 参 阅 第 4-83 页 的 并 行 加 法 和 减 法 。<br />

语 法<br />

op{cond}{S} Rd, Rn, Operand2<br />

其 中 :<br />

op 是 ADD、 SUB、 RSB、 ADC、 SBC 或 RSC 之 一 。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

S<br />

是 一 个 可 选 的 后 缀 。 如 果 指 定 了 S, 则 在 运 算 结 果 上 更 新 条 件 码 标<br />

志 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 标 寄 存 器 。<br />

Rn 是 存 放 第 一 个 操 作 数 的 寄 存 器 。<br />

Operand2<br />

用 法<br />

是 一 个 灵 活 的 第 二 操 作 数 。 详 细 的 选 项 信 息 请 参 阅 第 4-33 页 的 灵 活<br />

的 第 二 操 作 数 。<br />

ADD 指 令 将 Rn 的 值 与 Operand2 的 值 相 加 。<br />

SUB 指 令 将 Rn 的 值 减 去 Operand2 的 值 。<br />

RSB ( 反 向 减 法 ) 指 令 从 Operand2 的 值 减 去 Rn 的 值 。 由 于 Operand2 有 很 宽 的 范 围<br />

可 供 选 择 , 因 此 这 种 操 作 是 很 有 用 的 。<br />

可 以 使 用 ADC、 SBC 和 RSC 来 合 成 多 字 算 法 ( 参 阅 第 4-38 页 的 多 字 算 法 示 例 )。<br />

ADC ( 带 进 位 的 加 法 ) 指 令 将 Rn 和 Operand2 的 值 随 进 位 标 志 一 起 相 加 。<br />

SBC ( 带 进 位 的 减 法 ) 指 令 从 Rn 的 值 减 去 Operand2 的 值 。 如 果 进 位 标 志 被 清 除 ,<br />

则 将 结 果 减 1。<br />

RSC( 带 进 位 的 反 向 减 法 ) 指 令 从 Operand2 的 值 减 去 Rn 的 值 。 如 果 进 位 标 志 被 清<br />

除 , 则 将 结 果 减 1。<br />

4-36 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

在 某 些 情 况 下 , 汇 编 程 序 用 一 个 指 令 替 换 另 一 个 指 令 。 在 阅 读 反 汇 编 列 表 时 要 清<br />

楚 这 一 点 。 详 细 信 息 请 参 阅 第 4-35 页 的 指 令 替 换 。<br />

条 件 标 志<br />

如 果 指 定 了 S, 这 些 指 令 根 据 结 果 来 更 新 N、 Z、 C 和 V 标 志 。<br />

使 用 r15<br />

如 果 将 r15 用 作 Rn, 则 使 用 的 值 是 指 令 的 地 址 加 上 8。<br />

如 果 将 r15 用 作 Rd:<br />

• 执 行 代 码 将 跳 转 到 与 结 果 相 对 应 的 地 址 。<br />

• 如 果 使 用 S 后 缀 , 则 当 前 模 式 的 SPSR 被 复 制 到 CPSR 中 。 可 以 利 用 这 一<br />

点 来 从 异 常 状 态 下 返 回 ( 参 阅 <strong>RealView</strong> 编 译 工 具 2.0 版 开 发 者 指 南 中 的 处<br />

理 处 理 器 异 常 一 章 )。<br />

注 意<br />

在 用 户 模 式 或 系 统 模 式 下 将 r15 用 作 Rd 时 , 不 要 使 用 S 后 缀 。 这 样 一 个 指 令 的<br />

结 果 是 不 可 预 测 的 , 但 汇 编 程 序 在 汇 编 时 不 会 发 出 警 告 。<br />

在 带 有 寄 存 器 控 制 的 移 位 的 任 何 数 据 处 理 指 令 中 , 不 能 将 r15 用 作 Rd ( 参 阅 第<br />

4-33 页 的 灵 活 的 第 二 操 作 数 )。<br />

体 系 结 构<br />

这 些 指 令 在 所 有 版 本 的 <strong>ARM</strong> 体 系 结 构 中 有 效 。<br />

示 例<br />

ADD r2,r1,r3<br />

SUBS r8,r6,#240 ; sets the flags on the result<br />

RSB r4,r4,#1280 ; subtracts contents of r4 from 1280<br />

ADCHI r11,r0,r3 ; only executed if C flag set and Z<br />

; flag clear<br />

RSCLES r0,r5,r0,LSL r4 ; conditional, flags set<br />

不 正 确 的 示 例<br />

RSCLES r0,r15,r0,LSL r4<br />

; r15 not allowed with register<br />

; controlled shift<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-37


<strong>ARM</strong> 指 令 参 考<br />

多 字 算 法 示 例<br />

这 两 个 指 令 将 r2 和 r3 中 包 含 的 一 个 64 位 整 数 加 到 r0 和 r1 中 包 含 的 另 一 个 64<br />

位 整 数 上 , 并 把 结 果 放 入 r4 和 r5 中 。<br />

ADDS r4,r0,r2 ; adding the least significant words<br />

ADC r5,r1,r3 ; adding the most significant words<br />

这 些 指 令 从 另 一 个 整 数 中 减 去 一 个 96 位 整 数 :<br />

SUBS<br />

SBCS<br />

SBC<br />

r3,r6,r9<br />

r4,r7,r10<br />

r5,r8,r11<br />

为 了 清 晰 起 见 , 以 上 的 示 例 对 多 字 值 使 用 连 续 的 寄 存 器 。 这 样 做 并 不 是 必 须 的 。<br />

例 如 , 下 面 的 指 令 是 完 全 有 效 的 :<br />

SUBS<br />

SBCS<br />

SBC<br />

r6,r6,r9<br />

r9,r2,r1<br />

r2,r8,r11<br />

4-38 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.3.3 AND、 ORR、 EOR 和 BIC<br />

逻 辑 “ 与 ”、“ 或 ”、“ 异 或 ” 和 位 清 除 。<br />

语 法<br />

op{cond}{S} Rd, Rn, Operand2<br />

其 中 :<br />

op 是 AND、 ORR、 EOR 或 BIC 之 一 。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

S<br />

是 一 个 可 选 的 后 缀 。 如 果 指 定 了 S, 则 在 运 算 结 果 上 更 新 条 件 码 标<br />

志 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 的 寄 存 器 。<br />

Rn 是 存 放 第 一 个 操 作 数 的 寄 存 器 。<br />

Operand2<br />

用 法<br />

是 一 个 灵 活 的 第 二 操 作 数 。 详 细 的 选 项 信 息 请 参 阅 第 4-33 页 的 灵 活<br />

的 第 二 操 作 数 。<br />

AND、EOR 和 ORR 指 令 对 Rn 和 Operand2 中 的 值 执 行 按 位 “ 与 ”、“ 异 或 ” 和 “ 或 ”<br />

运 算 。<br />

BIC ( 位 清 除 ) 指 令 把 Operand2 取 反 和 Rn 相 “ 与 ”。<br />

在 某 些 情 况 下 , 汇 编 程 序 会 用 BIC 代 替 AND, 或 用 AND 代 替 BIC。 在 阅 读 反 汇 编 列<br />

表 时 要 清 楚 这 一 点 。 详 细 信 息 请 参 阅 第 4-35 页 的 指 令 替 换 。<br />

条 件 标 志<br />

如 果 指 定 了 S, 则 下 列 指 令 :<br />

• 根 据 结 果 来 更 新 N 和 Z 标 志 。<br />

• 在 计 算 Operand2 时 会 更 新 C 标 志 ( 参 阅 第 4-33 页 的 灵 活 的 第 二 操 作 数 )<br />

• 不 影 响 V 标 志 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-39


<strong>ARM</strong> 指 令 参 考<br />

使 用 r15<br />

如 果 将 r15 用 作 Rn, 则 使 用 的 值 是 指 令 的 地 址 加 上 8。<br />

如 果 将 r15 用 作 Rd:<br />

• 执 行 代 码 将 跳 转 到 与 结 果 相 对 应 的 地 址 。<br />

• 如 果 使 用 S 后 缀 , 则 当 前 模 式 的 SPSR 被 复 制 到 CPSR 中 。 可 以 利 用 这 一<br />

点 来 从 异 常 状 态 下 返 回 ( 参 阅 <strong>RealView</strong> 编 译 工 具 2.0 版 开 发 者 指 南 中 的 处<br />

理 处 理 器 异 常 一 章 )。<br />

注 意<br />

在 [User] 模 式 或 [System] 模 式 下 将 r15 用 作 Rd 时 , 不 要 使 用 S 后 缀 。 这 样 一 个<br />

指 令 的 结 果 是 不 可 预 测 的 , 但 汇 编 程 序 在 汇 编 时 不 会 发 出 警 告 。<br />

在 带 有 寄 存 器 控 制 移 位 的 任 何 数 据 处 理 指 令 中 , 不 能 将 r15 用 作 Rd( 参 阅 第 4-33<br />

页 的 灵 活 的 第 二 操 作 数 )。<br />

体 系 结 构<br />

这 些 指 令 在 所 有 版 本 的 <strong>ARM</strong> 体 系 结 构 中 有 效 。<br />

示 例<br />

AND r9,r2,#0xFF00<br />

ORREQ r2,r0,r5<br />

EORS r0,r0,r3,ROR r6<br />

BICNES r8,r10,r0,RRX<br />

不 正 确 的 示 例<br />

EORS r0,r15,r3,ROR r6 ; r15 not allowed with register<br />

; controlled shift<br />

4-40 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.3.4 MOV、 CPY 和 MVN<br />

移 动 、 复 制 和 取 反 移 动 。<br />

语 法<br />

MOV{cond}{S} Rd, Operand2<br />

CPY{cond} Rd, Rm<br />

MVN{cond}{S} Rd, Operand2<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

S<br />

是 一 个 可 选 的 后 缀 。 如 果 指 定 了 S, 则 在 运 算 结 果 上 更 新 条 件 码 标<br />

志 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 的 寄 存 器 。<br />

Operand2<br />

是 一 个 灵 活 的 第 二 操 作 数 。 详 细 的 选 项 信 息 请 参 阅 第 4-33 页 的 灵 活<br />

的 第 二 操 作 数 。<br />

Rm 是 源 寄 存 器 。<br />

用 法<br />

MOV 指 令 将 Operand2 的 值 传 送 到 Rd 中 。<br />

MVN 指 令 取 出 Operand2 的 值 , 对 该 值 执 行 按 位 逻 辑 “ 非 ” 运 算 , 并 将 结 果 放 入 Rd<br />

中 。<br />

在 某 些 情 况 下 , 汇 编 程 序 会 用 MVN 代 替 MOV, 或 用 MOV 代 替 MVN。 在 阅 读 反 汇 编 列<br />

表 时 要 清 楚 这 一 点 。 详 细 信 息 请 参 阅 第 4-35 页 的 指 令 替 换 。<br />

CPY 指 令 是 不 带 S 后 缀 的 MOV 指 令 的 同 义 词 , 并 带 有 Operand2 作 为 不 移 位 的 寄 存<br />

器 。 其 将 Rm 的 值 复 制 到 Rd 中 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-41


<strong>ARM</strong> 指 令 参 考<br />

条 件 标 志<br />

如 果 指 定 了 S, 则 下 列 指 令 :<br />

• 根 据 结 果 来 更 新 N 和 Z 标 志 。<br />

• 在 计 算 Operand2 时 会 更 新 C 标 志 ( 参 阅 第 4-33 页 的 灵 活 的 第 二 操 作 数 )<br />

• 不 影 响 V 标 志 。<br />

CPY 指 令 不 能 使 用 S 后 缀 , 并 且 不 更 新 标 志 。<br />

使 用 r15<br />

如 果 将 r15 用 作 Rn, 则 使 用 的 值 是 指 令 的 地 址 加 上 8。<br />

如 果 将 r15 用 作 Rd:<br />

• 执 行 代 码 将 跳 转 到 与 结 果 相 对 应 的 地 址 。<br />

• 如 果 使 用 S 后 缀 , 则 当 前 模 式 的 SPSR 被 复 制 到 CPSR 中 。 可 以 利 用 这 一<br />

点 来 从 异 常 状 态 下 返 回 ( 参 阅 <strong>RealView</strong> 编 译 工 具 2.0 版 开 发 者 指 南 中 的 处<br />

理 处 理 器 异 常 一 章 )。<br />

注 意<br />

在 [User] 模 式 或 [System] 模 式 下 将 r15 用 作 Rd 时 , 不 要 使 用 S 后 缀 。 这 样 一 个<br />

指 令 的 结 果 是 不 可 预 测 的 , 但 汇 编 程 序 在 汇 编 时 不 会 发 出 警 告 。<br />

在 带 有 寄 存 器 控 制 的 移 位 的 任 何 数 据 处 理 指 令 中 , 不 能 将 r15 用 作 Rd ( 参 阅 第<br />

4-33 页 的 灵 活 的 第 二 操 作 数 )。<br />

体 系 结 构<br />

MOV 和 MVN 于 所 有 版 本 的 <strong>ARM</strong> 体 系 结 构 中 有 效 。<br />

CPY 在 v6 及 更 高 版 本 的 <strong>ARM</strong> 体 系 结 构 中 有 效 。<br />

示 例<br />

MVNNE<br />

r11,#0xF000000B<br />

不 正 确 的 示 例<br />

MVN r15,r3,ASR r0 ; r15 not allowed with register controlled shift<br />

CPYS r3,r8 ; S suffix not allowed with CPY<br />

4-42 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.3.5 CMP 和 CMN<br />

比 较 和 负 向 比 较 。<br />

语 法<br />

CMP{cond} Rn, Operand2<br />

CMN{cond} Rn, Operand2<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rn 是 存 放 第 一 个 操 作 数 的 <strong>ARM</strong> 寄 存 器 。<br />

Operand2<br />

用 法<br />

是 一 个 灵 活 的 第 二 操 作 数 。 详 细 的 选 项 信 息 请 参 阅 第 4-33 页 的 灵 活<br />

的 第 二 操 作 数 。<br />

这 些 指 令 将 一 个 寄 存 器 中 的 值 与 Operand2 进 行 比 较 。 它 们 更 新 结 果 的 条 件 标 志 ,<br />

但 不 将 结 果 放 入 任 何 寄 存 器 中 。<br />

CMP 从 Rn 的 值 减 去 Operand2 的 值 。 除 了 丢 弃 掉 结 果 之 外 , 其 功 能 与 SUBS 指 令 相 同 。<br />

CMN 将 Operand2 的 值 加 到 Rn 的 值 中 。 除 了 丢 弃 掉 结 果 之 外 , 其 功 能 与 ADDS 指 令<br />

相 同 。<br />

在 某 些 情 况 下 , 汇 编 程 序 会 用 CMN 代 替 CMP, 或 用 CMP 代 替 CMN。 在 阅 读 反 汇 编 列<br />

表 时 要 清 楚 这 一 点 。 详 细 信 息 请 参 阅 第 4-35 页 的 指 令 替 换 。<br />

条 件 标 志<br />

这 些 指 令 根 据 结 果 更 新 N、 Z、 C 和 V 标 志 。<br />

使 用 r15<br />

如 果 将 r15 用 作 Rn, 则 使 用 的 值 是 指 令 的 地 址 加 上 8。<br />

在 带 有 寄 存 器 控 制 的 移 位 的 数 据 处 理 指 令 中 , 不 能 将 r15 用 作 任 何 操 作 数 ( 参 阅<br />

第 4-33 页 的 灵 活 的 第 二 操 作 数 )。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-43


<strong>ARM</strong> 指 令 参 考<br />

体 系 结 构<br />

这 些 指 令 在 所 有 版 本 的 <strong>ARM</strong> 体 系 结 构 中 有 效 。<br />

示 例<br />

CMP r2,r9<br />

CMN r0,#6400<br />

CMPGT r13,r7,LSL #2<br />

不 正 确 的 示 例<br />

CMP r2,r15,ASR r0 ; r15 not allowed with register<br />

; controlled shift<br />

4-44 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.3.6 TST 和 TEQ<br />

测 试 和 相 等 测 试 。<br />

语 法<br />

TST{cond} Rn, Operand2<br />

TEQ{cond} Rn, Operand2<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rn 是 存 放 第 一 个 操 作 数 的 <strong>ARM</strong> 寄 存 器 。<br />

Operand2<br />

用 法<br />

是 一 个 灵 活 的 第 二 操 作 数 。 详 细 的 选 项 信 息 请 参 阅 第 4-33 页 的 灵 活<br />

的 第 二 操 作 数 。<br />

这 些 指 令 将 寄 存 器 中 的 值 和 Operand2 进 行 测 试 。 它 们 更 新 结 果 的 条 件 标 志 , 但 不<br />

将 结 果 放 入 任 何 寄 存 器 中 。<br />

TST 指 令 对 Rn 的 值 和 Operand2 的 值 执 行 按 位 “ 与 ” 运 算 。 除 了 丢 弃 掉 结 果 之 外 ,<br />

这 与 ANDS 指 令 相 同 。<br />

TEQ 指 令 对 Rn 的 值 和 Operand2 的 值 执 行 按 位 “ 异 或 ” 运 算 。 除 了 丢 弃 掉 结 果 之<br />

外 , 这 与 EORS 指 令 相 同 。<br />

条 件 标 志<br />

这 些 指 令 :<br />

• 根 据 结 果 来 更 新 N 和 Z 标 志 。<br />

• 在 计 算 Operand2 时 会 更 新 C 标 志 ( 参 阅 第 4-33 页 的 灵 活 的 第 二 操 作 数 )<br />

• 不 影 响 V 标 志 。<br />

使 用 r15<br />

如 果 将 r15 用 作 Rn, 则 使 用 的 值 是 指 令 的 地 址 加 上 8。<br />

在 带 有 寄 存 器 控 制 移 位 的 数 据 处 理 指 令 中 , 不 能 将 r15 用 作 任 何 操 作 数 ( 参 阅 第<br />

4-33 页 的 灵 活 的 第 二 操 作 数 )。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-45


<strong>ARM</strong> 指 令 参 考<br />

体 系 结 构<br />

这 些 指 令 在 所 有 版 本 的 <strong>ARM</strong> 体 系 结 构 中 有 效 。<br />

示 例<br />

TST<br />

TEQEQ<br />

TSTNE<br />

r0,#0x3F8<br />

r10,r9<br />

r1,r5,ASR r1<br />

不 正 确 的 示 例<br />

TEQ r15,r1,ROR r0 ; r15 not allowed with register<br />

; controlled shift<br />

4-46 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.3.7 CLZ<br />

计 算 前 导 零 数 目 。<br />

语 法<br />

CLZ{cond} Rd, Rm<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 的 寄 存 器 。 Rd 不 能 是 r15。<br />

Rm 是 操 作 数 寄 存 器 。 Rm 不 能 是 r15。<br />

用 法<br />

CLZ 指 令 计 算 Rm 中 的 值 的 前 导 零 数 目 , 将 结 果 返 回 Rd 中 。 如 果 源 寄 存 器 中 未 设 置<br />

任 何 位 , 则 结 果 值 是 32 ; 如 果 设 置 了 第 31 位 则 结 果 为 0。<br />

条 件 标 志<br />

此 指 令 不 影 响 标 志 。<br />

体 系 结 构<br />

CLZ 在 版 本 5 及 更 高 版 本 体 系 结 构 中 有 效 。<br />

示 例<br />

CLZ<br />

CLZNE<br />

r4,r9<br />

r2,r3<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-47


<strong>ARM</strong> 指 令 参 考<br />

4.3.8 SEL<br />

根 据 CPSR GE 标 志 的 状 态 , 选 择 每 个 操 作 数 中 的 字 节 。<br />

语 法<br />

SEL{cond} Rd, Rn, Rm<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 的 寄 存 器 。<br />

Rn 是 包 含 第 一 个 操 作 数 的 寄 存 器 。<br />

Rm 是 包 含 第 二 个 操 作 数 的 寄 存 器 。<br />

不 要 将 r15 用 于 Rd、 Rn 或 Rm。<br />

用 法<br />

在 一 个 有 符 号 并 行 指 令 之 后 使 用 SEL 指 令 , 请 参 阅 第 4-83 页 的 并 行 加 法 和 减 法 。<br />

可 以 用 此 指 令 来 选 择 多 个 字 节 或 半 字 数 据 中 的 最 大 或 最 小 值 。<br />

运 算<br />

SEL 指 令 根 据 CPSR GE 标 志 来 从 Rn 或 Rm 中 选 择 字 节 :<br />

• 如 果 设 置 了 GE[0] , 则 Rd[7:0] 取 自 Rn[7:0], 否 则 取 自 Rm[7:0]<br />

• 如 果 设 置 了 GE[1] , 则 Rd[15:8] 取 自 Rn[15:8], 否 则 取 自 Rm[15:8]<br />

• 如 果 设 置 了 GE[2] , 则 Rd[23:16] 取 自 Rn[23:16], 否 则 取 自 Rm[23:16]<br />

• 如 果 设 置 了 GE[3] , 则 Rd[31:24] 取 自 Rn[31:24], 否 则 取 自 Rm[31:24]<br />

条 件 标 志<br />

此 指 令 不 影 响 标 志 。<br />

体 系 结 构<br />

SEL 指 令 在 v6 及 更 高 版 本 体 系 结 构 中 有 效 。<br />

4-48 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

示 例<br />

SEL<br />

SELLT<br />

r0, r4, r5<br />

r4, r0, r4<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-49


<strong>ARM</strong> 指 令 参 考<br />

4.3.9 REV、 REV16 和 REVSH<br />

反 转 一 个 字 或 半 字 中 的 字 节 顺 序 。 反 转 半 字 和 符 号 扩 展 中 的 字 节 顺 序 。<br />

语 法<br />

op{cond} Rd, Rm<br />

其 中 :<br />

op 是 以 下 值 之 一 :<br />

REV 反 转 一 个 字 中 的 字 节 顺 序 。<br />

REV16 反 转 Rm 的 每 个 半 字 中 的 字 节 顺 序 。<br />

REVSH 反 转 Rm 低 半 字 中 的 字 节 顺 序 , 并 且 符 号 扩 展 到 32 位 。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 的 寄 存 器 。<br />

Rm 是 包 含 第 二 个 操 作 数 的 寄 存 器 。<br />

不 要 将 r15 用 于 Rd 或 Rm。<br />

条 件 标 志<br />

此 指 令 不 影 响 标 志 。<br />

体 系 结 构<br />

这 些 指 令 在 v6 及 更 高 版 本 的 体 系 结 构 中 有 效 。<br />

示 例<br />

REV r3, r7<br />

REV16 r0, r0<br />

REVSH r0, r5 ; Reverse Signed Halfword<br />

REVHS r3, r7 ; Reverse with Higher or Same condition<br />

4-50 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.4 <strong>ARM</strong> 乘 法 指 令<br />

本 节 包 含 下 列 各 个 小 节 :<br />

• 第 4-53 页 的 MUL 和 MLA<br />

乘 法 和 乘 加 (32 位 乘 32 位 , 低 32 位 结 果 )。<br />

• 第 4-55 页 的 UMULL、 UMLAL、 SMULL 和 SMLAL<br />

无 符 号 和 有 符 号 乘 法 和 乘 加 (32 位 乘 32 位 , 64 位 结 果 或 64 位 累 加 器 )。<br />

• 第 4-57 页 的 SMULxy<br />

有 符 号 乘 法 (16 位 乘 16 位 , 32 位 结 果 )。<br />

• 第 4-58 页 的 SMLAxy<br />

有 符 号 乘 加 (16 位 乘 16 位 , 32 位 累 加 )。<br />

• 第 4-60 页 的 SMULWy<br />

有 符 号 乘 法 (32 位 乘 16 位 , 高 32 位 结 果 )。<br />

• 第 4-61 页 的 SMLAWy<br />

有 符 号 乘 加 (32 位 乘 16 位 , 高 32 位 累 加 )。<br />

• 第 4-63 页 的 SMLALxy<br />

有 符 号 乘 加 (16 位 乘 16 位 , 64 位 累 加 )。<br />

• 第 4-65 页 的 SMUAD 和 SMUSD<br />

两 个 16 位 有 符 号 乘 法 , 并 将 乘 积 相 加 或 相 减 。<br />

• 第 4-67 页 的 SMMUL<br />

32 位 乘 32 位 有 符 号 乘 法 , 高 32 位 结 果 。<br />

• 第 4-68 页 的 SMLAD 和 SMLSD<br />

两 个 16 位 有 符 号 乘 法 , 并 将 32 位 乘 积 的 和 或 差 进 行 32 位 累 加 。<br />

• 第 4-70 页 的 SMMLA 和 SMMLS<br />

32 位 乘 32 位 有 符 号 乘 法 , 高 32 位 结 果 的 乘 积 进 行 32 位 累 加 。<br />

32 位 乘 32 位 有 符 号 乘 法 , 从 32 位 值 中 减 去 乘 积 的 高 32 位 值 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-51


<strong>ARM</strong> 指 令 参 考<br />

• 第 4-72 页 的 SMLALD 和 SMLSLD<br />

两 个 16 位 有 符 号 乘 法 , 并 将 32 位 乘 积 的 和 或 差 进 行 64 位 累 加 。<br />

• 第 4-74 页 的 UMAAL<br />

无 符 号 乘 加 , 长 整 型 累 加 。<br />

• 第 4-75 页 的 MIA/MIAPH 和 MIAxy<br />

XScale 协 处 理 器 0 指 令 。<br />

带 内 部 累 加 的 乘 法 (32 位 乘 32 位 , 40 位 累 加 )。<br />

带 内 部 累 加 的 乘 法 , 组 合 半 字 (16 位 乘 16 位 两 次 , 40 位 累 加 )。<br />

带 内 部 累 加 的 乘 法 (16 位 乘 16 位 , 40 位 累 加 )。<br />

4-52 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.4.1 MUL 和 MLA<br />

乘 法 和 乘 加 (32 位 乘 32 位 , 低 32 位 结 果 )。<br />

语 法<br />

MUL{cond}{S} Rd, Rm, Rs<br />

MLA{cond}{S} Rd, Rm, Rs, Rn<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

S<br />

是 一 个 可 选 的 后 缀 。 如 果 指 定 了 S, 则 在 运 算 结 果 上 更 新 条 件 码 标<br />

志 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 的 寄 存 器 。<br />

Rm、 Rs、 Rn 是 存 放 操 作 数 的 寄 存 器 。<br />

Rd、 Rm、 Rs 或 Rn 都 不 能 使 用 r15。<br />

Rd 不 能 与 Rm 相 同 。<br />

用 法<br />

MUL 指 令 将 Rm 和 Rs 中 的 值 相 乘 , 并 将 结 果 的 最 低 有 效 32 位 值 放 入 Rd 中 。<br />

MLA 指 令 将 Rm 和 Rs 中 的 值 相 乘 , 加 上 Rn 中 的 值 , 并 将 结 果 的 最 低 有 效 32 位 值 放<br />

入 Rd 中 。<br />

条 件 标 志<br />

如 果 指 定 了 S, 则 下 列 指 令 :<br />

• 根 据 结 果 来 更 新 N 和 Z 标 志 。<br />

• 不 影 响 V 标 志<br />

• 在 v4 及 更 早 版 本 体 系 结 构 中 破 坏 C 标 志<br />

• 在 v5 及 更 高 版 本 体 系 结 构 中 不 影 响 C 标 志 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-53


<strong>ARM</strong> 指 令 参 考<br />

体 系 结 构<br />

这 些 指 令 在 v2 及 更 高 版 本 的 体 系 结 构 中 有 效 。<br />

示 例<br />

MUL r10,r2,r5<br />

MLA r10,r2,r1,r5<br />

MULS r0,r2,r2<br />

MULLT r2,r3,r2<br />

MLAVCS r8,r6,r3,r8<br />

不 正 确 的 示 例<br />

MUL r15,r0,r3 ; use of r15 not allowed<br />

MLA r1,r1,r6 ; Rd cannot be the same as Rm<br />

4-54 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.4.2 UMULL、 UMLAL、 SMULL 和 SMLAL<br />

无 符 号 和 有 符 号 长 整 数 乘 法 和 乘 加 (32 位 乘 32 位 , 64 位 累 加 或 结 果 )。<br />

语 法<br />

Op{cond}{S} RdLo, RdHi, Rm, Rs<br />

其 中 :<br />

Op 是 UMULL、 UMLAL、 SMULL 或 SMLAL 之 一 。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

S<br />

是 一 个 可 选 的 后 缀 。 如 果 指 定 了 S, 则 在 运 算 结 果 上 更 新 条 件 码 标<br />

志 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

RdLo、 RdHi 是 目 的 寄 存 器 。 对 于 UMLAL 和 SMLAL 指 令 , 它 们 也 存 放 累 加 值 。<br />

Rm、 Rs 是 存 放 操 作 数 的 <strong>ARM</strong> 寄 存 器 。<br />

不 要 将 r15 用 于 RdHi、 RdLo、 Rm 或 Rs。<br />

RdLo、 RdHi 和 Rm 都 必 须 是 不 同 的 寄 存 器 。<br />

用 法<br />

UMULL 指 令 将 取 自 Rm 和 Rs 的 值 解 释 为 无 符 号 整 数 。 它 将 这 些 整 数 相 乘 , 将 结 果<br />

的 最 低 有 效 32 位 放 到 RdLo 中 , 将 结 果 的 最 高 有 效 32 位 放 到 RdHi 中 。<br />

UMLAL 指 令 将 取 自 Rm 和 Rs 的 值 解 释 为 有 符 号 整 数 的 二 进 制 补 码 。 其 将 这 些 整 数<br />

相 乘 , 并 将 64 结 果 加 到 RdHi 和 RdLo 中 包 含 的 64 位 无 符 号 整 数 上 。<br />

SMULL 指 令 将 取 自 Rm 和 Rs 的 值 解 释 为 有 符 号 整 数 的 二 进 制 补 码 。 其 将 这 些 整 数 相<br />

乘 , 将 结 果 的 最 低 有 效 32 位 放 到 RdLo 中 , 将 结 果 的 最 高 有 效 32 位 放 到 RdHi 中 。<br />

SMLAL 指 令 将 取 自 Rm 和 Rs 的 值 解 释 为 有 符 号 整 数 的 二 进 制 补 码 。 它 将 这 些 整 数 相<br />

乘 , 并 将 64 结 果 加 到 RdHi 和 RdLo 中 包 含 的 64 位 有 符 号 整 数 上 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-55


<strong>ARM</strong> 指 令 参 考<br />

条 件 标 志<br />

如 果 指 定 了 S, 则 下 列 指 令 :<br />

• 根 据 结 果 来 更 新 N 和 Z 标 志 ;<br />

• 在 v4 及 更 早 版 本 体 系 结 构 中 破 坏 C 和 V 标 志 ;<br />

• 在 v5 及 更 高 版 本 体 系 结 构 中 不 影 响 C 或 V 标 志 。<br />

体 系 结 构<br />

这 些 指 令 于 v3M 体 系 结 构 中 , 以 及 除 xM 变 体 外 的 v4 及 更 高 版 本 体 系 结 构 中<br />

有 效 。<br />

示 例<br />

UMULL<br />

UMLALS<br />

SMLALLES<br />

SMULLNE<br />

r0,r4,r5,r6<br />

r4,r5,r3,r8<br />

r8,r9,r7,r6<br />

r0,r1,r9,r0 ; Rs can be the same as other<br />

; registers<br />

不 正 确 的 示 例<br />

UMULL r1,r15,r10,r2 ; use of r15 not allowed<br />

SMULLLE r0,r1,r0,r5 ; RdLo, RdHi and Rm must all be<br />

; different registers<br />

4-56 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.4.3 SMULxy<br />

有 符 号 乘 法 (16 位 乘 16 位 , 32 位 结 果 )。<br />

语 法<br />

SMUL{cond} Rd, Rm, Rs<br />

其 中 :<br />

<br />

<br />

是 B 或 T。 B 表 示 使 用 Rm 的 低 位 ([15:0] 位 ), T 表 示 使 用 Rm 的 高<br />

位 ([31:16] 位 )。<br />

是 B 或 T。 B 表 示 使 用 Rs 的 低 位 ([15:0] 位 ), T 表 示 使 用 Rs 的 高<br />

位 ([31:16] 位 )。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 的 寄 存 器 。<br />

Rm、 Rs 是 存 放 乘 数 的 寄 存 器 。<br />

Rd、 Rm 或 Rs 都 不 能 使 用 r15。<br />

Rd、 Rm 和 Rs 的 任 何 组 合 都 可 使 用 相 同 的 寄 存 器 。<br />

用 法<br />

SMULxy 将 从 Rm 和 Rs 的 选 定 半 字 取 出 的 16 位 有 符 号 整 数 相 乘 , 并 将 32 位 结 果 放<br />

入 Rd 中 。<br />

条 件 标 志<br />

SMULxy 不 影 响 任 何 标 志 。<br />

体 系 结 构<br />

SMULxy 指 令 在 v6 及 更 高 版 本 体 系 结 构 中 , 以 及 v5 体 系 结 构 的 E 变 体 中 有 效 。<br />

示 例<br />

SMULTBEQ<br />

r8,r7,r9<br />

不 正 确 的 示 例<br />

SMULBT r15,r2,r0 ; use of r15 not allowed<br />

SMULTTS r0,r6,r2 ; use of S suffix not allowed<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-57


<strong>ARM</strong> 指 令 参 考<br />

4.4.4 SMLAxy<br />

有 符 号 乘 加 (16 位 乘 16 位 , 32 位 累 加 )。<br />

语 法<br />

SMLA{cond} Rd, Rm, Rs, Rn<br />

其 中 :<br />

<br />

<br />

是 B 或 T。 B 表 示 使 用 Rm 的 低 位 ([15:0] 位 ), T 表 示 使 用 Rm 的 高<br />

位 ([31:16] 位 )。<br />

是 B 或 T。 B 表 示 使 用 Rs 的 低 位 ([15:0] 位 ), T 表 示 使 用 Rs 的 高<br />

位 ([31:16] 位 )。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 的 寄 存 器 。<br />

Rm、 Rs 是 存 放 乘 数 的 寄 存 器 。<br />

Rn 是 存 放 加 数 的 寄 存 器 。<br />

Rd、 Rm、 Rs 或 Rn 都 不 能 使 用 r15。<br />

Rd、 Rm 、 Rs 和 Rn 的 任 何 组 合 都 可 使 用 相 同 的 寄 存 器 。<br />

用 法<br />

SMLAxy 指 令 将 从 Rm 和 Rs 的 选 定 半 字 取 出 的 16 位 有 符 号 整 数 相 乘 , 将 32 结 果 加<br />

到 Rn 中 的 32 位 值 中 , 并 将 结 果 存 放 到 Rd 中 。<br />

条 件 标 志<br />

SMLAxy 不 影 响 N、 Z、 C 或 V 标 志 。<br />

如 果 在 累 加 时 发 生 溢 出 , 则 SMLAxy 设 置 Q 标 志 。 要 读 取 Q 标 志 的 状 态 , 请 使 用<br />

MRS 指 令 ( 参 阅 第 4-115 页 的 MRS)。<br />

备 注<br />

SMLAxy 永 远 不 清 除 Q 标 志 。 要 清 除 Q 标 志 , 请 使 用 MSR 指 令 ( 参 阅 第 4-116 页 的<br />

MSR)。<br />

4-58 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

体 系 结 构<br />

SMLAxy 指 令 在 v6 及 更 高 版 本 体 系 结 构 中 , 以 及 v5 体 系 结 构 的 E 变 体 中 有 效 。<br />

示 例<br />

SMLATT<br />

SMLABBNE<br />

SMLABT<br />

r8,r1,r0,r8<br />

r0,r2,r1,r10<br />

r0,r0,r3,r5<br />

不 正 确 的 示 例<br />

SMLATB r0,r7,r8,r15 ; use of r15 not allowed<br />

SMLATTS r0,r6,r2 ; use of S suffix not allowed<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-59


<strong>ARM</strong> 指 令 参 考<br />

4.4.5 SMULWy<br />

有 符 号 乘 法 (32 位 乘 16 位 , 高 32 位 结 果 )。<br />

语 法<br />

SMULW{cond} Rd, Rm, Rs<br />

其 中 :<br />

<br />

是 B 或 T。 B 表 示 使 用 Rs 的 低 位 ([15:0] 位 ), T 表 示 使 用 Rs 的 高<br />

位 ([31:16] 位 )。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 的 寄 存 器 。<br />

Rm、 Rs 是 存 放 操 作 数 的 寄 存 器 。<br />

Rd、 Rm 或 Rs 都 不 能 使 用 r15。<br />

Rd、 Rm 或 Rs 的 任 何 组 合 都 可 使 用 相 同 的 寄 存 器 。<br />

用 法<br />

SMULWy 将 从 Rs 的 选 定 半 字 取 出 的 有 符 号 整 数 , 乘 以 从 Rm 取 出 的 有 符 号 整 数 , 并<br />

将 48 位 结 果 的 高 32 位 存 放 到 Rd 中 。<br />

条 件 标 志<br />

SMULWy 不 影 响 任 何 标 志 。<br />

体 系 结 构<br />

SMULWy 指 令 在 v6 及 更 高 版 本 体 系 结 构 中 , 以 及 v5 体 系 结 构 的 E 变 体 中 有 效 。<br />

示 例<br />

SMULWB<br />

SMULWTVS<br />

r2,r4,r7<br />

r0,r0,r9<br />

不 正 确 的 示 例<br />

SMULWT r15,r9,r3 ; use of r15 not allowed<br />

SMULWBS r0,r4,r5 ; use of S suffix not allowed<br />

4-60 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.4.6 SMLAWy<br />

有 符 号 乘 加 (32 位 乘 16 位 , 高 32 位 累 加 )。<br />

语 法<br />

SMLAW{cond} Rd, Rm, Rs, Rn<br />

其 中 :<br />

<br />

是 B 或 T。 B 表 示 使 用 Rs 的 低 位 ([15:0] 位 ), T 表 示 使 用 Rs 的 高<br />

位 ([31:16] 位 )。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 的 寄 存 器 。<br />

Rm、 Rs 是 存 放 要 相 乘 的 值 的 寄 存 器 。<br />

Rn 是 存 放 要 相 加 的 值 的 寄 存 器 。<br />

Rd、 Rm、 Rs 或 Rn 都 不 能 使 用 r15。<br />

Rd、 Rm 、 Rs 和 Rn 的 任 何 组 合 都 可 使 用 相 同 的 寄 存 器 。<br />

用 法<br />

SMLAWy 将 从 Rs 的 选 定 半 字 取 出 的 有 符 号 整 数 , 乘 以 从 Rm 取 出 的 有 符 号 整 数 , 将<br />

32 位 结 果 加 到 Rn 中 的 32 位 值 上 , 并 将 结 果 放 到 Rd 中 。<br />

条 件 标 志<br />

SMLAWy 不 影 响 N、 Z、 C 或 V 标 志 。<br />

如 果 在 累 加 时 发 生 溢 出 , 则 SMLAWy 设 置 Q 标 志 。 要 读 取 Q 标 志 的 状 态 , 请 使 用<br />

MRS 指 令 ( 参 阅 第 4-115 页 的 MRS)。<br />

备 注<br />

SMLAWy 永 远 不 清 除 Q 标 志 。 要 清 除 Q 标 志 , 请 使 用 MSR 指 令 ( 参 阅 第 4-116 页 的<br />

MSR)。<br />

体 系 结 构<br />

SMLAWy 指 令 在 v6 及 更 高 版 本 体 系 结 构 中 , 以 及 v5 体 系 结 构 的 E 变 体 中 有 效 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-61


<strong>ARM</strong> 指 令 参 考<br />

示 例<br />

SMLAWB<br />

SMLAWTVS<br />

r2,r4,r7,r1<br />

r0,r0,r9,r2<br />

不 正 确 的 示 例<br />

SMLAWT r15,r9,r3,r1 ; use of r15 not allowed<br />

SMLAWBS r0,r4,r5,r1 ; use of S suffix not allowed<br />

4-62 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.4.7 SMLALxy<br />

有 符 号 乘 加 (16 位 乘 16 位 , 64 位 累 加 )。<br />

语 法<br />

SMLAL{cond} RdLo, RdHi, Rm, Rs<br />

其 中 :<br />

<br />

<br />

是 B 或 T。 B 表 示 使 用 Rm 的 低 位 ([15:0] 位 ), T 表 示 使 用 Rm 的 高<br />

位 ([31:16] 位 )。<br />

是 B 或 T。 B 表 示 使 用 Rs 的 低 位 ([15:0] 位 ), T 表 示 使 用 Rs 的 高<br />

位 ([31:16] 位 )。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

RdHi、 RdLo 是 目 的 寄 存 器 。 它 们 也 存 放 累 加 值 。<br />

Rm、 Rs 存 放 要 相 乘 的 值 的 寄 存 器 。<br />

不 要 将 r15 用 于 RdHi、 RdLo、 Rm 或 Rs。<br />

RdHi、 RdLo、 Rm 或 Rs 的 任 何 组 合 都 可 使 用 相 同 的 寄 存 器 。<br />

用 法<br />

SMLALxy 将 从 Rs 的 选 定 半 字 取 出 的 有 符 号 整 数 , 乘 以 从 Rm 的 选 定 半 字 取 出 的 有 符<br />

号 整 数 , 并 将 32 位 结 果 加 到 RdHi 和 RdLo 中 的 64 位 值 上 。<br />

条 件 标 志<br />

SMLALxy 不 影 响 任 何 标 志 。<br />

备 注<br />

SMLALxy 不 会 产 生 异 常 。 如 果 在 此 指 令 中 发 生 溢 出 , 则 结 果 绕 回 而 不 发 出 警 告 。<br />

体 系 结 构<br />

SMLALxy 指 令 在 v6 及 更 高 版 本 体 系 结 构 中 , 以 及 v5 体 系 结 构 的 E 变 体 中 有 效 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-63


<strong>ARM</strong> 指 令 参 考<br />

示 例<br />

SMLALTB<br />

SMLALBTVS<br />

r2,r3,r7,r1<br />

r0,r1,r9,r2<br />

不 正 确 的 示 例<br />

SMLALTT r8,r9,r3,r15 ; use of r15 not allowed<br />

SMLALBBS r0,r1,r5,r2 ; use of S suffix not allowed<br />

4-64 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.4.8 SMUAD 和 SMUSD<br />

两 个 16 位 有 符 号 乘 法 , 并 将 乘 积 相 加 或 相 减 。<br />

语 法<br />

op{X}{cond} Rd, Rm, Rs<br />

其 中 :<br />

op 是 下 列 指 令 之 一 :<br />

X<br />

SMUAD 两 个 乘 法 , 将 乘 积 相 加 。<br />

SMUSD 两 个 乘 法 , 将 乘 积 相 减 。<br />

是 一 个 可 选 的 参 数 。 如 果 存 在 X, 则 在 执 行 乘 法 之 前 , 交 换 第 二 个<br />

操 作 数 的 高 半 字 和 低 半 字 。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 的 寄 存 器 。<br />

Rm 是 存 放 第 一 个 操 作 数 的 寄 存 器 。<br />

Rs 是 存 放 第 二 个 操 作 数 的 寄 存 器 。<br />

不 要 将 r15 用 于 任 何 Rd、 Rm 或 Rs 。<br />

运 算<br />

SMUAD 将 Rm 的 低 半 字 与 第 二 个 操 作 数 的 低 半 字 相 乘 , 并 将 Rm 的 高 半 字 与 第 二 个<br />

操 作 数 的 高 半 字 相 乘 。 然 后 将 乘 积 相 加 , 并 将 和 存 储 到 Rd。<br />

SMUSD 将 Rm 的 低 半 字 与 第 二 个 操 作 数 的 低 半 字 相 乘 , 并 将 Rm 的 高 半 字 与 第 二 个 操<br />

作 数 的 高 半 字 相 乘 。 然 后 从 第 一 个 乘 积 中 减 去 第 二 个 乘 积 , 并 将 差 值 存 储 到 Rd。<br />

条 件 标 志<br />

这 些 指 令 不 影 响 任 何 标 志 。<br />

体 系 结 构<br />

这 些 指 令 在 v6 及 更 高 版 本 的 体 系 结 构 中 有 效 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-65


<strong>ARM</strong> 指 令 参 考<br />

示 例<br />

SMUAD<br />

SMUSDXNE<br />

r2, r3, r2<br />

r0, r1, r2<br />

4-66 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.4.9 SMMUL<br />

32 位 乘 32 位 有 符 号 乘 法 , 只 产 生 结 果 的 最 高 32 位 。<br />

语 法<br />

SMMUL{R}{cond} Rd, Rm, Rs<br />

其 中 :<br />

R<br />

是 一 个 可 选 的 参 数 。 如 果 存 在 R, 则 对 结 果 进 行 舍 入 , 否 则 将 其<br />

截 断 。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 的 寄 存 器 。<br />

Rm 是 存 放 第 一 个 操 作 数 的 寄 存 器 。<br />

Rs 是 存 放 第 二 个 操 作 数 的 寄 存 器 。<br />

Rd、 Rm 或 Rs 都 不 能 使 用 r15。<br />

运 算<br />

SMMUL 将 Rm 和 Rs 的 值 相 乘 , 并 将 产 生 的 64 位 结 果 的 最 高 位 32 位 存 储 到 Rd。<br />

如 果 指 定 了 可 选 R 参 数 , 则 在 提 取 最 高 32 位 之 前 加 上 0x80000000。 这 对 结 果 的 舍<br />

入 有 影 响 。<br />

条 件 标 志<br />

SMMUL 不 影 响 任 何 标 志 。<br />

体 系 结 构<br />

SMMUL 在 v6 及 更 高 版 本 <strong>ARM</strong> 体 系 结 构 中 有 效 。<br />

示 例<br />

SMMULGE<br />

SMMULR<br />

r6, r4, r3<br />

r2, r2, r2<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-67


<strong>ARM</strong> 指 令 参 考<br />

4.4.10 SMLAD 和 SMLSD<br />

两 个 16 位 有 符 号 乘 法 , 将 乘 积 相 加 或 相 减 , 并 进 行 32 位 累 加 。<br />

语 法<br />

op{X}{cond} Rd, Rm, Rs, Rn<br />

其 中 :<br />

op 是 下 列 指 令 之 一 :<br />

SMLAD 两 个 乘 法 , 累 加 乘 积 的 和 。<br />

SMLSD 两 个 乘 法 , 累 加 乘 积 的 差 。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

X<br />

是 一 个 可 选 的 参 数 。 如 果 存 在 X, 则 在 执 行 乘 法 之 前 , 交 换 第 二 个<br />

操 作 数 的 高 半 字 和 低 半 字 。<br />

Rd 是 目 的 寄 存 器 。<br />

Rm 是 存 放 第 一 个 操 作 数 的 寄 存 器 。<br />

Rs 是 存 放 第 二 个 操 作 数 的 寄 存 器 。<br />

Rn 是 存 放 累 加 操 作 数 的 寄 存 器 。<br />

Rd、 Rm、 Rs 或 Rn 都 不 能 使 用 r15。<br />

运 算<br />

SMLAD 将 Rm 的 低 半 字 与 第 二 个 操 作 数 的 低 半 字 相 乘 , 并 将 Rm 的 高 半 字 与 第 二 个<br />

操 作 数 的 高 半 字 相 乘 。 然 后 它 将 两 个 乘 积 加 到 Rn 的 值 上 , 并 将 所 得 的 和 存 放 到<br />

Rd 中 。<br />

SMLSD 将 Rm 的 低 半 字 与 第 二 个 操 作 数 的 低 半 字 相 乘 , 并 将 Rm 的 高 半 字 与 第 二 个<br />

操 作 数 的 高 半 字 相 乘 。 然 后 从 第 一 个 乘 积 中 减 去 第 二 个 乘 积 , 将 所 得 的 差 加 到 Rn<br />

的 值 上 , 并 把 结 果 存 放 到 Rd 中 。<br />

条 件 标 志<br />

这 些 指 令 不 影 响 任 何 标 志 。<br />

4-68 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

体 系 结 构<br />

这 些 指 令 在 v6 及 更 高 版 本 的 体 系 结 构 中 有 效 。<br />

示 例<br />

SMLSD<br />

SMLSDX<br />

SMLADLT<br />

r1, r2, r0, r7<br />

r11, r10, r2, r3<br />

r1, r2, r4, r1<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-69


<strong>ARM</strong> 指 令 参 考<br />

4.4.11 SMMLA 和 SMMLS<br />

32 位 乘 32 位 有 符 号 乘 法 , 取 最 高 32 位 结 果 , 进 行 32 位 累 加 。<br />

32 位 乘 32 位 有 符 号 乘 法 , 取 最 高 32 位 结 果 , 从 32 位 值 中 减 去 它 。<br />

语 法<br />

op{R}{cond} Rd, Rm, Rs, Rn<br />

其 中 :<br />

op 是 下 列 指 令 之 一 :<br />

R<br />

SMMLA 乘 法 、 累 加 并 截 断 或 舍 入 。<br />

SMMLS 乘 法 、 从 Rn 中 减 去 乘 积 值 , 并 截 断 或 舍 入 。<br />

是 一 个 可 选 的 参 数 。 如 果 存 在 R, 则 对 结 果 进 行 舍 入 , 否 则 将 其<br />

截 断 。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 的 寄 存 器 。<br />

Rm 是 存 放 第 一 个 操 作 数 的 寄 存 器 。<br />

Rs 是 存 放 第 二 个 操 作 数 的 寄 存 器 。<br />

Rn 是 存 放 累 加 操 作 数 的 寄 存 器 。<br />

Rd、 Rm、 Rs 或 Rn 都 不 能 使 用 r15。<br />

运 算<br />

SMMLA 将 Rm 和 Rs 中 的 值 相 乘 , 将 Rn 的 值 加 到 乘 积 的 最 高 32 位 上 , 并 将 结 果 存 储<br />

在 Rd 中 。<br />

SMMLS 将 Rm 和 Rs 中 的 值 相 乘 , 从 Rn 的 值 左 移 32 位 后 的 结 果 中 减 去 该 乘 积 , 并 将<br />

最 高 有 效 32 位 结 果 存 储 在 Rd 中 。<br />

如 果 指 定 了 可 选 R 参 数 , 则 在 提 取 最 高 位 32 位 之 前 加 上 0x80000000。 这 对 结 果 的<br />

舍 入 有 影 响 。<br />

条 件 标 志<br />

这 些 指 令 不 影 响 任 何 标 志 。<br />

4-70 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

体 系 结 构<br />

这 些 指 令 在 v6 及 更 高 版 本 的 体 系 结 构 中 有 效 。<br />

示 例<br />

SMMLAREQ<br />

SMMLS<br />

r0, r3, r7, r5<br />

r2, r1, r5, r3<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-71


<strong>ARM</strong> 指 令 参 考<br />

4.4.12 SMLALD 和 SMLSLD<br />

两 个 16 位 有 符 号 乘 法 , 将 乘 积 相 加 或 相 减 , 并 进 行 64 位 累 加 。<br />

语 法<br />

op{X}{cond} RdLo, RdHi, Rm, Rs<br />

其 中 :<br />

op 是 下 列 值 之 一 :<br />

X<br />

SMLALD 两 个 乘 法 , 累 加 乘 积 的 和 。<br />

SMLSLD 两 个 乘 法 , 累 加 乘 积 的 差 。<br />

是 一 个 可 选 的 参 数 。 如 果 存 在 X, 则 在 执 行 乘 法 之 前 , 交 换 第 二 个<br />

操 作 数 的 高 半 字 和 低 半 字 。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

RdLo、 RdHi 是 存 放 64 位 结 果 的 目 的 寄 存 器 。 它 们 也 存 放 64 位 累 加 操 作 数 。<br />

Rm 是 存 放 第 一 个 操 作 数 的 寄 存 器 。<br />

Rs 是 存 放 第 二 个 操 作 数 的 寄 存 器 。<br />

不 要 将 r15 用 于 任 何 RdLo、 RdHi、 Rm 或 Rs 。<br />

运 算<br />

SMLALD 将 Rm 的 低 半 字 与 第 二 个 操 作 数 的 低 半 字 相 乘 , 并 将 Rm 的 高 半 字 与 第 二 个<br />

操 作 数 的 高 半 字 相 乘 。 然 后 它 将 两 个 乘 积 加 到 RdLo、RdHi 的 值 上 , 并 将 所 得 的 和<br />

存 放 到 RdLo、 RdHi 中 。<br />

SMLSLD 将 Rm 的 低 半 字 与 第 二 个 操 作 数 的 低 半 字 相 乘 , 并 将 Rm 的 高 半 字 与 第 二 个<br />

操 作 数 的 高 半 字 相 乘 。 然 后 从 第 一 个 乘 积 中 减 去 第 二 个 乘 积 , 将 所 得 的 差 加 到<br />

RdLo、 RdHi 的 值 上 , 并 把 结 果 存 放 到 RdLo、 RdHi 中 。<br />

条 件 标 志<br />

这 些 指 令 不 影 响 任 何 标 志 。<br />

4-72 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

体 系 结 构<br />

这 些 指 令 在 v6 及 更 高 版 本 的 体 系 结 构 中 有 效 。<br />

示 例<br />

SMLALD<br />

SMLSLD<br />

r10, r11, r5, r1<br />

r3, r0, r5, r1<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-73


<strong>ARM</strong> 指 令 参 考<br />

4.4.13 UMAAL<br />

无 符 号 乘 加 , 长 整 型 累 加 。<br />

语 法<br />

UMAAL{cond} RdLo, RdHi, Rm, Rs<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

RdLo, RdHi 是 存 放 64 位 结 果 的 目 的 寄 存 器 。 它 们 也 存 放 两 个 32 位 累 加 操 作 数 。<br />

Rm 是 存 放 第 一 个 乘 法 操 作 数 的 寄 存 器 。<br />

Rs 是 存 放 第 二 个 乘 法 操 作 数 的 寄 存 器 。<br />

RdLo、 RdHi、 Rm 或 Rs 都 不 能 使 用 r15。<br />

运 算<br />

UMAAL 指 令 将 Rm 和 Rs 中 的 32 位 值 相 乘 , 加 上 RdHi 和 RdLo 中 的 两 个 32 位 值 , 并<br />

将 64 位 结 果 存 储 到 RdLo、 RdHi 中 。<br />

条 件 标 志<br />

UMAAL 不 影 响 任 何 标 志 。<br />

体 系 结 构<br />

UMAAL 在 v6 及 更 高 版 本 体 系 结 构 中 有 效 。<br />

示 例<br />

UMAAL<br />

UMAALGE<br />

r8, r9, r2, r3<br />

r2, r0, r5, r3<br />

4-74 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.4.14 MIA/MIAPH 和 MIAxy<br />

XScale 协 处 理 器 0 指 令 。<br />

带 内 部 累 加 的 乘 法 (32 位 乘 32 位 , 40 位 累 加 )。<br />

带 内 部 累 加 的 乘 法 , 组 合 半 字 (16 位 乘 16 位 两 次 , 40 位 累 加 )。<br />

带 内 部 累 加 的 乘 法 (16 位 乘 16 位 , 40 位 累 加 )。<br />

语 法<br />

MIA{cond} Acc, Rm, Rs<br />

MIAPH{cond} Acc, Rm, Rs<br />

MIA{cond} Acc, Rm, Rs<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Acc 是 内 部 累 加 器 。 标 准 名 称 是 accx, 其 中 x 是 一 个 0-n 范 围 内 的 整 数 。<br />

n 的 值 依 赖 于 处 理 器 。 在 目 前 的 处 理 器 中 它 是 0。<br />

Rm、 Rs 是 存 放 要 相 乘 的 值 的 <strong>ARM</strong> 寄 存 器 。<br />

<br />

<br />

是 B 或 T。 B 表 示 使 用 Rm 的 低 位 ([15:0] 位 ), T 表 示 使 用 Rm 的 高<br />

位 ([31:16] 位 )。<br />

是 B 或 T。 B 表 示 使 用 Rs 的 低 位 ([15:0] 位 ), T 表 示 使 用 Rs 的 高<br />

位 ([31:16] 位 )。<br />

不 要 将 r15 用 于 Rm 或 Rs。<br />

用 法<br />

MIA 指 令 将 Rs 和 Rm 中 的 有 符 号 整 数 相 乘 , 并 将 结 果 加 到 Acc 的 40 位 值 中 。<br />

MIAPH 指 令 将 Rs 和 Rm 的 低 半 字 有 符 号 整 数 相 乘 , 指 令 将 Rs 和 Rm 的 高 半 字 有 符 号<br />

整 数 相 乘 , 并 将 两 个 32 位 结 果 加 到 Acc 的 40 位 值 中 。<br />

MIAxy 指 令 将 从 Rs 的 选 定 半 字 取 出 的 有 符 号 整 数 , 乘 以 从 Rm 的 选 定 半 字 取 出 的<br />

有 符 号 整 数 , 并 将 32 位 结 果 加 到 Acc 的 40 位 值 上 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-75


<strong>ARM</strong> 指 令 参 考<br />

条 件 标 志<br />

这 些 指 令 不 影 响 任 何 标 志 。<br />

备 注<br />

这 些 指 令 不 会 产 生 异 常 。 如 果 在 这 些 指 令 中 发 生 溢 出 , 则 结 果 绕 回 而 不 发 出 警<br />

告 。<br />

体 系 结 构<br />

这 些 指 令 只 在 XScale 处 理 器 中 有 效 。<br />

示 例<br />

MIA acc0,r5,r0<br />

MIALE acc0,r1,r9<br />

MIAPH acc0,r0,r7<br />

MIAPHNE acc0,r11,r10<br />

MIABB acc0,r8,r9<br />

MIABT acc0,r8,r8<br />

MIATB acc0,r5,r3<br />

MIATT acc0,r0,r6<br />

MIABTGT acc0,r2,r5<br />

4-76 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.5 <strong>ARM</strong> 饱 和 指 令<br />

本 节 包 含 下 列 各 个 小 节 :<br />

• 饱 和 的 含 义 ;<br />

• 第 4-78 页 的 QADD、 QSUB、 QDADD 和 QDSUB ;<br />

• 第 4-80 页 的 SSAT 和 USAT。<br />

有 些 并 行 指 令 也 是 饱 和 指 令 , 请 参 阅 第 4-82 页 的 <strong>ARM</strong> 并 行 指 令 。<br />

4.5.1 饱 和 的 含 义<br />

这 些 运 算 是 饱 和 的 (SAT)。 这 意 味 着 , 对 于 依 赖 于 指 令 的 一 些 2 n 值 :<br />

• 对 于 有 符 号 饱 和 运 算 , 如 果 整 个 结 果 将 小 于 -2 n , 那 么 返 回 的 结 果 是 -2 n ;<br />

• 对 于 无 符 号 饱 和 运 算 , 如 果 整 个 结 果 将 是 负 值 , 那 么 返 回 的 结 果 是 0 ;<br />

• 如 果 整 个 结 果 将 大 于 2 n - 1, 那 么 返 回 的 结 果 是 2 n - 1。<br />

当 出 现 任 何 这 些 情 况 时 , 就 将 其 称 为 饱 和 。 当 出 现 饱 和 时 , 有 些 指 令 会 设 置 Q<br />

标 志 。<br />

备 注<br />

当 未 出 现 饱 和 时 , 饱 和 指 令 不 清 除 Q 标 志 。 要 清 除 Q 标 志 , 请 使 用 MSR 指 令 ( 参<br />

阅 第 4-116 页 的 MSR)。<br />

也 可 以 用 其 它 两 个 指 令 来 设 置 Q 标 志 ( 参 阅 第 4-58 页 的 SMLAxy 和 第 4-61 页 的<br />

SMLAWy), 但 这 些 指 令 不 饱 和 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-77


<strong>ARM</strong> 指 令 参 考<br />

4.5.2 QADD、 QSUB、 QDADD 和 QDSUB<br />

有 符 号 加 法 、 减 法 、 加 倍 乘 法 、 加 倍 减 法 , 将 结 果 饱 和 到 有 符 号 范 围 – 2 31 ≤ x ≤<br />

2 31 – 1。<br />

另 请 参 阅 第 4-83 页 的 并 行 加 法 和 减 法 。<br />

语 法<br />

op{cond} Rd, Rm, Rn<br />

其 中 :<br />

op 是 QADD、 QSUB,、 QDADD 或 QDSUB 之 一 。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 标 寄 存 器 。<br />

Rm、 Rn 是 存 放 操 作 数 的 寄 存 器 。<br />

不 能 将 r15 用 于 Rd、 Rm 或 Rn。<br />

用 法<br />

QADD 指 令 将 Rm 和 Rn 中 的 值 相 加 。<br />

QSUB 指 令 将 Rm 的 值 减 去 Rn 的 值 。<br />

QDADD 指 令 计 算 SAT(Rm + SAT(Rn * 2))。 在 加 倍 运 算 、 加 法 或 两 者 上 会 出 现 饱 和 。<br />

如 果 在 加 倍 运 算 而 非 加 法 上 发 生 饱 和 , 则 设 置 Q 标 志 , 但 最 终 结 果 是 不 饱 和 的 。<br />

QDSUB 指 令 计 算 SAT(Rm - SAT(Rn * 2))。 在 加 倍 运 算 、 减 法 或 两 者 上 会 出 现 饱 和 。<br />

如 果 在 加 倍 运 算 而 非 减 法 上 发 生 饱 和 , 则 设 置 Q 标 志 , 但 最 终 结 果 是 不 饱 和 的 。<br />

备 注<br />

这 些 指 令 将 所 有 值 当 作 有 符 号 整 数 的 二 进 制 补 码 。<br />

另 请 参 阅 第 4-83 页 的 并 行 加 法 和 减 法 中 的 类 似 的 并 行 指 令 , 这 些 指 令 只 在 v6 及<br />

更 高 版 本 体 系 结 构 中 有 效 。<br />

4-78 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

条 件 标 志<br />

如 果 发 生 饱 和 , 这 些 指 令 设 置 Q 标 志 。 要 读 取 Q 标 志 的 状 态 , 请 使 用 MRS 指 令<br />

( 参 阅 第 4-115 页 的 MRS)。<br />

其 它 标 志 不 受 影 响 。<br />

体 系 结 构<br />

这 些 指 令 在 v6 及 更 高 版 本 体 系 结 构 中 , 以 及 v5 体 系 结 构 的 E 变 体 中 有 效 。<br />

示 例<br />

QADD r0,r1,r9<br />

QDSUBLT r9,r0,r1<br />

不 正 确 的 示 例<br />

QSUBS r3,r4,r2 ; use of S suffix not allowed<br />

QDADD r11,r15,r0 ; use of r15 not allowed<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-79


<strong>ARM</strong> 指 令 参 考<br />

4.5.3 SSAT 和 USAT<br />

对 任 何 位 位 置 的 有 符 号 和 无 符 号 饱 和 , 饱 和 操 作 前 目 标 可 以 进 行 可 选 的 移 位 。<br />

另 请 参 阅 第 4-88 页 的 SSAT16 和 USAT16。<br />

语 法<br />

op{cond} Rd, #sat_imm, Rm{, shift}<br />

其 中 :<br />

op 是 SSAT 或 者 USAT。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 的 寄 存 器 。<br />

sat_imm 指 定 要 饱 和 到 的 位 位 置 , 且 其 值 在 0 到 31 范 围 内 。<br />

Rm 是 存 放 操 作 数 的 <strong>ARM</strong> 寄 存 器 。<br />

shift 是 下 列 值 之 一 :<br />

LSL #n 其 中 n 在 0 到 31 范 围 内<br />

ASR #n 其 中 n 在 1 到 32 范 围 内 。<br />

不 要 将 r15 用 于 Rd 或 Rm。<br />

运 算<br />

SSAT 指 令 应 用 指 定 的 移 位 , 然 后 饱 和 到 有 符 号 的 范 围<br />

– 2 sat_imm –1 ≤ x ≤ 2sat_imm – 1 – 1。<br />

USAT 指 令 应 用 指 定 的 移 位 , 然 后 饱 和 到 无 符 号 的 范 围<br />

0 ≤ x ≤ 2sat_imm – 1。<br />

条 件 标 志<br />

如 果 发 生 饱 和 , 这 些 指 令 设 置 Q 标 志 。 要 读 取 Q 标 志 的 状 态 , 请 使 用 MRS 指 令<br />

( 参 阅 第 4-115 页 的 MRS)。<br />

体 系 结 构<br />

这 些 指 令 在 v6 及 更 高 版 本 的 体 系 结 构 中 有 效 。<br />

4-80 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

示 例<br />

SSAT r7, #16, r7, LSL #4<br />

USATNE r0, #7, r5<br />

不 正 确 的 示 例<br />

USATGT r0, #7, r15, ASR #16<br />

; use of r15 not allowed<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-81


<strong>ARM</strong> 指 令 参 考<br />

4.6 <strong>ARM</strong> 并 行 指 令<br />

本 节 包 含 下 列 各 个 小 节 :<br />

• 第 4-83 页 的 并 行 加 法 和 减 法<br />

各 种 字 节 方 式 和 半 字 方 式 的 加 法 和 减 法 。<br />

• 第 4-86 页 的 USAD8 和 USADA8<br />

差 的 绝 对 值 求 和 , 差 的 绝 对 值 求 和 及 累 加 。<br />

• 第 4-88 页 的 SSAT16 和 USAT16<br />

并 行 半 字 饱 和 指 令 。<br />

还 有 一 些 并 行 分 离 指 令 , 请 参 阅 第 4-91 页 的 SUNPK 和 UUNPK。<br />

4-82 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.6.1 并 行 加 法 和 减 法<br />

各 种 字 节 方 式 和 半 字 方 式 的 加 法 和 减 法 。<br />

语 法<br />

op{cond} Rd, Rn, Rm<br />

其 中 :<br />

是 下 列 值 之 一 :<br />

S 对 2 8 或 2 16 的 有 符 号 算 法 求 模 。 设 置 CPSR GE 标 志 。<br />

Q 有 符 号 饱 和 算 法 。<br />

SH 有 符 号 算 法 , 将 结 果 减 半 。<br />

U 对 2 8 或 2 16 的 无 符 号 算 法 求 模 。 设 置 CPSR GE 标 志 。<br />

UQ 无 符 号 饱 和 算 法 。<br />

UH 无 符 号 算 法 , 将 结 果 减 半 。<br />

op 是 下 列 值 之 一 :<br />

ADD8<br />

字 节 方 式 加 法<br />

ADD16 半 字 方 式 加 法 。<br />

SUB8 字 节 方 式 减 法 。<br />

SUB16 半 字 方 式 减 法 。<br />

ADDSUBX 交 换 Rm 的 半 字 , 然 后 将 高 半 字 相 加 , 将 低 半 字 相 减 。<br />

SUBADDX 交 换 Rm 的 半 字 , 然 后 将 高 半 字 相 减 , 将 低 半 字 相 加 。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd<br />

Rm、 Rn<br />

是 目 标 寄 存 器 。 不 要 将 r15 用 作 Rd。<br />

是 存 放 操 作 数 的 <strong>ARM</strong> 寄 存 器 。 不 要 将 r15 用 于 Rm 或 Rn。<br />

运 算<br />

这 些 指 令 单 独 对 操 作 数 的 字 节 或 半 字 执 行 算 法 。 它 们 执 行 两 个 或 四 个 加 法 或 减<br />

法 , 或 一 个 加 法 和 一 个 减 法 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-83


<strong>ARM</strong> 指 令 参 考<br />

用 户 可 选 择 各 种 算 法 :<br />

• 对 2 8 或 2 16 的 有 符 号 或 无 符 号 算 法 求 模 。 这 样 将 设 置 CPSR GE 标 志 , 请<br />

参 阅 下 面 的 条 件 标 志 一 节 。<br />

• 对 一 个 有 符 号 范 围 执 行 有 符 号 饱 和 算 法 运 算 :– 2 15 ≤ x ≤ 2 15 – 1 或<br />

– 2 7 ≤ x ≤ 2 7 – 1。 即 使 这 些 运 算 饱 和 , Q 标 志 也 不 受 影 响 。<br />

• 对 一 个 有 符 号 范 围 执 行 无 符 号 饱 和 算 法 运 算 :0 ≤ x ≤ 2 16 – 1 或<br />

0 ≤ x ≤ 2 8 – 1。 即 使 这 些 运 算 饱 和 , Q 标 志 也 不 受 影 响 。<br />

• 有 符 号 或 无 符 号 算 法 , 将 结 果 减 半 。 这 种 运 算 不 会 造 成 溢 出 。<br />

条 件 标 志<br />

这 些 指 令 不 影 响 N、 Z、 C 、 V 或 Q 标 志 。<br />

这 些 指 令 的 Q、 SH、 UQ 和 UH 前 缀 变 量 不 影 响 任 何 标 志 。<br />

这 些 指 令 的 S 和 U 前 缀 变 量 如 下 设 置 CPSR 中 的 GE 标 志 。<br />

• 对 于 字 节 方 式 的 运 算 ,GE 标 志 的 使 用 方 式 与 32 位 SUB 和 ADD 指 令 的 C<br />

( 进 位 ) 标 志 相 同 :<br />

GE[0] 用 于 结 果 的 [7:0] 位<br />

GE[1] 用 于 结 果 的 [15:8] 位<br />

GE[2] 用 于 结 果 的 [23:16] 位<br />

GE[3] 用 于 结 果 的 [31:24] 位<br />

• 对 于 半 字 方 式 运 算 , GE 标 志 的 使 用 方 式 与 普 通 的 字 方 式 的 SUB 和 ADD<br />

指 令 的 C ( 进 位 ) 标 志 相 同 :<br />

GE[1:0] 用 于 结 果 的 [15:0] 位<br />

GE[3:2] 用 于 结 果 的 [31:16] 位<br />

可 以 使 用 这 些 标 志 来 控 制 以 下 SEL 指 令 , 请 参 阅 第 4-48 页 的 SEL。<br />

备 注<br />

对 于 半 字 方 式 的 运 算 , 同 时 设 置 或 清 除 GE[1:0], 并 同 时 设 置 或 清 除 GE[3:2]。<br />

体 系 结 构<br />

这 些 指 令 在 v6 及 更 高 版 本 的 体 系 结 构 中 有 效 。<br />

4-84 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

示 例<br />

SHADD8 r4, r3, r9<br />

USUBADDXNE r0, r0, r2<br />

不 正 确 的 示 例<br />

QHADD r2, r9, r3 ; No such instruction, should be QHADD8 or QHADD16<br />

UQSUB16NE r1, r15, r0 ; Use of r15 not allowed<br />

SUBADDX r10, r8, r5 ; Must have a prefix.<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-85


<strong>ARM</strong> 指 令 参 考<br />

4.6.2 USAD8 和 USADA8<br />

差 的 绝 对 值 求 和 , 差 的 绝 对 值 求 和 及 累 加 。<br />

语 法<br />

USAD8{cond} Rd, Rm, Rs<br />

USADA8{cond} Rd, Rm, Rs, Rn<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 标 寄 存 器 。<br />

Rm 是 存 放 第 一 个 操 作 数 的 寄 存 器 。<br />

Rs 是 存 放 第 二 个 操 作 数 的 寄 存 器 。<br />

Rn 是 存 放 累 加 操 作 数 的 寄 存 器 。<br />

不 要 将 r15 用 于 任 何 Rd、 Rm、 Rs 或 Rn 。<br />

运 算<br />

USAD8 指 令 求 得 Rm 和 Rs 的 对 应 字 节 中 的 无 符 号 值 之 间 的 四 个 差 值 。 其 累 加 四 个<br />

差 值 的 绝 对 值 , 并 将 结 果 保 存 到 Rd 中 。<br />

USADA8 指 令 将 四 个 差 值 的 绝 对 值 加 到 Rn 的 值 上 , 并 将 结 果 保 存 到 Rd 中 。<br />

条 件 标 志<br />

这 些 指 令 不 设 置 任 何 标 志 。<br />

体 系 结 构<br />

这 些 指 令 在 v6 及 更 高 版 本 的 体 系 结 构 中 有 效 。<br />

示 例<br />

USAD8<br />

USADA8<br />

USADA8VS<br />

r2, r4, r6<br />

r0, r3, r5, r2<br />

r0, r4, r0, r1<br />

4-86 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

不 正 确 的 示 例<br />

USADA8 r2, r4, r6 ; USADA8 needs four registers<br />

USAD8CC r0, r3, r15 ; use of r15 not allowed<br />

USADA16 r0, r4, r0, r1 ; no such instruction<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-87


<strong>ARM</strong> 指 令 参 考<br />

4.6.3 SSAT16 和 USAT16<br />

并 行 半 字 饱 和 指 令 。<br />

语 法<br />

op{cond} Rd, #sat_imm, Rm<br />

其 中 :<br />

op 是 下 列 指 令 之 一 :<br />

SSAT16 有 符 号 饱 和 。<br />

USAT16 无 符 号 饱 和 。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 的 寄 存 器 。<br />

sat_imm<br />

指 定 要 饱 和 的 位 位 置 , 对 于 SSAT16 其 值 在 1 到 16 范 围 内 ; 对 于<br />

USAT16, 其 值 在 0 到 15 范 围 内 。<br />

Rm 是 存 放 操 作 数 的 寄 存 器 。<br />

不 要 将 r15 用 于 Rd 或 Rm。<br />

运 算<br />

对 任 何 位 位 置 进 行 半 字 方 式 的 有 符 号 和 无 符 号 饱 和 。<br />

SSAT16 指 令 将 每 个 半 字 饱 和 到 有 符 号 范 围<br />

– 2 sat_imm –1 ≤ x ≤ 2 sat_imm – 1 – 1。<br />

USAT16 指 令 将 每 个 半 字 饱 和 到 无 符 号 范 围<br />

0 ≤ x ≤ 2 sat_imm – 1。<br />

条 件 标 志<br />

如 果 饱 和 发 生 在 任 何 一 个 半 字 上 , 那 么 这 些 指 令 设 置 Q 标 志 。 要 读 取 Q 标 志 的<br />

状 态 , 请 使 用 MRS 指 令 ( 参 阅 第 4-115 页 的 MRS)。<br />

体 系 结 构<br />

这 些 指 令 在 v6 及 更 高 版 本 的 体 系 结 构 中 有 效 。<br />

4-88 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

示 例<br />

SSAT16 r7, #12, r7<br />

USAT16 r0, #7, r5<br />

不 正 确 的 示 例<br />

SSAT16 r1, #16, r2, LSL #4 ; shifts not allowed with halfword saturations<br />

USAT16 r0, #11, r15 ; use of r15 not allowed<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-89


<strong>ARM</strong> 指 令 参 考<br />

4.7 <strong>ARM</strong> 组 合 和 分 离 指 令<br />

本 节 包 含 下 列 各 个 小 节 :<br />

• 第 4-91 页 的 SUNPK 和 UUNPK<br />

有 符 号 或 无 符 号 分 离 指 令 。<br />

• 第 4-93 页 的 SADD_TO_ 和 UADD_TO_<br />

符 号 扩 展 或 零 扩 展 并 相 加 。<br />

• 第 4-95 页 的 PKHBT 和 PKHTB<br />

半 字 组 合 指 令 。<br />

4-90 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.7.1 SUNPK 和 UUNPK<br />

有 符 号 和 无 符 号 数 据 分 离 指 令 。<br />

这 些 指 令 执 行 下 面 任 一 种 操 作 :<br />

• 将 一 个 8 位 值 用 符 号 或 零 扩 展 到 32 位 ;<br />

• 将 一 个 16 位 值 用 符 号 或 零 扩 展 到 32 位 ;<br />

• 将 两 个 8 位 值 用 符 号 或 零 扩 展 到 两 个 16 位 值 。<br />

这 些 指 令 的 子 集 有 一 些 同 义 词 , 它 们 与 等 价 的 Thumb 指 令 相 匹 配 。 详 细 信 息 请<br />

参 阅 第 4-128 页 的 SEXT 和 UEXT <strong>ARM</strong> 伪 指 令 。<br />

语 法<br />

op{cond} Rd, Rm{, rotation}<br />

其 中 :<br />

op 是 下 列 指 令 之 一 :<br />

SUNPK 符 号 扩 展 。<br />

UUNPK 零 扩 展 。<br />

是 下 列 值 之 一 :<br />

8TO16 将 两 个 8 位 值 扩 展 到 两 个 16 位 值 。<br />

8TO32 将 一 个 8 位 值 扩 展 到 一 个 32 位 值 。<br />

16TO32 将 一 个 16 位 值 扩 展 到 一 个 32 位 值 。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 的 寄 存 器 。 不 能 是 r15。<br />

Rm 是 存 放 操 作 数 的 寄 存 器 。 不 能 是 r15。<br />

rotation 是 下 列 值 之 一 :<br />

ROR #8 将 Rm 的 值 循 环 右 移 8 位 。<br />

ROR #16 将 Rm 的 值 循 环 右 移 16 位 。<br />

ROR #24 将 Rm 的 值 循 环 右 移 24 位 。<br />

如 果 省 略 rotation, 则 不 执 行 循 环 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-91


<strong>ARM</strong> 指 令 参 考<br />

运 算<br />

这 些 指 令 执 行 以 下 操 作 :<br />

1. 将 Rm 中 的 值 循 环 右 移 0、 8、 16 或 24 位 。<br />

2. 对 所 得 到 的 值 执 行 下 列 操 作 :<br />

• 提 取 [7:0] 位 , 并 用 符 号 或 零 扩 展 以 生 成 结 果 的 [31:0] 位<br />

• 提 取 [15:0] 位 , 并 用 符 号 或 零 扩 展 以 生 成 结 果 的 [31:0] 位 。<br />

• 提 取 [23:16] 位 和 [7:0] 位 , 并 用 符 号 或 零 扩 展 它 们 , 以 分 别 生 成 结 果 的<br />

[31:16] 位 和 [15:0] 位 。<br />

条 件 标 志<br />

这 些 指 令 不 影 响 任 何 标 志 。<br />

体 系 结 构<br />

这 些 指 令 在 v6 及 更 高 版 本 的 体 系 结 构 中 有 效 。<br />

示 例<br />

SUNPK16TO32 r3, r9<br />

UUNPK8TO16EQ r0, r0, ROR #24<br />

不 正 确 的 示 例<br />

UUNPK8TO32 r0, r15 ; use of r15 not allowed<br />

SUNPK16TO32 r9, r3, ROR #12 ; rotation must be by 0, 8, 16, or 24.<br />

4-92 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.7.2 SADD_TO_ 和 UADD_TO_<br />

符 号 扩 展 或 零 扩 展 并 相 加 。<br />

这 些 指 令 执 行 下 面 任 一 种 操 作 :<br />

• 将 一 个 8 位 值 符 号 扩 展 或 零 扩 展 到 32 位 , 并 加 上 一 个 32 位 值 ;<br />

• 将 一 个 16 位 值 符 号 扩 展 或 零 扩 展 到 32 位 , 并 加 上 一 个 32 位 值 ;<br />

• 将 两 个 8 位 值 符 号 扩 展 或 零 扩 展 到 两 个 16 位 值 , 并 将 两 个 16 位 值 相 加 。<br />

语 法<br />

op{cond} Rd, Rn, Rm{, rotation}<br />

其 中 :<br />

op 是 下 列 指 令 之 一 :<br />

SADD 符 号 扩 展 并 相 加 。<br />

UADD 零 扩 展 并 相 加 。<br />

是 下 列 值 之 一 :<br />

8TO16 将 两 个 8 位 值 扩 展 到 两 个 16 位 值 。<br />

8TO32 将 一 个 8 位 值 扩 展 到 一 个 32 位 值 。<br />

16TO32 将 一 个 16 位 值 扩 展 到 一 个 32 位 值 。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 的 寄 存 器 。 不 能 是 r15。<br />

Rn 是 存 放 第 一 个 操 作 数 的 寄 存 器 。 不 能 是 r15。<br />

Rm 是 存 放 第 二 个 操 作 数 的 寄 存 器 。 不 能 是 r15。<br />

rotation 是 下 列 值 之 一 :<br />

ROR #8 将 Rm 的 值 循 环 右 移 8 位 。<br />

ROR #16 将 Rm 的 值 循 环 右 移 16 位 。<br />

ROR #24 将 Rm 的 值 循 环 右 移 24 位 。<br />

如 果 省 略 rotation, 则 不 执 行 循 环 移 位 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-93


<strong>ARM</strong> 指 令 参 考<br />

运 算<br />

这 些 指 令 执 行 以 下 操 作 :<br />

1. 将 Rm 中 的 值 循 环 右 移 0、 8、 16 或 24 位 。<br />

2. 对 所 得 到 的 值 执 行 下 列 操 作 :<br />

• 提 取 [7:0] 位 , 并 用 符 号 或 零 扩 展 到 32 位 , 并 加 上 Rn 中 的 值 。<br />

• 提 取 [15:0] 位 , 并 用 符 号 或 零 扩 展 到 32 位 , 并 加 上 Rn 中 的 值 。<br />

• 提 取 [23:16] 和 [7:0] 位 , 并 将 其 符 号 或 零 扩 展 到 16 位 , 然 后 分 别 将<br />

其 加 到 Rn 的 [31:16] 位 和 [15:0] 位 上 , 以 形 成 结 果 的 [31:16] 位 和<br />

[15:0] 位 。<br />

条 件 标 志<br />

这 些 指 令 不 影 响 任 何 标 志 。<br />

体 系 结 构<br />

这 些 指 令 在 v6 及 更 高 版 本 的 体 系 结 构 中 有 效 。<br />

示 例<br />

SADD16TO32 r3, r9, r4<br />

UADD8TO16EQ r0, r0, r4, ROR #16<br />

不 正 确 的 示 例<br />

UADD8TO32 r0, r2, r15 ; use of r15 not allowed<br />

SADD16TO32 r9, r3, r2, ROR #12 ; rotation must be by 0, 8, 16, or 24.<br />

4-94 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.7.3 PKHBT 和 PKHTB<br />

半 字 组 合 指 令 。<br />

组 合 一 个 寄 存 器 的 半 字 和 另 一 个 寄 存 器 的 半 字 。 其 中 一 个 操 作 数 可 以 在 提 取 半<br />

字 之 前 移 位 。<br />

语 法<br />

op{cond} Rd, Rn, Rm{, shift}<br />

其 中 :<br />

op 是 下 列 值 之 一 :<br />

PKHBT 将 Rn 的 [15:0] 位 和 Rm 的 移 位 值 的 [31:16] 位 进 行 组 合 。<br />

PKHTB 将 Rn 的 [31:16] 位 和 Rm 的 移 位 值 的 [15:0] 位 进 行 组 合 。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 的 寄 存 器 。<br />

Rn 是 存 放 第 一 个 操 作 数 的 寄 存 器 。<br />

Rm 是 存 放 第 二 个 操 作 数 的 寄 存 器 。<br />

shift 是 下 列 值 之 一 :<br />

LSL #n 其 中 n 在 0 到 31 范 围 内 。 只 可 用 于 PKHBT。<br />

ASR #n 其 中 n 在 1 到 32 范 围 内 。 只 可 用 于 PKHTB。<br />

不 要 将 r15 用 于 Rd、 Rm 或 Rn。<br />

条 件 标 志<br />

这 些 指 令 不 影 响 任 何 标 志 。<br />

体 系 结 构<br />

这 些 指 令 在 v6 及 更 高 版 本 的 体 系 结 构 中 有 效 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-95


<strong>ARM</strong> 指 令 参 考<br />

示 例<br />

PKHBT r0, r3, r5 ; combine the bottom halfword of r3 with the top halfword of r5<br />

PKHBT r0, r3, r5, LSL #16 ; combine the bottom halfword of r3 with the bottom halfword of r5<br />

PKHTB r0, r3, r5, ASR #16 ; combine the top halfword of r3 with the top halfword of r5<br />

也 可 以 通 过 使 用 不 同 的 移 位 值 来 缩 放 第 二 个 操 作 数 。<br />

不 正 确 的 示 例<br />

PKHBT r4, r15, r1 ;use of r15 not allowed<br />

PKHBTEQ r4, r5, r1, ASR #8 ; ASR not allowed with PKHBT<br />

4-96 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.8 <strong>ARM</strong> 跳 转 指 令<br />

本 节 包 含 下 列 各 个 小 节 :<br />

• 第 4-98 页 的 B 和 BL<br />

跳 转 以 及 带 链 接 的 跳 转 。<br />

• 第 4-99 页 的 BX<br />

跳 转 和 交 换 指 令 集 。<br />

• 第 4-100 页 的 BLX<br />

带 链 接 的 跳 转 和 交 换 指 令 集 。<br />

• 第 4-102 页 的 BXJ<br />

跳 转 并 将 指 令 集 转 换 到 Java。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-97


<strong>ARM</strong> 指 令 参 考<br />

4.8.1 B 和 BL<br />

跳 转 和 带 链 接 的 跳 转 。<br />

语 法<br />

B{cond} label<br />

BL{cond} label<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

label<br />

用 法<br />

是 一 个 相 对 程 序 的 表 达 式 。 有 关 详 细 信 息 请 参 阅 第 3-23 页 的 与 寄 存<br />

器 相 关 和 与 程 序 相 关 的 表 达 式 。<br />

B 指 令 导 致 转 到 label 的 跳 转 。<br />

BL 指 令 将 下 一 个 指 令 的 地 址 复 制 到 r14(lr, 链 接 寄 存 器 ) 中 , 并 导 致 转 到 label<br />

的 一 个 跳 转 。<br />

机 器 级 B 和 BL 指 令 可 使 用 从 当 前 指 令 地 址 算 起 的 ±32Mb 内 的 范 围 。 但 是 , 即 使<br />

label 超 出 范 围 , 仍 可 以 使 用 这 些 指 令 。 通 常 用 户 并 不 知 道 链 接 程 序 将 label 放 在<br />

何 处 。 必 要 时 ,<strong>ARM</strong> 链 接 程 序 添 加 代 码 以 允 许 更 长 的 跳 转 ( 请 参 阅 <strong>RealView</strong> 编<br />

译 工 具 2.0 版 链 接 程 序 和 实 用 程 序 指 南 中 的 <strong>ARM</strong> 链 接 程 序 一 章 )。 所 添 加 的 代<br />

码 称 为 胶 合 代 码 。<br />

体 系 结 构<br />

这 些 指 令 可 用 在 所 有 版 本 的 <strong>ARM</strong> 体 系 结 构 中 。<br />

示 例<br />

B<br />

BLE<br />

BL<br />

BLLT<br />

loopA<br />

ng+8<br />

subC<br />

rtX<br />

4-98 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.8.2 BX<br />

跳 转 和 选 择 性 地 交 换 指 令 集 。<br />

语 法<br />

BX{cond} Rm<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rm 是 一 个 <strong>ARM</strong> 寄 存 器 , 包 含 要 跳 转 到 的 目 标 地 址 。<br />

Rm 的 第 0 位 不 用 作 地 址 的 一 部 分 。<br />

如 果 设 置 了 Rm 的 0 位 , 指 令 在 CPSR 中 设 置 T 标 志 , 并 且 将 目 标<br />

地 址 处 的 代 码 解 释 为 Thumb 代 码 。<br />

如 果 Rm 的 位 0 是 清 除 的 , 则 不 能 设 置 位 1。<br />

用 法<br />

BX 指 令 产 生 对 Rm 中 存 储 地 址 的 一 个 跳 转 , 并 且 如 果 设 置 了 Rm 的 0 位 , 则 将 指 令<br />

集 改 变 为 Thumb 状 态 。<br />

体 系 结 构<br />

此 指 令 在 <strong>ARM</strong> 体 系 结 构 的 所 有 T 变 体 中 , 以 及 v5 及 更 高 版 本 体 系 结 构 中 有 效 。<br />

示 例<br />

BX<br />

BXVS<br />

r7<br />

r0<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-99


<strong>ARM</strong> 指 令 参 考<br />

4.8.3 BLX<br />

带 链 接 的 跳 转 和 可 选 交 换 指 令 集 。 此 指 令 具 有 下 列 备 选 形 式 :<br />

• 一 个 无 条 件 跳 转 , 含 有 对 一 个 相 对 程 序 的 地 址 的 链 接 ;<br />

• 一 个 条 件 跳 转 , 含 有 对 一 个 寄 存 器 中 存 储 的 绝 对 地 址 的 链 接 。<br />

语 法<br />

BLX{cond} Rm<br />

BLX label<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rm 是 一 个 <strong>ARM</strong> 寄 存 器 , 包 含 要 跳 转 到 的 目 标 地 址 。<br />

Rm 的 第 0 位 不 用 作 地 址 的 一 部 分 。<br />

如 果 设 置 了 Rm 的 0 位 , 指 令 在 CPSR 中 设 置 T 标 志 , 并 且 将 目 标<br />

地 址 处 的 代 码 解 释 为 Thumb 代 码 。<br />

如 果 Rm 的 位 0 是 清 除 的 , 则 不 能 设 置 位 1。<br />

label<br />

是 一 个 相 对 程 序 的 表 达 式 。 有 关 详 细 信 息 请 参 阅 第 3-23 页 的 与 寄 存<br />

器 相 关 和 与 程 序 相 关 的 表 达 式 。<br />

备 注<br />

BLX label 不 能 是 有 条 件 的 。 BLX label 总 是 引 起 向 Thumb 状 态 的 转 变 。<br />

用 法<br />

BLX 指 令 :<br />

• 将 下 一 个 指 令 的 地 址 复 制 到 r14 (lr, 链 接 寄 存 器 ) 中<br />

• 产 生 转 到 label 或 Rm 中 存 放 的 地 址 的 一 个 跳 转<br />

• 如 果 符 合 下 列 条 件 之 一 , 则 将 指 令 集 改 变 为 Thumb 状 态 :<br />

— 如 果 设 置 了 Rm 的 第 0 位<br />

— 使 用 了 BLX label 形 式 的 指 令 。<br />

机 器 级 BLX label 指 令 不 能 跳 转 到 当 前 指 令 的 ±32Mb 范 围 外 的 地 址 。 必 要 时 ,<br />

<strong>ARM</strong> 链 接 程 序 添 加 代 码 以 允 许 更 长 的 跳 转 ( 请 参 阅 <strong>RealView</strong> 编 译 工 具 2.0 版<br />

链 接 程 序 和 实 用 程 序 指 南 中 的 <strong>ARM</strong> 链 接 程 序 一 章 )。 所 添 加 的 代 码 称 为 胶 合<br />

代 码 。<br />

4-100 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

体 系 结 构<br />

此 指 令 在 v5 及 更 高 版 本 体 系 结 构 的 所 有 T 变 体 中 有 效 。<br />

示 例<br />

BLX<br />

BLXNE<br />

BLX<br />

r2<br />

r0<br />

thumbsub<br />

不 正 确 的 示 例<br />

BLXMI thumbsub ; BLX label cannot be conditional<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-101


<strong>ARM</strong> 指 令 参 考<br />

4.8.4 BXJ<br />

将 指 令 集 转 变 到 Java, 或 者 如 果 Java 状 态 不 可 用 , 则 工 作 在 与 等 价 的 BX 指 令 相<br />

同 的 方 式 下 。<br />

语 法<br />

BXJ{cond} Rm<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rm<br />

是 一 个 <strong>ARM</strong> 寄 存 器 , 如 果 Java 状 态 不 可 用 , 则 包 含 要 跳 转 到 的 地<br />

址 。 不 要 将 r15 用 作 Rm。<br />

如 果 Java 状 态 不 可 用 :<br />

• Rm 的 第 0 位 不 用 作 地 址 的 一 部 分 。<br />

• 如 果 设 置 了 Rm 的 0 位 , 此 本 指 令 在 CPSR 中 设 置 T 标 志 , 并<br />

且 将 目 标 地 址 处 的 代 码 解 释 为 Thumb 代 码 。<br />

• 如 果 Rm 的 位 0 是 清 除 的 , 则 不 能 设 置 位 1。<br />

用 法<br />

如 果 有 可 能 , BXJ 指 令 引 起 向 Java 状 态 的 转 变 。 否 则 , 它 产 生 对 Rm 中 存 储 的 地<br />

址 的 一 个 跳 转 , 并 且 如 果 设 置 了 Rm 的 0 位 , 则 改 变 为 Thumb 指 令 集 。<br />

体 系 结 构<br />

此 指 令 在 <strong>ARM</strong> 体 系 结 构 的 所 有 J 变 体 中 , 以 及 v6 及 更 高 版 本 体 系 结 构 中 有 效 。<br />

示 例<br />

BXJ<br />

BXJGE<br />

r7<br />

r0<br />

4-102 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.9 协 处 理 器 指 令<br />

本 节 不 介 绍 向 量 浮 点 指 令 ( 参 阅 第 6 章 向 量 浮 点 编 程 )。<br />

其 中 包 含 下 列 各 部 分 :<br />

• 第 4-104 页 的 CDP、 CDP2<br />

协 处 理 器 数 据 操 作<br />

• 第 4-105 页 的 MCR、 MCR2、 MCRR 和 MCRR2<br />

从 <strong>ARM</strong> 寄 存 器 移 动 到 协 处 理 器 , 可 能 带 有 协 处 理 器 操 作<br />

• 第 4-107 页 的 MRC、 MRC2<br />

从 协 处 理 器 移 动 到 <strong>ARM</strong> 寄 存 器 , 可 能 带 有 协 处 理 器 操 作<br />

• 第 4-108 页 的 MRRC 和 MRRC2<br />

从 协 处 理 器 移 动 到 两 个 <strong>ARM</strong> 寄 存 器 , 可 能 带 有 协 处 理 器 操 作<br />

• 第 4-109 页 的 LDC、 STC<br />

在 存 储 器 和 协 处 理 器 之 间 传 送 数 据 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-103


<strong>ARM</strong> 指 令 参 考<br />

4.9.1 CDP、 CDP2<br />

协 处 理 器 数 据 操 作 。<br />

语 法<br />

CDP{cond} coproc, opcode1, CRd, CRn, CRm{, opcode2}<br />

CDP2 coproc, opcode1, CRd, CRn, CRm{, opcode2}<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

coproc<br />

是 指 令 要 使 用 的 协 处 理 器 的 名 称 。 标 准 名 称 是 pn, 其 中 n 是<br />

一 个 0-15 范 围 内 的 整 数 。<br />

opcode1 是 一 个 与 协 处 理 器 相 关 的 操 作 码 。<br />

CRd、 CRn、 CRm 是 协 处 理 器 寄 存 器 。<br />

opcode2 是 一 个 与 协 处 理 器 相 关 的 可 选 操 作 码 。<br />

用 法<br />

这 些 指 令 的 用 法 依 赖 于 协 处 理 器 。 详 细 信 息 请 参 阅 协 处 理 器 文 档 。<br />

备 注<br />

CDP2 总 是 无 条 件 的 。<br />

体 系 结 构<br />

CDP 在 版 本 2 及 更 高 版 本 体 系 结 构 中 有 效 。<br />

CDP2 在 版 本 5 及 更 高 版 本 体 系 结 构 中 有 效 。<br />

4-104 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.9.2 MCR、 MCR2、 MCRR 和 MCRR2<br />

从 <strong>ARM</strong> 寄 存 器 移 动 到 协 处 理 器 。 根 据 协 处 理 器 的 不 同 , 也 许 能 指 定 附 加 的 各 种<br />

操 作 。<br />

语 法<br />

MCR{cond} coproc, opcode1, Rd, CRn, CRm{, opcode2}<br />

MCR2 coproc, opcode1, Rd, CRn, CRm{, opcode2}<br />

MCRR{cond} coproc, opcode1, Rd, Rn, CRm<br />

MCRR2 coproc, opcode1, Rd, Rn, CRm<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

coproc<br />

是 指 令 要 使 用 的 协 处 理 器 的 名 称 。 标 准 名 称 是 pn, 其 中 n 是 一 个<br />

0-15 范 围 内 的 整 数 。<br />

opcode1 是 一 个 与 协 处 理 器 相 关 的 操 作 码 。<br />

Rd、 Rn<br />

是 <strong>ARM</strong> 源 寄 存 器 。 不 要 将 r15 用 于 Rd 或 Rn。<br />

CRn、 CRm 是 协 处 理 器 寄 存 器 。<br />

opcode2 是 一 个 与 协 处 理 器 相 关 的 可 选 操 作 码 。<br />

用 法<br />

这 些 指 令 的 用 法 依 赖 于 协 处 理 器 。 详 细 信 息 请 参 阅 协 处 理 器 文 档 。<br />

备 注<br />

MCR2 和 MCRR2 总 是 无 条 件 的 。<br />

体 系 结 构<br />

MCR 在 版 本 2 及 更 高 版 本 体 系 结 构 中 有 效 。<br />

MCR2 在 版 本 5 及 更 高 版 本 体 系 结 构 中 有 效 。<br />

MCRR 指 令 在 v6 及 更 高 版 本 体 系 结 构 中 , 以 及 除 xP 变 体 外 的 v5 体 系 结 构 的 E 变<br />

体 中 有 效 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-105


<strong>ARM</strong> 指 令 参 考<br />

MCRR2 在 v6 及 更 高 版 本 体 系 结 构 中 有 效 。<br />

4-106 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.9.3 MRC、 MRC2<br />

从 <strong>ARM</strong> 寄 存 器 移 动 到 协 处 理 器 。 根 据 协 处 理 器 的 不 同 , 也 许 能 指 定 附 加 的 各 种<br />

操 作 。<br />

语 法<br />

MRC{cond} coproc, opcode1, Rd, CRn, CRm{, opcode2}<br />

MRC2 coproc, opcode1, Rd, CRn, CRm{, opcode2}<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

coproc<br />

是 指 令 要 使 用 的 协 处 理 器 的 名 称 。 标 准 名 称 是 pn, 其 中 n 是 一 个<br />

0-15 范 围 内 的 整 数 。<br />

opcode1 是 一 个 与 协 处 理 器 相 关 的 操 作 码 。<br />

Rd 是 <strong>ARM</strong> 目 的 寄 存 器 。 如 果 Rd 是 r15, 则 只 影 响 标 志 字 段 。<br />

CRn、 CRm 是 协 处 理 器 寄 存 器 。<br />

opcode2 是 一 个 与 协 处 理 器 相 关 的 可 选 操 作 码 。<br />

用 法<br />

这 些 指 令 的 用 法 依 赖 于 协 处 理 器 。 详 细 信 息 请 参 阅 协 处 理 器 文 档 。<br />

备 注<br />

MRC2 总 是 无 条 件 的 。<br />

体 系 结 构<br />

MRC 在 版 本 2 及 更 高 版 本 体 系 结 构 中 有 效 。<br />

MRC2 在 版 本 5 及 更 高 版 本 体 系 结 构 中 有 效 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-107


<strong>ARM</strong> 指 令 参 考<br />

4.9.4 MRRC 和 MRRC2<br />

从 协 处 理 器 移 动 到 两 个 <strong>ARM</strong> 寄 存 器 。 根 据 协 处 理 器 的 不 同 , 也 许 能 指 定 附 加 的<br />

各 种 操 作 。<br />

语 法<br />

MRRC{cond} coproc, opcode, Rd, Rn, CRm<br />

MRRC2 coproc, opcode, Rd, Rn, CRm<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

coproc<br />

是 指 令 要 使 用 的 协 处 理 器 的 名 称 。 标 准 名 称 是 pn, 其 中 n 是 一 个<br />

0-15 范 围 内 的 整 数 。<br />

opcode 是 一 个 与 协 处 理 器 相 关 的 操 作 码 。<br />

Rd、 Rn<br />

是 <strong>ARM</strong> 目 的 寄 存 器 。 不 要 将 r15 用 于 Rd 或 Rn。<br />

CRm 是 协 处 理 器 源 寄 存 器 。<br />

用 法<br />

这 些 指 令 的 用 法 依 赖 于 协 处 理 器 。 详 细 信 息 请 参 阅 协 处 理 器 文 档 。<br />

备 注<br />

MRRC2 总 是 无 条 件 的 。<br />

体 系 结 构<br />

MRRC 指 令 可 用 在 v6 及 以 上 体 系 结 构 中 , 以 及 除 xP 变 体 外 的 v5 体 系 结 构 的 E 变<br />

体 中 。<br />

MRRC2 在 v6 及 更 高 版 本 体 系 结 构 中 有 效 。<br />

4-108 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.9.5 LDC、 STC<br />

在 存 储 器 和 协 处 理 器 之 间 传 送 数 据 。<br />

语 法<br />

这 些 指 令 有 三 种 可 能 的 形 式 :<br />

• 零 偏 移<br />

• 前 索 引 偏 移<br />

• 后 索 引 偏 移<br />

三 种 形 式 的 语 法 ( 按 相 同 的 顺 序 ) 是 :<br />

op{cond}{L} coproc, CRd, [Rn]<br />

op{cond}{L} coproc, CRd, [Rn, #{-}offset]{!}<br />

op{cond}{L} coproc, CRd, [Rn], #{-}offset<br />

其 中 :<br />

op<br />

是 LDC 或 STC。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

L 是 一 个 可 选 的 后 缀 , 指 定 一 个 长 整 数 传 送 。<br />

coproc<br />

是 指 令 要 使 用 的 协 处 理 器 的 名 称 。 标 准 名 称 是 pn, 其 中 n 是 一 个<br />

0-15 范 围 内 的 整 数 。<br />

CRd 是 要 装 载 或 存 储 的 协 处 理 器 寄 存 器 。<br />

Rn<br />

是 存 储 器 地 址 所 基 于 的 寄 存 器 。 如 果 指 定 了 r15, 则 使 用 的 值 是 当<br />

前 指 令 地 址 加 8。<br />

- 是 一 个 可 选 的 减 号 。 如 果 存 在 -, 则 从 Rn 中 减 去 偏 移 量 。 否 则 将 偏<br />

移 量 加 到 Rn 中 。<br />

offset 是 一 个 表 达 式 , 其 取 值 为 0-1020 范 围 内 的 4 的 一 个 倍 数 。<br />

! 是 一 个 可 选 的 后 缀 。 如 果 存 在 !, 则 包 含 偏 移 量 的 地 址 被 写 回 到 Rn<br />

中 。<br />

用 法<br />

此 指 令 的 用 法 依 赖 于 协 处 理 器 。 详 细 信 息 请 参 阅 协 处 理 器 文 档 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-109


<strong>ARM</strong> 指 令 参 考<br />

体 系 结 构<br />

LDC 和 STC 在 版 本 2 及 更 高 版 本 体 系 结 构 中 有 效 。<br />

4-110 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.9.6 LDC2、 STC2<br />

在 存 储 器 和 协 处 理 器 之 间 传 送 数 据 , 备 选 指 令 。<br />

语 法<br />

这 些 指 令 有 三 种 可 能 的 形 式 :<br />

• 零 偏 移 ;<br />

• 前 索 引 偏 移 ;<br />

• 后 索 引 偏 移 。<br />

三 种 形 式 的 语 法 ( 按 相 同 的 顺 序 ) 是 :<br />

op coproc, CRd, [Rn]<br />

op coproc, CRd, [Rn, #{-}offset]{!}<br />

op coproc, CRd, [Rn], #{-}offset<br />

其 中 :<br />

op<br />

coproc<br />

是 LDC2 或 STC2。<br />

是 指 令 要 使 用 的 协 处 理 器 的 名 称 。 标 准 名 称 是 pn, 其 中 n 是 一 个<br />

0-15 范 围 内 的 整 数 。<br />

CRd 是 要 装 载 或 存 储 的 协 处 理 器 寄 存 器 。<br />

Rn<br />

是 存 储 器 地 址 所 基 于 的 寄 存 器 。 如 果 指 定 了 r15, 则 使 用 的 值 是 当<br />

前 指 令 地 址 加 8。<br />

- 是 一 个 可 选 的 减 号 。 如 果 存 在 -, 则 从 Rn 中 减 去 偏 移 量 。 否 则 将 偏<br />

移 量 加 到 Rn 中 。<br />

offset 是 一 个 表 达 式 , 其 取 值 为 0-1020 范 围 内 的 4 的 倍 数 。<br />

! 是 一 个 可 选 的 后 缀 。 如 果 存 在 !, 则 包 含 偏 移 量 的 地 址 被 写 回 到 Rn<br />

中 。<br />

用 法<br />

此 指 令 的 用 法 依 赖 于 协 处 理 器 。 详 细 信 息 请 参 阅 协 处 理 器 文 档 。<br />

备 注<br />

LDC2 和 STC2 总 是 无 条 件 的 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-111


<strong>ARM</strong> 指 令 参 考<br />

体 系 结 构<br />

LDC2 和 STC2 可 用 在 版 本 5 及 更 高 版 本 体 系 结 构 中 。<br />

4-112 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.10 其 它 <strong>ARM</strong> 指 令<br />

本 节 包 含 下 列 各 个 小 节 :<br />

• 第 4-114 页 的 SWI<br />

软 件 中 断 。<br />

• 第 4-115 页 的 MRS<br />

将 CPSR 或 SPSR 的 内 容 移 到 一 个 通 用 寄 存 器 中 。<br />

• 第 4-116 页 的 MSR<br />

装 载 具 有 立 即 数 的 CPSR 或 SPSR 的 指 定 字 段 , 或 者 装 载 一 个 通 用 寄 存 器<br />

的 内 容 。<br />

• 第 4-117 页 的 CPS<br />

改 变 处 理 器 状 态 。<br />

• 第 4-119 页 的 SETEND<br />

设 置 CPSR 中 的 端 序 位 。<br />

• 第 4-120 页 的 BKPT<br />

断 点 。<br />

• 第 4-121 页 的 MAR、 MRA<br />

XScale 协 处 理 器 0 指 令 。<br />

在 两 个 通 用 寄 存 器 和 一 个 40 位 内 部 累 加 器 之 间 传 送 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-113


<strong>ARM</strong> 指 令 参 考<br />

4.10.1 SWI<br />

软 件 中 断 。<br />

语 法<br />

SWI{cond} immed_24<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

immed_24 是 一 个 表 达 式 , 其 取 值 为 0-2 24 –1 范 围 内 的 整 数 ( 24 位 整 数 )。<br />

用 法<br />

SWI 指 令 引 起 SWI 异 常 。 这 意 味 着 处 理 器 改 变 为 [Supervisor] 模 式 ,CPSR 保 存 到<br />

[Supervisor] 模 式 SPSR, 并 且 代 码 的 执 行 跳 转 到 SWI 向 量 ( 参 阅 <strong>RealView</strong> 编 译<br />

工 具 2.0 版 开 发 者 指 南 中 的 处 理 处 理 器 异 常 一 章 )。<br />

条 件 标 志<br />

此 指 令 不 影 响 标 志 。<br />

体 系 结 构<br />

此 指 令 可 用 在 所 有 版 本 的 <strong>ARM</strong> 体 系 结 构 中 。<br />

示 例<br />

SWI 0x123456<br />

4-114 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.10.2 MRS<br />

将 CPSR 或 SPSR 的 内 容 移 到 一 个 通 用 寄 存 器 中 。<br />

语 法<br />

MRS{cond} Rd, psr<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 的 寄 存 器 。 Rd 不 能 是 r15。<br />

psr 是 CPSR 或 SPSR。<br />

用 法<br />

用 MRS 与 MSR 相 结 合 , 作 为 更 新 PSR 的 读 - 改 - 写 序 列 的 一 部 分 , 例 如 用 于 改 变 处 理 器 模 式 或<br />

清 除 Q 标 志 。<br />

注 意<br />

当 处 理 器 处 于 [User] 或 [System] 模 式 时 , 不 得 试 图 访 问 SPSR。 这 是 用 户 的<br />

责 任 。 汇 编 程 序 无 法 就 此 发 出 警 告 , 因 为 其 不 知 道 代 码 将 在 哪 个 处 理 器 模 式 下<br />

执 行 。<br />

条 件 标 志<br />

此 指 令 不 影 响 标 志 。<br />

体 系 结 构<br />

MRS 可 用 在 版 本 3 及 更 高 版 本 体 系 结 构 中 。<br />

示 例<br />

MRS r3, SPSR<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-115


<strong>ARM</strong> 指 令 参 考<br />

4.10.3 MSR<br />

装 载 具 有 立 即 数 的 CPSR 或 SPSR 的 指 定 字 段 , 或 者 装 载 一 个 通 用 寄 存 器 的 内<br />

容 。<br />

语 法<br />

MSR{cond} _, #immed_8r<br />

MSR{cond} _, Rm<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

<br />

是 CPSR 或 SPSR。<br />

指 定 要 移 动 的 位 段 。 可 以 是 下 面 一 个 或 多 个 值 :<br />

c 控 制 位 段 掩 码 字 节 , PSR[7:0]<br />

x 扩 展 位 段 掩 码 字 节 , PSR[15:8]<br />

s 状 态 位 段 掩 码 字 节 , PSR[23:16]<br />

f 标 志 位 段 掩 码 字 节 , PSR[31:24]。<br />

immed_8r<br />

是 取 值 为 数 值 常 数 的 一 个 表 达 式 。 该 常 数 必 须 对 应 于 一 个 8 位 结<br />

构 , 在 一 个 32 位 字 内 循 环 移 位 偶 数 位 而 得 到 。<br />

Rm 是 源 寄 存 器 。<br />

用 法<br />

参 阅 第 4-115 页 的 MRS。<br />

条 件 标 志<br />

如 果 指 定 了 f 位 段 , 此 指 令 明 确 更 新 标 志 。<br />

体 系 结 构<br />

MSR 可 用 在 版 本 3 及 更 高 版 本 体 系 结 构 中 。<br />

示 例<br />

MSR CPSR_f, r5<br />

4-116 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.10.4 CPS<br />

改 变 处 理 器 状 态 。<br />

备 注<br />

CPS 在 [User] 模 式 下 没 有 效 果 。<br />

CPS 不 能 是 有 条 件 的 。<br />

语 法<br />

CPSeffect iflags{, #mode}<br />

CPS #mode<br />

其 中 :<br />

effect 是 以 下 指 令 之 一 :<br />

IE 启 用 中 断 。<br />

ID 禁 用 中 断 。<br />

iflags 是 由 下 面 一 个 或 多 个 选 项 组 成 的 序 列 。<br />

a 启 用 或 禁 用 不 精 确 的 异 常 中 止 。<br />

i 启 用 或 禁 用 IRQ 中 断 。<br />

f 启 用 或 禁 用 FIQ 中 断 。<br />

mode 指 定 要 改 变 到 的 模 式 编 号 。<br />

运 算<br />

CPS 进 行 指 定 的 改 变 , 但 不 影 响 CPSR 中 的 任 何 其 它 位 。<br />

条 件 标 志<br />

CPS 指 令 不 影 响 标 志 。<br />

体 系 结 构<br />

CPS 指 令 在 v6 及 更 高 版 本 体 系 结 构 中 有 效 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-117


<strong>ARM</strong> 指 令 参 考<br />

示 例<br />

CPSIE if ; enable interrupts and fast interrupts<br />

CPSID A ; disable imprecise aborts<br />

CPSID ai, #17 ; disable imprecise aborts and interrupts, and enter FIQ mode<br />

CPS #16 ; enter User mode<br />

不 正 确 的 示 例<br />

CPSEQ #19<br />

; CPS cannot be conditional<br />

4-118 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.10.5 SETEND<br />

设 置 CPSR 中 的 端 序 位 。<br />

备 注<br />

SETEND 不 能 是 有 条 件 的 。<br />

语 法<br />

SETEND specifier<br />

其 中 :<br />

specifier 是 以 下 指 令 之 一 :<br />

BE 大 端 。<br />

LE 小 端 。<br />

用 法<br />

使 用 SETEND 访 问 采 用 不 同 端 序 的 数 据 , 例 如 通 过 其 它 的 采 用 小 端 存 储 方 式 的 应<br />

用 程 序 , 来 访 问 几 个 采 用 大 端 存 储 方 式 的 DMA 格 式 化 数 据 字 段 。<br />

体 系 结 构<br />

SETEND 在 v6 及 更 高 版 本 的 体 系 结 构 中 有 效 。<br />

示 例<br />

SETEND BE<br />

; Set the CPSR E bit for big-endian accesses<br />

LDR r0, [r2, #header]<br />

LDR r1, [r2, #CRC32]<br />

SETEND le<br />

; Set the CPSR E bit for little-endian accesses for the<br />

; rest of the application<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-119


<strong>ARM</strong> 指 令 参 考<br />

4.10.6 BKPT<br />

断 点 。<br />

语 法<br />

BKPT immed_16<br />

其 中 :<br />

immed_16 是 一 个 取 值 为 0-65535 范 围 内 的 整 数 (16 位 整 数 ) 的 表 达 式 。<br />

immed_16 被 <strong>ARM</strong> 硬 件 忽 略 , 但 可 由 调 试 器 用 于 存 储 有 关 断 点 的 附<br />

加 信 息 。<br />

用 法<br />

BKPT 指 令 使 处 理 器 进 入 调 试 状 态 。 当 指 令 到 达 某 个 特 定 地 址 处 时 , 调 试 工 具 可 以<br />

使 用 此 指 令 来 检 查 系 统 状 态 。<br />

体 系 结 构<br />

BKPT 可 用 在 版 本 5 及 更 高 体 系 结 构 中 。<br />

示 例<br />

BKPT 0xF02C<br />

BKPT 640<br />

4-120 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.10.7 MAR、 MRA<br />

XScale 协 处 理 器 0 指 令 。<br />

在 两 个 通 用 寄 存 器 和 一 个 40 位 内 部 累 加 器 之 间 传 送 。<br />

语 法<br />

MAR{cond} Acc, RdLo, RdHi<br />

MRA{cond} RdLo, RdHi, Acc<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Acc 是 内 部 累 加 器 。 标 准 名 称 是 accx, 其 中 x 是 一 个 0-n 范 围 内 的 整 数 。<br />

n 的 值 依 赖 于 处 理 器 。 在 目 前 的 处 理 器 中 它 是 0。<br />

RdLo、 RdHi 是 通 用 寄 存 器 。<br />

用 法<br />

MAR 指 令 将 RdLo 的 值 复 制 到 Acc 的 [31:0] 位 , 并 将 RdHi 的 最 低 有 效 字 节 复 制 到 Acc<br />

的 [39:32] 位 。<br />

MRA 指 令 :<br />

• 将 Acc 的 [31:0] 位 复 制 到 RdLo ;<br />

• 将 Acc 的 [39:32] 位 复 制 到 RdHi ;<br />

• 通 过 将 Acc 的 [39] 位 复 制 到 RdHi 的 [31:8] 位 来 用 符 号 扩 展 该 值 。<br />

体 系 结 构<br />

这 些 指 令 只 在 XScale 处 理 器 中 有 效 。<br />

示 例<br />

MAR<br />

MRA<br />

MARNE<br />

MRAGT<br />

acc0,r0,r1<br />

r4,r5,acc0<br />

acc0,r9,r2<br />

r4,r8,acc0<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-121


<strong>ARM</strong> 指 令 参 考<br />

4.11 <strong>ARM</strong> 伪 指 令<br />

<strong>ARM</strong> 汇 编 程 序 支 持 很 多 伪 指 令 , 在 汇 编 时 将 这 些 伪 指 令 解 释 为 <strong>ARM</strong> 或 Thumb<br />

指 令 的 相 应 组 合 。<br />

以 下 各 节 介 绍 在 <strong>ARM</strong> 状 态 下 有 效 的 伪 指 令 :<br />

• 第 4-123 页 的 ADR <strong>ARM</strong> 伪 指 令<br />

装 载 相 对 程 序 的 或 相 对 寄 存 器 的 地 址 ( 短 范 围 )<br />

• 第 4-124 页 的 ADRL <strong>ARM</strong> 伪 指 令<br />

将 相 对 程 序 的 或 相 对 寄 存 器 的 地 址 装 载 到 一 个 寄 存 器 中 ( 中 等 范 围 )<br />

• 第 4-126 页 的 LDR <strong>ARM</strong> 伪 指 令<br />

装 载 一 个 具 有 32 位 常 数 值 或 一 个 地 址 ( 无 限 范 围 ) 的 寄 存 器<br />

• 第 4-128 页 的 SEXT 和 UEXT <strong>ARM</strong> 伪 指 令<br />

将 字 节 或 半 字 符 号 扩 展 或 零 扩 展 到 字 。<br />

• 第 4-129 页 的 NOP <strong>ARM</strong> 伪 指 令<br />

生 成 首 选 的 <strong>ARM</strong> 无 操 作 代 码 。<br />

4-122 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.11.1 ADR <strong>ARM</strong> 伪 指 令<br />

将 一 个 相 对 程 序 或 相 对 寄 存 器 的 地 址 装 载 到 一 个 寄 存 器 中 。<br />

语 法<br />

ADR{cond} register,expr<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 。<br />

register 是 要 装 载 的 寄 存 器 。<br />

expr 是 一 个 相 对 程 序 或 相 对 寄 存 器 的 表 达 式 , 其 取 值 为 :<br />

• 是 ±255 字 节 范 围 内 的 一 个 非 字 对 齐 地 址<br />

• 是 ±1020 字 节 范 围 内 的 一 个 字 对 齐 地 址<br />

如 果 是 16 字 节 或 更 多 字 节 的 对 齐 方 式 , 则 可 以 使 用 更 大 范 围 内 的<br />

地 址 。<br />

地 址 可 以 在 指 令 或 基 址 寄 存 器 的 地 址 之 前 或 之 后 ( 参 阅 第 3-23 页<br />

的 与 寄 存 器 相 关 和 与 程 序 相 关 的 表 达 式 )。<br />

备 注<br />

对 于 相 对 程 序 的 表 达 式 , 给 定 的 范 围 是 相 对 于 当 前 指 令 地 址 后 两 个<br />

字 位 置 上 某 点 的 值 。<br />

用 法<br />

ADR 总 是 汇 编 为 一 个 指 令 。 汇 编 程 序 尝 试 产 生 单 个 ADD 或 SUB 指 令 来 装 载 该 地 址 。<br />

如 果 不 能 在 一 个 指 令 中 构 造 该 地 址 , 则 生 成 一 个 错 误 , 并 且 汇 编 失 败 。<br />

ADR 产 生 依 赖 于 位 置 的 代 码 , 因 为 地 址 是 相 对 程 序 或 相 对 寄 存 器 的 。<br />

使 用 ADRL 伪 指 令 来 汇 编 更 宽 的 有 效 地 址 范 围 。<br />

如 果 expr 是 相 对 程 序 的 , 那 么 取 值 必 须 等 于 与 ADR 伪 指 令 处 于 相 同 的 代 码 区 内 的<br />

一 个 地 址 , 请 参 阅 第 7-54 页 的 AREA。<br />

示 例<br />

start MOV r0,#10<br />

ADR r4,start ; => SUB r4,pc,#0xc<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-123


<strong>ARM</strong> 指 令 参 考<br />

4.11.2 ADRL <strong>ARM</strong> 伪 指 令<br />

将 一 个 相 对 程 序 或 相 对 寄 存 器 的 地 址 装 载 到 一 个 寄 存 器 中 。 它 与 ADR 伪 指 令 类 似 。<br />

ADRL 可 以 装 载 比 ADR 更 宽 的 地 址 范 围 , 因 为 它 生 成 两 个 数 据 处 理 指 令 。<br />

备 注<br />

在 汇 编 Thumb 指 令 时 , ADRL 无 效 。 只 能 在 <strong>ARM</strong> 代 码 内 使 用 它 。<br />

语 法<br />

ADR{cond}L register,expr<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 。<br />

register 是 要 装 载 的 寄 存 器 。<br />

expr 是 一 个 相 对 程 序 或 相 对 寄 存 器 的 表 达 式 , 其 取 值 为 :<br />

• 64KB 内 的 一 个 非 字 对 齐 地 址<br />

• 256KB 内 的 一 个 字 对 齐 地 址<br />

如 果 是 16 字 节 或 更 多 字 节 的 对 齐 方 式 , 则 可 以 使 用 更 大 范 围 内 的<br />

地 址 。<br />

地 址 可 以 在 指 令 或 基 址 寄 存 器 的 地 址 之 前 或 之 后 ( 参 阅 第 3-23 页<br />

的 与 寄 存 器 相 关 和 与 程 序 相 关 的 表 达 式 )。<br />

备 注<br />

对 于 相 对 程 序 的 表 达 式 , 给 定 的 范 围 是 相 对 于 当 前 指 令 地 址 后 两 个<br />

字 位 置 上 某 点 的 值 。<br />

用 法<br />

ADRL 总 是 汇 编 为 两 个 指 令 。 即 使 能 在 单 个 指 令 中 实 现 该 地 址 , 也 会 生 成 第 二 个 冗<br />

余 指 令 。<br />

如 果 汇 编 程 序 不 能 在 两 个 指 令 中 构 造 地 址 , 将 生 成 一 个 出 错 信 息 , 并 且 汇 编 失<br />

败 。 有 关 装 载 更 宽 的 地 址 范 围 的 信 息 , 请 参 阅 第 4-126 页 的 LDR <strong>ARM</strong> 伪 指 令<br />

( 另 请 参 阅 第 2-27 页 的 将 常 数 装 载 到 寄 存 器 中 )。<br />

ADRL 产 生 依 赖 于 位 置 的 代 码 , 因 为 地 址 是 相 对 程 序 或 相 对 寄 存 器 的 。<br />

4-124 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

如 果 expr 是 相 对 程 序 的 , 那 么 取 值 必 须 等 于 与 ADRL 伪 指 令 处 于 相 同 的 代 码 区 内<br />

的 一 个 地 址 , 请 参 阅 第 7-54 页 的 AREA。 否 则 , 在 链 接 后 其 可 能 超 出 范 围 。<br />

示 例<br />

start MOV r0,#10<br />

ADRL r4,start + 60000 ; => ADD r4,pc,#0xe800<br />

; ADD r4,r4,#0x254<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-125


<strong>ARM</strong> 指 令 参 考<br />

4.11.3 LDR <strong>ARM</strong> 伪 指 令<br />

用 下 列 形 式 的 值 装 载 寄 存 器 :<br />

• 一 个 32 位 常 数 值 ;<br />

• 一 个 地 址 。<br />

备 注<br />

本 节 仅 介 绍 LDR 伪 指 令 。 有 关 LDR 指 令 的 信 息 请 参 阅 第 4-8 页 的 <strong>ARM</strong> 存 储 器 访 问<br />

指 令 。<br />

此 外 , 有 关 用 LDR 伪 指 令 装 载 常 数 的 信 息 , 请 参 阅 第 2-29 页 的 使 用 LDR Rd,<br />

=const 装 载 。<br />

语 法<br />

LDR{cond} register,=[expr | label-expr]<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 。<br />

register 是 要 装 入 的 寄 存 器 。<br />

expr 取 值 为 一 个 数 值 常 数 :<br />

• 如 果 该 值 位 于 范 围 内 , 汇 编 程 序 生 成 一 个 MOV 或 MVN 指 令 ;<br />

• 如 果 expr 的 值 不 在 一 个 MOV 或 MVN 指 令 的 范 围 内 , 则 汇 编 程 序<br />

将 该 常 数 放 入 一 个 文 字 池 中 , 并 生 成 一 个 相 对 程 序 的 LDR 指<br />

令 , 来 从 该 文 字 池 中 读 取 这 个 常 数 。<br />

label-expr<br />

是 一 个 相 对 程 序 的 或 外 部 的 表 达 式 。 汇 编 程 序 将 label-expr 的 值 放<br />

在 一 个 文 字 池 中 , 并 生 成 一 个 相 对 程 序 的 LDR 指 令 来 从 文 字 池 中 装<br />

载 该 值 。<br />

如 果 label-expr 是 一 个 外 部 表 达 式 , 或 者 未 包 含 于 当 前 段 内 , 则 汇<br />

编 程 序 在 目 标 文 件 中 放 置 一 个 链 接 程 序 重 定 位 命 令 。 链 接 程 序 在 链<br />

接 时 生 成 地 址 。<br />

4-126 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

用 法<br />

LDR 伪 指 令 的 主 要 用 途 是 :<br />

• 当 一 个 直 接 值 因 为 超 出 MOV 和 MVN 指 令 的 范 围 而 不 能 被 移 动 到 寄 存 器 中 时 ,<br />

用 于 生 成 文 字 常 数 。<br />

• 将 相 对 程 序 的 地 址 或 外 部 地 址 装 载 到 一 个 寄 存 器 中 。 不 管 链 接 程 序 将 包 含<br />

LDR 的 ELF 段 放 在 何 处 , 该 地 址 仍 保 持 有 效 。<br />

备 注<br />

以 这 种 方 式 装 载 的 地 址 是 在 链 接 时 固 定 的 , 因 此 代 码 不 是 独 立 于 位 置 的 。<br />

从 PC 到 文 字 池 中 的 值 的 偏 移 量 必 须 小 于 4KB。 用 户 要 确 保 范 围 内 有 一 个 文 字 池 。<br />

有 关 详 细 信 息 请 参 阅 第 7-14 页 的 LTORG。<br />

有 关 如 何 使 用 LDR 的 详 细 说 明 , 以 及 有 关 MOV 和 MVN 的 详 细 信 息 , 请 参 阅 第 2-27<br />

页 的 将 常 数 装 载 到 寄 存 器 中 。<br />

示 例<br />

LDR r3,=0xff0 ; loads 0xff0 into r3<br />

; => MOV r3,#0xff0<br />

LDR r1,=0xfff ; loads 0xfff into r1<br />

; => LDR r1,[pc,offset_to_litpool]<br />

; ...<br />

; litpool DCD 0xfff<br />

LDR r2,=place ; loads the address of<br />

; place into r2<br />

; => LDR r2,[pc,offset_to_litpool]<br />

; ...<br />

; litpool DCD place<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-127


<strong>ARM</strong> 指 令 参 考<br />

4.11.4 SEXT 和 UEXT <strong>ARM</strong> 伪 指 令<br />

SEXT 和 UEXT 是 不 带 位 循 环 的 SUNPK 和 UUNPK 的 同 义 词 , 并 且 不 允 许 使 用 8TO16 扩<br />

展 。 详 细 信 息 请 参 阅 第 4-91 页 的 SUNPK 和 UUNPK。<br />

它 们 是 与 Thumb SEXT 和 UEXT 指 令 对 等 的 <strong>ARM</strong> 伪 指 令 , 但 可 以 是 有 条 件 的 。<br />

语 法<br />

op{cond} Rd, Rm<br />

其 中 :<br />

op 是 下 列 值 之 一 :<br />

SEXT 符 号 扩 展 。<br />

UEXT 零 扩 展 。<br />

是 下 列 值 之 一 :<br />

8 将 一 个 8 位 值 扩 展 到 一 个 32 位 值 。<br />

16 将 一 个 16 位 值 扩 展 到 一 个 32 位 值 。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 4-6 页 的 条 件 执 行 )。<br />

Rd 是 目 标 寄 存 器 。 不 能 是 r15。<br />

Rm 是 存 放 操 作 数 的 寄 存 器 。 不 能 是 r15。<br />

标 志<br />

SEXT 和 UEXT 不 改 变 任 何 标 志 。<br />

4-128 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


<strong>ARM</strong> 指 令 参 考<br />

4.11.5 NOP <strong>ARM</strong> 伪 指 令<br />

NOP 生 成 首 选 的 <strong>ARM</strong> 无 操 作 指 令 。<br />

下 列 指 令 可 能 被 使 用 , 但 并 不 保 证 总 是 如 此 :<br />

MOV r0, r0<br />

语 法<br />

NOP<br />

用 法<br />

不 能 有 条 件 地 使 用 NOP。 不 执 行 一 个 无 操 作 即 等 同 于 执 行 它 , 因 此 不 需 要 条 件<br />

执 行 。<br />

NOP 不 改 变 ALU 状 态 标 志 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 4-129


<strong>ARM</strong> 指 令 参 考<br />

4-130 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


第 5 章<br />

Thumb 指 令 参 考<br />

本 章 介 绍 <strong>ARM</strong> 汇 编 程 序 和 <strong>ARM</strong> C 和 C++ 编 译 器 的 内 联 汇 编 器 提 供 的 Thumb<br />

指 令 。 其 中 包 含 下 列 各 部 分 :<br />

• 第 5-4 页 的 Thumb 存 储 器 访 问 指 令 ;<br />

• 第 5-15 页 的 Thumb 算 术 指 令 ;<br />

• 第 5-22 页 的 Thumb 通 用 数 据 处 理 指 令 ;<br />

• 第 5-34 页 的 Thumb 跳 转 指 令 ;<br />

• 第 5-41 页 的 其 它 Thumb 指 令 ;<br />

• 第 5-46 页 的 Thumb 伪 指 令 。<br />

请 参 阅 第 5-2 页 上 的 表 5-1 以 查 找 个 别 指 令 或 位 指 令 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-1


Thumb 指 令 参 考<br />

表 5-1 Thumb 指 令 和 伪 指 令 的 位 置<br />

指 令 助 记 码 简 单 描 述 页 码 体 系 结 构 a<br />

ADC 带 进 位 的 加 法 第 5-21 页 4T<br />

ADD 加 法 第 5-15 页 4T<br />

ADR 加 载 地 址 ( 伪 指 令 ) 第 5-47 页 -<br />

AND 逻 辑 AND 第 5-23 页 4T<br />

ASR 算 术 右 移 位 第 5-24 页 4T<br />

B 跳 转 第 5-35 页 4T<br />

BIC 位 清 除 第 5-23 页 4T<br />

BKPT 断 点 第 5-45 页 5T<br />

BL 带 链 接 的 跳 转 第 5-37 页 4T<br />

BLX 带 链 接 和 交 换 指 令 集 的 跳 转 第 5-39 页 5T<br />

BX 跳 转 和 交 换 指 令 集 第 5-38 页 4T<br />

CMN, CMP 负 向 比 较 , 比 较 第 5-26 页 4T<br />

CPS 更 改 处 理 器 状 态 第 5-43 页 6T<br />

CPY 复 制 第 5-28 页 6T<br />

EOR 逻 辑 异 或 第 5-23 页 4T<br />

LDMIA 加 载 多 个 寄 存 器 , 之 后 增 量 第 5-13 页 4T<br />

LDR 加 载 寄 存 器 , 直 接 偏 移 第 5-5 页 4T<br />

LDR 加 载 寄 存 器 , 寄 存 器 偏 移 第 5-7 页 4T<br />

LDR 加 载 寄 存 器 , 相 对 于 PC 或 SP 第 5-9 页 4T<br />

LDR 加 载 寄 存 器 ( 伪 指 令 ) 第 5-48 页 -<br />

LSL、 LSR 逻 辑 左 移 , 逻 辑 右 移 第 5-24 页 4T<br />

MOV 移 动 第 5-30 页 4T<br />

MUL 乘 法 第 5-21 页 4T<br />

5-2 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


Thumb 指 令 参 考<br />

表 5-1 Thumb 指 令 和 伪 指 令 的 位 置 ( 续 )<br />

指 令 助 记 码 简 单 描 述 页 码 体 系 结 构 a<br />

MVN、 NEG 移 动 “ 非 ”, 求 反 值 第 5-30 页 4T<br />

NOP 无 操 作 ( 伪 指 令 ) 第 5-50 页 -<br />

ORR 逻 辑 “ 或 ” 第 5-23 页 4T<br />

POP、 PUSH 从 栈 中 弹 出 寄 存 器 , 将 寄 存 器 推 入 栈 中 第 5-11 页 4T<br />

REV、 REV16、 REVSH 颠 倒 字 节 次 序 第 5-32 页 6T<br />

ROR 向 右 循 环 第 5-24 页 4T<br />

SBC 带 进 位 的 减 法 第 5-21 页 4T<br />

SETEND 设 置 数 据 访 问 的 端 序 第 5-44 页 6T<br />

SEXT 符 号 扩 展 第 5-33 页 6T<br />

STMIA 存 储 多 个 寄 存 器 , 之 后 增 量 第 5-13 页 4T<br />

STR 存 储 寄 存 器 , 直 接 偏 移 第 5-5 页 4T<br />

STR 存 储 寄 存 器 , 寄 存 器 偏 移 第 5-7 页 4T<br />

STR 存 储 寄 存 器 , 相 对 于 pc 或 sp 相 关 第 5-9 页 4T<br />

SUB 减 法 第 5-15 页 4T<br />

SWI 软 件 中 断 第 5-42 页 4T<br />

TST 测 试 位 第 5-31 页 4T<br />

UEXT 零 扩 展 第 5-33 页 6T<br />

a. nT: 可 用 在 版 本 n 及 以 上 <strong>ARM</strong> 体 系 结 构 的 T 变 体 中<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-3


Thumb 指 令 参 考<br />

5.1 Thumb 存 储 器 访 问 指 令<br />

本 节 包 含 下 列 各 个 分 节 :<br />

• 第 5-5 页 的 LDR 和 STR, 直 接 偏 移<br />

加 载 寄 存 器 和 存 储 寄 存 器 。 存 储 器 中 的 地 址 指 定 为 寄 存 器 的 值 加 上 一 个 直<br />

接 偏 移 。<br />

• 第 5-7 页 的 LDR 和 STR, 寄 存 器 偏 移<br />

加 载 寄 存 器 和 存 储 寄 存 器 。 存 储 器 中 的 地 址 指 定 为 一 个 寄 存 器 的 值 加 上 另<br />

一 个 寄 存 器 中 的 偏 移 量 。<br />

• 第 5-9 页 的 LDR 和 STR, 相 对 于 pc 或 sp<br />

加 载 寄 存 器 和 存 储 寄 存 器 。 存 储 器 中 的 地 址 指 定 为 从 pc 或 sp 中 的 一 个 值<br />

开 始 的 一 个 直 接 偏 移 。<br />

• 第 5-11 页 的 PUSH 和 POP<br />

将 低 位 寄 存 器 及 可 选 的 LR 推 入 栈 中 。<br />

将 低 位 寄 存 器 及 可 选 的 pc 从 栈 中 弹 出 。<br />

• 第 5-13 页 的 LDMIA 和 STMIA<br />

装 载 和 存 储 多 个 寄 存 器 。<br />

5-4 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


Thumb 指 令 参 考<br />

5.1.1 LDR 和 STR, 直 接 偏 移<br />

加 载 寄 存 器 和 存 储 寄 存 器 。 存 储 器 中 的 地 址 指 定 为 从 一 个 寄 存 器 的 值 开 始 的 一<br />

个 直 接 偏 移 。<br />

语 法<br />

op Rd, [Rn, #immed_5x4]<br />

opH Rd, [Rn, #immed_5x2]<br />

opB Rd, [Rn, #immed_5x1]<br />

其 中 :<br />

op 可 以 是 :<br />

LDR 装 载 寄 存 器 ;<br />

STR 存 储 寄 存 器 。<br />

H 是 一 个 参 数 , 指 定 一 个 无 符 号 的 半 字 传 送 。<br />

B 是 一 个 参 数 , 指 定 一 个 无 符 号 字 节 传 送 。<br />

Rd 是 要 加 载 或 存 储 的 寄 存 器 。 Rd 必 须 位 于 r0-r7 范 围 内 。<br />

Rn 是 包 含 基 址 的 寄 存 器 。 Rn 必 须 位 于 r0-r7 范 围 内 。<br />

immed_5xN<br />

是 偏 移 量 。 它 是 一 个 表 达 式 , 其 值 ( 在 汇 编 时 ) 等 于 0-31N 范 围 内<br />

的 N 的 一 个 倍 数 。<br />

用 法<br />

STR 指 令 将 一 个 字 、 半 字 或 字 节 存 储 到 存 储 器 中 。<br />

LDR 指 令 从 存 储 器 装 载 一 个 字 、 半 字 或 字 节 。<br />

通 过 将 偏 移 量 加 到 Rn 中 的 基 址 上 来 得 到 地 址 。<br />

直 接 偏 移 半 字 和 字 节 装 载 是 无 符 号 的 。 数 据 被 加 载 到 Rd 的 低 位 字 或 字 节 中 , 其<br />

余 部 分 用 0 填 充 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-5


Thumb 指 令 参 考<br />

字 和 半 字 传 送 时 的 地 址 对 齐<br />

对 于 字 传 送 , 地 址 必 须 可 被 4 整 除 ; 对 于 半 字 传 送 , 地 址 必 须 可 被 2 整 除 。<br />

如 果 系 统 含 有 系 统 协 处 理 器 (cp15), 则 可 以 启 用 对 齐 检 查 。 如 果 启 用 了 对 齐 检<br />

查 , 那 么 非 对 齐 的 传 送 会 导 致 对 齐 异 常 。<br />

如 果 系 统 没 有 系 统 协 处 理 器 (cp15), 或 者 禁 用 了 对 齐 检 查 :<br />

• 非 对 齐 的 装 载 会 破 坏 Rd。<br />

• 非 对 齐 的 存 储 会 破 坏 存 储 器 中 的 两 个 或 四 个 字 节 。 对 于 半 字 存 储 , 被 破 坏<br />

的 存 储 器 位 置 是 [ 地 址 AND NOT 0x1], 对 于 字 存 储 , 被 破 坏 的 存 储 器 位 置<br />

是 [ 地 址 AND NOT 0x3]。<br />

体 系 结 构<br />

这 些 指 令 可 用 在 <strong>ARM</strong> 体 系 结 构 的 所 有 T 变 体 中 。<br />

示 例<br />

LDR<br />

STRB<br />

STRH<br />

LDRB<br />

r3,[r5,#0]<br />

r0,[r3,#31]<br />

r7,[r3,#16]<br />

r2,[r4,#label-{PC}]<br />

不 正 确 的 示 例<br />

LDR r13,[r5,#40] ; high registers not allowed<br />

STRB r0,[r3,#32] ; 32 is out of range for byte transfers<br />

STRH r7,[r3,#15] ; offsets for halfword transfers must be even<br />

LDRH r6,[r0,#-6] ; negative offsets not supported<br />

5-6 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


Thumb 指 令 参 考<br />

5.1.2 LDR 和 STR, 寄 存 器 偏 移<br />

加 载 寄 存 器 和 存 储 寄 存 器 。 存 储 器 中 的 地 址 指 定 为 一 个 寄 存 器 的 值 加 上 另 一 个<br />

寄 存 器 中 的 偏 移 量 。<br />

语 法<br />

op Rd, [Rn, Rm]<br />

其 中 :<br />

op 是 以 下 指 令 之 一 :<br />

LDR 加 载 寄 存 器 , 四 字 节 的 字 ;<br />

STR 存 储 寄 存 器 , 四 字 节 的 字 ;<br />

LDRH 加 载 寄 存 器 , 两 个 字 节 的 无 符 号 半 字 ;<br />

LDRSH 加 载 寄 存 器 , 两 个 字 节 的 有 符 号 半 字 ;<br />

STRH 存 储 寄 存 器 , 两 个 字 节 的 半 字 ;<br />

LDRB 加 载 寄 存 器 , 无 符 号 字 节 ;<br />

LDRSB 加 载 寄 存 器 , 有 符 号 字 节 ;<br />

STRB 存 储 寄 存 器 , 字 节 。<br />

备 注<br />

有 符 号 和 无 符 号 存 储 指 令 之 间 没 有 差 别 。<br />

Rd 是 要 加 载 或 存 储 的 寄 存 器 。 Rd 必 须 位 于 r0-r7 范 围 内 。<br />

Rn 是 包 含 基 址 的 寄 存 器 。 Rn 必 须 位 于 r0-r7 范 围 内 。<br />

Rm 是 包 含 偏 移 的 寄 存 器 。 Rm 必 须 位 于 r0-r7 范 围 内 。<br />

用 法<br />

STR 指 令 将 来 自 Rd 的 一 个 字 、 半 字 或 字 节 存 储 到 存 储 器 中 。<br />

LDR 指 令 从 存 储 器 装 载 一 个 字 、 半 字 或 字 节 到 Rd 中 。<br />

通 过 将 偏 移 量 加 到 Rn 中 的 基 址 上 来 得 到 地 址 。<br />

寄 存 器 偏 移 半 字 和 字 节 装 载 可 以 是 有 符 号 的 或 无 符 号 的 。 数 据 被 加 载 到 Rd 的 最<br />

低 有 效 字 或 字 节 中 , 对 于 无 符 号 加 载 , 用 零 填 充 Rd 的 其 余 部 分 ; 对 于 有 符 号 加<br />

载 则 用 符 号 位 的 拷 贝 填 充 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-7


Thumb 指 令 参 考<br />

字 和 半 字 传 送 时 的 地 址 对 齐<br />

对 于 字 传 送 , 地 址 必 须 可 被 4 除 尽 ; 对 于 半 字 传 送 , 地 址 必 须 可 被 2 除 尽 。<br />

如 果 系 统 含 有 系 统 协 处 理 器 (cp15), 则 可 以 启 用 对 齐 检 查 。 如 果 启 用 了 对 齐 检<br />

查 , 那 么 非 对 齐 的 传 送 会 导 致 对 齐 异 常 。<br />

如 果 系 统 没 有 系 统 协 处 理 器 (cp15), 或 者 禁 用 了 对 齐 检 查 :<br />

• 非 对 齐 的 装 载 破 坏 Rd。<br />

• 非 对 齐 的 存 储 将 破 坏 存 储 器 。 对 于 半 字 存 储 , 存 储 器 中 被 破 坏 的 位 置 位 于<br />

[ 地 址 AND NOT 0x1], 对 于 字 存 储 , 字 位 于 [ 地 址 AND NOT b11] 处 。<br />

体 系 结 构<br />

这 些 指 令 可 用 在 <strong>ARM</strong> 体 系 结 构 的 所 T 有 变 体 中 。<br />

示 例<br />

LDR<br />

LDRSH<br />

STRB<br />

r2,[r1,r5]<br />

r0,[r0,r6]<br />

r1,[r7,r0]<br />

不 正 确 的 示 例<br />

LDR r13,[r5,r3] ; high registers not allowed<br />

STRSH r7,[r3,r1] ; no signed store instruction<br />

5-8 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


Thumb 指 令 参 考<br />

5.1.3 LDR 和 STR, 相 对 于 pc 或 sp<br />

加 载 寄 存 器 和 存 储 寄 存 器 。 存 储 器 中 的 地 址 指 定 为 从 pc 或 sp 中 的 一 个 值 开 始 的<br />

一 个 直 接 偏 移 。<br />

备 注<br />

没 有 与 pc 相 关 的 STR 指 令 。<br />

语 法<br />

LDR Rd, [pc, #immed_8x4]<br />

LDR Rd, label<br />

LDR Rd, [sp, #immed_8x4]<br />

STR Rd, [sp, #immed_8x4]<br />

其 中 :<br />

Rd 是 要 加 载 或 存 储 的 寄 存 器 。 Rd 必 须 位 于 r0 到 r7 范 围 内 。<br />

immed_8x4<br />

label<br />

是 偏 移 量 。 它 是 一 个 表 达 式 , 其 值 ( 在 汇 编 时 ) 等 于 0 到 1020 范<br />

围 内 的 4 的 一 个 倍 数 。<br />

是 一 个 相 对 程 序 的 表 达 式 。 有 关 详 细 信 息 请 参 阅 第 3-23 页 的 与 寄<br />

存 器 相 关 和 与 程 序 相 关 的 表 达 式 。<br />

label 必 须 位 于 当 前 指 令 之 后 , 且 在 其 1KB 范 围 内 。<br />

用 法<br />

STR 指 令 将 一 个 字 存 储 到 存 储 器 中 。<br />

LDR 指 令 从 存 储 器 中 加 载 一 个 字 。<br />

通 过 将 偏 移 量 加 到 pc 或 sp 中 的 基 址 上 来 得 到 地 址 。pc 的 [1] 位 被 忽 略 。 这 样 可<br />

确 保 地 址 是 按 字 对 齐 的 。<br />

字 和 半 字 传 送 时 的 地 址 对 齐<br />

地 址 必 须 是 4 的 倍 数 。<br />

如 果 系 统 含 有 系 统 协 处 理 器 (cp15), 则 可 以 启 用 对 齐 检 查 。 如 果 启 用 了 对 齐 检<br />

查 , 那 么 非 对 齐 的 传 送 会 导 致 对 齐 异 常 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-9


Thumb 指 令 参 考<br />

如 果 系 统 没 有 系 统 协 处 理 器 (cp15), 或 者 禁 用 了 对 齐 检 查 :<br />

• 非 对 齐 的 装 载 破 坏 Rd。<br />

• 非 对 齐 的 存 储 会 破 坏 存 储 器 中 的 四 个 字 节 。 存 储 器 中 被 破 坏 的 位 置 是 [ 地<br />

址 AND NOT b11]。<br />

体 系 结 构<br />

这 些 指 令 可 用 在 <strong>ARM</strong> 体 系 结 构 的 所 有 T 变 体 中 。<br />

示 例<br />

LDR<br />

LDR<br />

LDR<br />

STR<br />

r2,[pc,#1016]<br />

r5,localdata<br />

r0,[sp,#920]<br />

r1,[sp,#20]<br />

不 正 确 的 示 例<br />

LDR r13,[pc,#8] ; Rd must be in range r0-r7<br />

STR r7,[pc,#64] ; there is no pc-relative STR instruction<br />

STRH r0,[sp,#16] ; there are no pc- or sp-relative<br />

; halfword or byte transfers<br />

LDR r2,[pc,#81] ; immediate must be a multiple of four<br />

LDR<br />

r1,[pc,#-24] ; immediate must not be negative<br />

STR r1,[sp,#1024] ; maximum immediate value is 1020<br />

5-10 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


Thumb 指 令 参 考<br />

5.1.4 PUSH 和 POP<br />

将 低 位 寄 存 器 及 可 选 的 lr 推 入 栈 中 。<br />

将 低 位 寄 存 器 及 可 选 的 pc 从 栈 中 弹 出 。<br />

语 法<br />

PUSH {reglist}<br />

POP {reglist}<br />

PUSH {reglist, lr}<br />

POP {reglist, pc}<br />

其 中 :<br />

reglist 是 一 个 用 逗 号 分 隔 的 低 位 寄 存 器 列 表 或 低 位 寄 存 器 范 围 。<br />

备 注<br />

语 法 描 述 部 分 的 大 括 号 是 指 令 格 式 的 一 部 分 。 它 们 并 不 表 示 寄 存 器<br />

列 表 是 可 选 的 。<br />

列 表 中 必 须 至 少 有 一 个 寄 存 器 。<br />

用 法<br />

Thumb 栈 是 完 全 降 序 栈 。 栈 向 下 增 长 , sp 指 向 栈 上 的 最 后 一 个 条 目 。<br />

寄 存 器 按 编 号 顺 序 存 储 在 栈 上 , 编 号 最 低 的 寄 存 器 位 于 最 低 的 地 址 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-11


Thumb 指 令 参 考<br />

POP {reglist, pc}<br />

此 指 令 产 生 一 个 跳 转 , 转 到 从 栈 弹 出 到 pc 的 地 址 处 。 这 通 常 是 从 一 个 子 程 序 的<br />

返 回 , 其 中 lr 是 在 子 程 序 的 开 始 处 被 推 入 栈 中 的 。<br />

在 <strong>ARM</strong> 体 系 结 构 的 5T 版 本 及 以 上 版 本 中 :<br />

• 如 果 加 载 到 pc 中 的 值 的 [1:0] 位 是 b00, 则 处 理 器 转 换 到 <strong>ARM</strong> 状 态 ;<br />

• [1:0] 位 的 值 不 能 是 b10。<br />

在 <strong>ARM</strong> 体 系 结 构 的 4T 版 本 及 更 早 版 本 中 , 加 载 到 pc 中 的 值 的 [1:0] 位 被 忽<br />

略 , 因 此 POP 指 令 不 能 用 于 改 变 状 态 。<br />

条 件 标 志<br />

这 些 指 令 不 影 响 标 志 。<br />

体 系 结 构<br />

这 些 指 令 可 用 在 <strong>ARM</strong> 体 系 结 构 的 所 有 T 变 体 中 。<br />

示 例<br />

PUSH<br />

PUSH<br />

PUSH<br />

POP<br />

POP<br />

{r0,r3,r5}<br />

{r1,r4-r7} ; pushes r1, r4, r5, r6, and r7<br />

{r0,LR}<br />

{r2,r5}<br />

{r0-r7,pc} ; pop and return from subroutine<br />

不 正 确 的 示 例<br />

PUSH {r3,r5-r8} ; high registers not allowed<br />

PUSH {} ; must be at least one register in list<br />

PUSH {r1-r4,pc} ; cannot push the pc<br />

POP {r1-r4,LR} ; cannot pop the LR<br />

5-12 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


Thumb 指 令 参 考<br />

5.1.5 LDMIA 和 STMIA<br />

装 载 和 存 储 多 个 寄 存 器 。<br />

语 法<br />

op Rn!, {reglist}<br />

其 中 :<br />

op 可 以 是 :<br />

LDMIA 加 载 多 个 , 之 后 增 量 ;<br />

STMIA 存 储 多 个 , 之 后 增 量 。<br />

Rn 是 包 含 基 址 的 寄 存 器 。 Rn 必 须 位 于 r0-r7 范 围 内 。<br />

reglist 是 一 个 用 逗 号 分 隔 的 低 位 寄 存 器 列 表 或 低 位 寄 存 器 范 围 。<br />

备 注<br />

语 法 描 述 部 分 的 大 括 号 是 指 令 格 式 的 一 部 分 。 它 们 并 不 表 示 寄 存<br />

器 列 表 是 可 选 的 。<br />

列 表 中 必 须 至 少 有 一 个 寄 存 器 。<br />

用 法<br />

寄 存 器 是 按 数 字 顺 序 依 次 加 载 和 存 储 的 , 地 址 处 的 最 低 位 寄 存 器 最 先 放 入 Rn。<br />

Rn 中 的 值 按 4 与 reglist 中 的 寄 存 器 数 目 的 乘 积 增 加 。<br />

如 果 Rn 位 于 reglist 中 :<br />

• 对 于 LDMIA 指 令 , Rn 的 最 终 值 是 所 加 载 的 值 , 而 不 是 增 量 后 的 地 址 。<br />

• 对 于 STMIA 指 令 , 为 Rn 存 储 的 值 是 :<br />

— 如 果 Rn 是 reglist 中 编 号 最 低 的 寄 存 器 , 则 是 Rn 的 初 始 值 ;<br />

— 否 则 是 不 可 预 测 的 值 。<br />

体 系 结 构<br />

这 些 指 令 可 用 在 <strong>ARM</strong> 体 系 结 构 的 所 有 T 变 体 中 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-13


Thumb 指 令 参 考<br />

示 例<br />

LDMIA<br />

LDMIA<br />

STMIA<br />

STMIA<br />

r3!, {r0,r4}<br />

r5!, {r0-r7}<br />

r0!, {r6,r7}<br />

r3!, {r3,r5,r7}<br />

不 正 确 的 示 例<br />

LDMIA<br />

r3!,{r0,r9} ; high registers not allowed<br />

STMIA r5!, {} ; must be at least one register<br />

; in list<br />

STMIA<br />

r5!,{r1-r6} ; value stored from r5 is unpredictable<br />

5-14 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


Thumb 指 令 参 考<br />

5.2 Thumb 算 术 指 令<br />

本 节 包 含 下 列 各 个 分 节 :<br />

• 第 5-16 页 的 ADD 和 SUB, 低 位 寄 存 器<br />

加 法 和 减 法 。<br />

• 第 5-18 页 的 ADD, 高 位 或 低 位 寄 存 器<br />

将 寄 存 器 中 的 值 相 加 , 其 中 一 个 或 两 个 寄 存 器 在 r8 到 r15 范 围 内 。<br />

• 第 5-19 页 的 ADD 和 SUB, sp<br />

将 sp 增 加 或 减 少 一 个 立 即 数 。<br />

• 第 5-20 页 的 ADD, 相 对 于 pc 或 sp<br />

将 一 个 立 即 数 加 到 从 sp 或 pc 取 出 的 值 中 , 并 将 结 果 存 放 到 一 个 低 位 寄 存<br />

器 中 。<br />

• 第 5-21 页 的 ADC、 SBC 和 MUL<br />

带 进 位 的 加 法 , 带 进 位 的 减 法 , 以 及 乘 法 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-15


Thumb 指 令 参 考<br />

5.2.1 ADD 和 SUB, 低 位 寄 存 器<br />

加 法 和 减 法 。 有 三 种 形 式 的 这 类 指 令 可 操 作 低 位 寄 存 器 。 可 以 :<br />

• 将 两 个 寄 存 器 的 内 容 相 加 或 相 减 , 并 把 结 果 放 到 第 三 个 寄 存 器 中 ;<br />

• 将 一 个 寄 存 器 的 值 加 上 或 减 去 一 个 小 整 数 , 并 将 结 果 放 到 别 的 寄 存 器 中 ;<br />

• 将 一 个 寄 存 器 的 值 加 上 或 减 去 一 个 大 整 数 , 并 将 结 果 放 回 同 一 个 寄 存 器 中 。<br />

语 法<br />

op Rd, Rn, Rm<br />

op Rd, Rn, #expr3<br />

op Rd, #expr8<br />

其 中 :<br />

op 是 ADD 或 者 SUB。<br />

Rd 是 目 标 寄 存 器 。 在 op Rd,#expr8 指 令 中 , 其 也 被 用 作 第 一 个 操 作 数 。<br />

Rn 是 包 含 第 一 个 操 作 数 的 一 个 寄 存 器 。<br />

Rm 是 包 含 第 二 个 操 作 数 的 一 个 寄 存 器 。<br />

expr3 是 一 个 在 –7 到 +7 范 围 内 取 整 数 值 ( 在 汇 编 时 ) 的 表 达 式 。<br />

expr8 是 一 个 在 –255 到 +255 范 围 内 取 整 数 值 ( 在 汇 编 时 ) 的 表 达 式 。<br />

用 法<br />

op Rd,Rn,Rm 执 行 一 个 Rn + Rm 或 Rn - Rm 运 算 , 并 将 结 果 放 到 Rd 中 。<br />

op Rd,Rn,#expr3 执 行 一 个 Rn + expr3 或 Rn - expr3 运 算 , 并 将 结 果 放 到 Rd 中 。<br />

op Rd,#expr8 执 行 一 个 Rd + expr8 或 Rd - expr8 运 算 , 并 将 结 果 放 到 Rd 中 。<br />

5-16 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


Thumb 指 令 参 考<br />

备 注<br />

一 个 带 有 负 的 expr3 或 expr8 值 的 ADD 指 令 , 将 被 汇 编 为 带 有 正 常 数 的 相 应 SUB 指<br />

令 。 一 个 带 有 负 的 expr3 或 expr8 值 的 SUB 指 令 , 将 被 汇 编 为 带 有 正 常 数 的 相 应<br />

ADD 指 令 。<br />

当 看 到 反 汇 编 列 表 时 就 会 清 楚 这 一 点 。<br />

限 制<br />

Rd、 Rn 和 Rm 都 必 须 是 低 位 寄 存 器 ( 即 位 于 r0 到 r7 范 围 内 )。<br />

条 件 标 志<br />

这 些 指 令 更 新 N、 Z、 C 和 V 标 志 。<br />

体 系 结 构<br />

这 些 指 令 可 用 在 <strong>ARM</strong> 体 系 结 构 的 所 有 T 变 体 中 。<br />

示 例<br />

ADD r3,r1,r5<br />

SUB r0,r4,#5<br />

ADD r7,#201<br />

ADD r1,vc+4<br />

; vc + 4 must evaluate at assembly time to<br />

; an integer in the range -255 to +255<br />

不 正 确 的 示 例<br />

ADD r9,r2,r6 ; high registers not allowed<br />

SUB r4,r5,#201 ; immediate value out of range<br />

SUB r3,#-99 ; negative immediate values not allowed<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-17


Thumb 指 令 参 考<br />

5.2.2 ADD, 高 位 或 低 位 寄 存 器<br />

将 寄 存 器 中 的 值 相 加 , 将 结 果 返 回 到 第 一 个 操 作 数 寄 存 器 中 。<br />

语 法<br />

ADD Rd, Rm<br />

其 中 :<br />

Rd 是 目 标 寄 存 器 。 其 也 是 第 一 个 操 作 数 的 寄 存 器 。<br />

Rm 是 包 含 第 二 个 操 作 数 的 一 个 寄 存 器 。<br />

用 法<br />

此 指 令 将 Rd 和 Rm 中 的 值 相 加 , 并 将 结 果 放 到 Rd 中 。<br />

备 注<br />

一 个 ADD Rd,Rm 指 令 , 其 中 Rd 和 Rm 都 是 低 位 寄 存 器 , 将 汇 编 为 ADD Rd,Rd,Rm 指 令<br />

( 请 参 阅 第 5-16 页 的 ADD 和 SUB, 低 位 寄 存 器 )。<br />

当 看 到 反 汇 编 列 表 时 就 会 清 楚 这 一 点 。<br />

条 件 标 志<br />

N、 Z、 C 和 V 标 志 是 :<br />

• 如 果 Rd 和 Rm 都 是 低 位 寄 存 器 则 更 新 ;<br />

• 否 则 不 受 影 响 。<br />

体 系 结 构<br />

此 指 令 可 用 在 <strong>ARM</strong> 体 系 结 构 的 所 有 T 变 体 中 。<br />

示 例<br />

ADD r12,r4<br />

ADD r10,r11<br />

ADD r0,r8<br />

ADD r2,r4 ; equivalent to ADD r2,r2,r4. Does affect flags.<br />

5-18 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


Thumb 指 令 参 考<br />

5.2.3 ADD 和 SUB, sp<br />

将 sp 增 加 或 减 少 一 个 立 即 数 。<br />

语 法<br />

ADD sp, #expr<br />

SUB sp, #expr<br />

其 中 :<br />

expr<br />

是 一 个 表 达 式 , 其 值 ( 在 汇 编 时 ) 等 于 -508 到 +508 范 围 内 的 4 的<br />

一 个 倍 数 。<br />

用 法<br />

此 指 令 将 expr 的 值 加 到 从 Rp 取 出 的 值 中 , 并 将 结 果 存 放 到 Rd 中 。<br />

备 注<br />

一 个 带 有 负 的 expr 值 的 ADD 指 令 , 将 汇 编 为 带 有 正 常 数 的 相 应 SUB 指 令 。 一 个 带<br />

有 负 的 expr 值 的 SUB 指 令 , 将 汇 编 为 带 有 正 常 数 的 相 应 ADD 指 令 。<br />

当 看 到 反 汇 编 列 表 时 就 会 清 楚 这 一 点 。<br />

条 件 标 志<br />

这 些 指 令 不 影 响 标 志 。<br />

体 系 结 构<br />

这 些 指 令 可 用 在 <strong>ARM</strong> 体 系 结 构 的 所 有 T 变 体 中 。<br />

示 例<br />

ADD sp,#312<br />

SUB sp,#96<br />

SUB sp,#abc+8<br />

; abc + 8 must evaluate at assembly time to<br />

; a multiple of 4 in the range –508 to +508<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-19


Thumb 指 令 参 考<br />

5.2.4 ADD, 相 对 于 pc 或 sp<br />

将 一 个 立 即 数 加 到 从 sp 或 pc 取 出 的 值 中 , 并 将 结 果 存 放 到 一 个 低 位 寄 存 器 中 。<br />

语 法<br />

ADD Rd, Rp, #expr<br />

其 中 :<br />

Rd 是 目 标 寄 存 器 。 Rd 必 须 位 于 r0-r7 范 围 内 。<br />

Rp<br />

expr<br />

用 法<br />

是 sp 或 者 pc。<br />

是 一 个 表 达 式 , 其 值 ( 在 汇 编 时 ) 等 于 0 到 1020 范 围 内 的 4 的 一<br />

个 倍 数 。<br />

此 指 令 将 expr 的 值 加 到 从 Rp 取 出 的 值 中 , 并 将 结 果 存 放 到 Rd 中 。<br />

备 注<br />

如 果 Rp 是 pc, 则 使 用 的 值 是 :<br />

( 当 前 指 令 地 址 + 4) AND &FFFFFFFC。<br />

条 件 标 志<br />

此 指 令 不 影 响 标 志 。<br />

体 系 结 构<br />

此 指 令 可 用 在 <strong>ARM</strong> 体 系 结 构 的 所 有 T 变 体 中 。<br />

示 例<br />

ADD r6,sp,#64<br />

ADD r2,pc,#980<br />

ADD r0,pc,#lit-{PC} ; lit - {PC} must evaluate, at assembly<br />

; time, to a multiple of 4 in the range<br />

; 0 to 1020<br />

5-20 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


Thumb 指 令 参 考<br />

5.2.5 ADC、 SBC 和 MUL<br />

带 进 位 的 加 法 , 带 进 位 的 减 法 , 以 及 乘 法 。<br />

语 法<br />

op Rd, Rm<br />

其 中 :<br />

op 是 ADC、 SBC 或 MUL 之 一 。<br />

Rd 是 目 标 寄 存 器 。 其 中 也 包 含 第 一 个 操 作 数 。<br />

Rm 是 包 含 第 二 个 操 作 数 的 一 个 寄 存 器 。<br />

用 法<br />

ADC 将 Rd 的 值 与 Rm 中 的 值 以 及 进 位 标 记 寄 存 器 的 值 相 加 , 将 结 果 存 放 到 Rd 中 。<br />

使 用 此 指 令 合 成 多 字 加 法 。<br />

SBC 将 Rd 中 的 值 减 去 Rm 中 的 值 , 并 减 去 进 位 标 记 寄 存 器 的 值 , 将 结 果 存 放 到 Rd<br />

中 。 使 用 此 指 令 合 成 多 字 减 法 。<br />

MUL 将 Rd 的 值 与 Rm 中 的 值 相 乘 , 将 结 果 存 放 到 Rd 中 。<br />

限 制<br />

Rd 和 Rm 都 必 须 是 低 位 寄 存 器 ( 即 位 于 r0 到 r7 范 围 内 )。<br />

条 件 标 志<br />

ADC 和 SBC 更 新 N、 Z、 C 和 V 标 志 。<br />

MUL 更 新 N 和 Z 标 志 。<br />

在 版 本 4 及 更 早 版 本 的 <strong>ARM</strong> 体 系 结 构 中 ,MUL 破 坏 C 和 V 标 志 。 在 版 本 5 及 更<br />

高 版 本 的 <strong>ARM</strong> 体 系 结 构 中 , MUL 不 影 响 C 和 V 标 志 。<br />

体 系 结 构<br />

这 些 指 令 可 用 在 <strong>ARM</strong> 体 系 结 构 的 所 有 T 变 体 中 。<br />

示 例<br />

ADC r2,r4<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-21


Thumb 指 令 参 考<br />

5.3 Thumb 通 用 数 据 处 理 指 令<br />

本 节 包 含 下 列 各 个 分 节 :<br />

• 第 5-23 页 的 AND、 ORR、 EOR 和 BIC<br />

按 位 逻 辑 运 算 。<br />

• 第 5-24 页 的 ASR、 LSL、 LSR 和 ROR<br />

移 位 和 循 环 运 算 。<br />

• 第 5-26 页 的 CMP 和 CMN<br />

比 较 和 负 向 比 较 。<br />

• 第 5-28 页 的 MOV 和 CPY<br />

移 动 和 复 制 。<br />

• 第 5-30 页 的 MVN 和 NEG<br />

移 动 “ 非 ” 和 求 反 值 。<br />

• 第 5-31 页 的 TST<br />

测 试 位 。<br />

• 第 5-32 页 的 REV、 REV16 和 REVSH<br />

颠 倒 字 节 或 半 字 。<br />

• 第 5-33 页 的 SEXT 和 UEXT<br />

符 号 或 零 扩 展 。<br />

5-22 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


Thumb 指 令 参 考<br />

5.3.1 AND、 ORR、 EOR 和 BIC<br />

按 位 逻 辑 运 算 。<br />

语 法<br />

op Rd, Rm<br />

其 中 :<br />

op 是 AND、 ORR、 EOR 或 BIC 之 一 。<br />

Rd 是 目 标 寄 存 器 。 其 中 也 包 含 第 一 个 操 作 数 。 Rd 必 须 位 于 r0-r7 范<br />

围 内 。<br />

Rm 是 包 含 第 二 个 操 作 数 的 寄 存 器 。 Rm 必 须 位 于 r0-r7 范 围 内 。<br />

用 法<br />

这 些 指 令 对 Rd 和 Rm 中 的 内 容 执 行 按 位 逻 辑 运 算 , 并 将 结 果 放 到 Rd 中 。 运 算 方<br />

式 如 下 :<br />

• AND 指 令 执 行 逻 辑 “ 与 ” 运 算<br />

• ORR 指 令 执 行 逻 辑 “ 或 ” 运 算<br />

• EOR 指 令 执 行 逻 辑 “ 异 或 ” 运 算<br />

• BIC 执 行 一 个 Rd “ 与 非 ” Rm 运 算 。<br />

条 件 标 志<br />

这 些 指 令 根 据 结 果 更 新 N 和 Z 标 志 。 C 和 V 标 志 不 受 影 响 。<br />

体 系 结 构<br />

这 些 指 令 可 用 在 <strong>ARM</strong> 体 系 结 构 的 所 有 T 变 体 中 。<br />

示 例<br />

AND r2,r4<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-23


Thumb 指 令 参 考<br />

5.3.2 ASR、 LSL、 LSR 和 ROR<br />

移 位 和 循 环 运 算 。 这 些 指 令 可 以 使 用 一 个 寄 存 器 中 包 含 的 值 , 也 可 以 使 用 直 接 移<br />

位 值 。<br />

语 法<br />

op Rd, Rs<br />

op Rd, Rm, #expr<br />

其 中 :<br />

op 是 下 列 值 之 一 :<br />

ASR 算 术 右 移 位 。 寄 存 器 内 容 被 当 作 有 符 号 整 数 的 二 进 制 补<br />

码 。 符 号 位 被 复 制 到 空 出 的 位 中 。<br />

LSL 逻 辑 左 移 。 清 除 空 出 的 位 。<br />

LSR 逻 辑 右 移 。 清 除 空 出 的 位 。<br />

ROR 向 右 循 环 。 移 出 寄 存 器 右 边 的 位 被 循 环 送 回 左 边 。<br />

备 注<br />

ROR 只 能 与 寄 存 器 控 制 的 移 位 一 起 使 用 。<br />

Rd<br />

是 目 标 寄 存 器 。 它 也 是 寄 存 器 控 制 的 移 位 的 源 寄 存 器 。 Rd 必 须 位<br />

于 r0-r7 范 围 内 。<br />

Rs 包 含 寄 存 器 控 制 的 移 位 的 移 位 值 。 Rm 必 须 位 于 r0-r7 范 围 内 。<br />

Rm 是 直 接 移 位 的 源 寄 存 器 值 。 Rm 必 须 位 于 r0-r7 范 围 内 。<br />

expr 是 直 接 移 位 值 。 是 一 个 取 值 ( 在 汇 编 时 ) 在 下 列 范 围 内 的 表 达 式 :<br />

• 如 果 op 是 LSL 则 范 围 为 0-31 ;<br />

• 否 则 范 围 是 1-32。<br />

5-24 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


Thumb 指 令 参 考<br />

寄 存 器 控 制 的 移 位<br />

这 些 指 令 从 Rd 取 得 值 , 对 其 应 用 移 位 , 并 将 结 果 存 放 回 Rd 中 。<br />

只 有 Rs 的 最 低 有 效 字 节 用 作 移 位 值 。<br />

对 于 除 ROR 外 的 所 有 这 些 指 令 :<br />

• 如 果 移 位 是 32, 则 清 除 Rd, 并 且 被 移 出 的 最 后 一 位 保 存 在 C 标 志 中 ;<br />

• 如 果 移 位 大 于 32, 则 清 除 Rd 和 C 标 志 。<br />

直 接 移 位<br />

这 些 指 令 从 Rm 中 取 得 值 , 对 其 应 用 移 位 , 并 将 结 果 存 放 到 Rd 中 。<br />

条 件 标 志<br />

这 些 指 令 根 据 结 果 更 新 N 和 Z 标 志 。 V 标 志 不 受 影 响 。<br />

C 标 志 :<br />

• 不 受 影 响 ( 如 果 移 位 值 是 零 );<br />

• 否 则 , 包 含 被 移 出 源 寄 存 器 的 最 后 一 位 。<br />

体 系 结 构<br />

这 些 指 令 可 用 在 <strong>ARM</strong> 体 系 结 构 的 所 有 T 变 体 中 。<br />

示 例<br />

ASR r3,r5<br />

LSR r0,r2,#6<br />

LSR r5,r5,av<br />

LSL r0,r4,#0<br />

; av must evaluate, at assembly time, to an<br />

; integer in the range 1-32.<br />

; same as MOV r0,r4 except that C and V<br />

; flags are not affected<br />

不 正 确 的 示 例<br />

ROR r2,r7,#3<br />

LSL r9,r1<br />

LSL r0,r7,#32<br />

ASR r0,r7,#0<br />

; ROR cannot use immediate shift value<br />

; high registers not allowed<br />

; immediate shift out of range<br />

; immediate shift out of range<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-25


Thumb 指 令 参 考<br />

5.3.3 CMP 和 CMN<br />

比 较 和 负 向 比 较 。<br />

语 法<br />

CMP Rn, #expr<br />

CMP Rn, Rm<br />

CMN Rn, Rm<br />

其 中 :<br />

Rn 是 包 含 第 一 个 操 作 数 的 寄 存 器 。<br />

expr 是 一 个 在 0 到 255 之 间 取 整 数 值 ( 在 汇 编 时 ) 的 表 达 式 。<br />

Rm 是 包 含 第 二 个 操 作 数 的 一 个 寄 存 器 。<br />

用 法<br />

这 些 指 令 更 新 条 件 标 志 位 , 但 不 将 结 果 放 入 寄 存 器 中 。<br />

CMP 将 Rn 中 的 值 减 去 expr 的 值 或 Rm 中 的 值 。<br />

CMN 将 Rm 和 Rn 中 的 值 相 加 。<br />

限 制<br />

在 CMP Rn, #expr 和 CMN 指 令 中 , Rd 和 Rm 必 须 在 r0 到 r7 范 围 内 。<br />

在 CMP Rn,Rm 指 令 中 , Rn 和 Rm 可 以 是 r0 到 r15 的 任 何 寄 存 器 。<br />

条 件 标 志<br />

这 些 指 令 根 据 结 果 更 新 N、 Z、 C 和 V 标 志 。<br />

体 系 结 构<br />

这 些 指 令 可 用 在 体 系 结 构 的 所 有 T 变 体 中 。<br />

5-26 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


Thumb 指 令 参 考<br />

示 例<br />

CMP r2,#255<br />

CMP r7,r12<br />

CMN r1,r5<br />

; high register IS allowed with CMP Rn,Rm<br />

不 正 确 的 示 例<br />

CMP r2,#508<br />

CMP r9,#24<br />

CMN r0,r10<br />

; immediate value out of range<br />

; high register not allowed with #expr<br />

; high register not allowed with CMN<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-27


Thumb 指 令 参 考<br />

5.3.4 MOV 和 CPY<br />

移 动 和 复 制 。<br />

语 法<br />

MOV Rd, #expr<br />

MOV Rd, Rm<br />

CPY Rd, Rm<br />

其 中 :<br />

Rd 是 目 标 寄 存 器 。<br />

expr 是 一 个 在 0 到 255 之 间 取 整 数 值 ( 在 汇 编 时 ) 的 表 达 式 。<br />

Rm 是 源 寄 存 器 。<br />

用 法<br />

MOV 指 令 将 #expr 或 来 自 Rm 的 值 放 到 Rd 中 。<br />

CPY 指 令 将 Rm 中 的 值 复 制 到 Rd 中 。<br />

限 制<br />

在 MOV Rd,#expr、 MVN 和 NEG 指 令 中 , Rd 和 Rm 必 须 是 在 r0 到 r7 范 围 内 。<br />

在 CPY 指 令 中 , Rd 和 Rm 可 以 是 r0 到 r15 的 任 意 寄 存 器 。<br />

在 MOV Rd, Rm 指 令 中 ,Rd 和 Rm 可 以 是 r0 到 r15 的 任 何 寄 存 器 , 但 请 参 阅 第 5-30<br />

页 的 条 件 标 志 。<br />

5-28 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


Thumb 指 令 参 考<br />

条 件 标 志<br />

CPY 指 令 不 更 新 任 何 标 志 。<br />

MOV Rd,#expr 指 令 更 新 N 和 Z 标 志 。 其 对 C 或 V 标 志 没 有 影 响 。<br />

MOV Rd, Rm 的 执 行 结 果 如 下 :<br />

• 如 果 Rd 或 Rm 是 一 个 高 位 寄 存 器 (r8-r15), 那 么 标 志 不 受 影 响 。 在 v6 及 以 上<br />

版 本 的 体 系 结 构 中 , 在 这 些 情 况 下 最 好 使 用 CPY。<br />

• 如 果 Rd 和 Rm 都 是 低 位 寄 存 器 (r0-r7), 则 更 新 N 和 Z 标 志 , 并 清 除 C 和 V<br />

标 志 。<br />

备 注<br />

可 以 使 用 带 有 零 移 位 的 LSL 来 在 低 位 寄 存 器 之 间 移 动 , 而 又 不 清 除 C 和 V<br />

标 志 ( 请 参 阅 第 5-24 页 的 ASR、 LSL、 LSR 和 ROR)。<br />

在 v6 及 以 上 版 本 的 体 系 结 构 中 , 这 是 不 必 要 的 , 可 以 用 CPY 来 代 替 。<br />

体 系 结 构<br />

MOV 指 令 可 用 在 <strong>ARM</strong> 体 系 结 构 的 所 有 T 变 体 中 。<br />

CPY 指 令 可 用 在 v6 及 以 上 版 本 的 体 系 结 构 的 所 有 T 变 体 中 。<br />

示 例<br />

MOV r3,#0<br />

MOV r0,r12 ; does not update flags<br />

不 正 确 的 示 例<br />

MOV r2,#256 ; immediate value out of range<br />

MOV r8,#3 ; cannot move immediate to high register<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-29


Thumb 指 令 参 考<br />

5.3.5 MVN 和 NEG<br />

移 动 “ 非 ” 和 求 反 值 。<br />

语 法<br />

MVN Rd, Rm<br />

NEG Rd, Rm<br />

其 中 :<br />

Rd 是 目 标 寄 存 器 。<br />

Rm 是 源 寄 存 器 。<br />

Rd 和 Rm 必 须 位 于 r0 到 r7 范 围 内 。<br />

用 法<br />

MVN 指 令 取 出 Rm 中 的 值 , 对 该 值 执 行 按 位 逻 辑 “ 非 ” 运 算 , 并 将 结 果 放 入 Rd 中 。<br />

NEG 指 令 取 出 Rm 中 的 值 , 将 其 乘 以 -1, 并 将 结 果 放 入 Rd 中 。<br />

条 件 标 志<br />

MVN 指 令 更 新 N 和 Z 标 志 。 其 对 C 或 V 标 志 没 有 影 响 。<br />

NEG 指 令 更 新 N、 Z、 C 和 V 标 志 。<br />

体 系 结 构<br />

这 些 指 令 可 用 在 <strong>ARM</strong> 体 系 结 构 的 所 有 T 变 体 中 。<br />

示 例<br />

MVN r7,r1<br />

NEG r2,r2<br />

不 正 确 的 示 例<br />

MVN r8,r2<br />

NEG r0,#3<br />

; high registers not allowed with MVN or NEG<br />

; immediate value not allowed with MVN or NEG<br />

5-30 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


Thumb 指 令 参 考<br />

5.3.6 TST<br />

测 试 位 。<br />

语 法<br />

TST Rn, Rm<br />

其 中 :<br />

Rn 是 包 含 第 一 个 操 作 数 的 寄 存 器 。<br />

Rm 是 包 含 第 二 个 操 作 数 的 寄 存 器 。<br />

用 法<br />

此 指 令 对 Rm 和 Rn 中 的 值 执 行 按 位 逻 辑 “ 与 ” 运 算 。 此 指 令 更 新 条 件 标 志 , 但<br />

不 将 结 果 放 入 寄 存 器 中 。<br />

限 制<br />

Rn 和 Rm 必 须 位 于 r0-r7 范 围 内 。<br />

条 件 标 志<br />

TST 指 令 根 据 结 果 更 新 N 和 Z 标 志 。 C 和 V 标 志 不 受 影 响 。<br />

体 系 结 构<br />

TST 指 令 可 用 在 <strong>ARM</strong> 体 系 结 构 的 所 有 T 变 体 中 。<br />

示 例<br />

TST r2,r4<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-31


Thumb 指 令 参 考<br />

5.3.7 REV、 REV16 和 REVSH<br />

颠 倒 一 个 字 或 半 字 中 的 字 节 顺 序 。 颠 倒 一 个 半 字 的 字 节 顺 序 并 符 号 扩 展 。<br />

语 法<br />

op Rd, Rm<br />

其 中 :<br />

op 是 以 下 值 之 一 :<br />

REV 颠 倒 一 个 字 中 的 字 节 顺 序 。<br />

REV16 颠 倒 Rm 的 每 个 半 字 中 的 字 节 顺 序 。<br />

REVSH 颠 倒 Rm 低 半 字 中 的 字 节 顺 序 , 并 且 符 号 扩 展 到 32 位 。<br />

Rd 是 目 标 寄 存 器 。 Rd 必 须 位 于 r0-r7 范 围 内 。<br />

Rm 是 包 含 第 二 个 操 作 数 的 寄 存 器 。 RM 必 须 位 于 r0-r7 范 围 内 。<br />

不 要 将 r15 用 于 Rd 或 Rm。<br />

条 件 标 志<br />

这 些 指 令 不 影 响 标 志 。<br />

体 系 结 构<br />

这 些 指 令 可 用 在 v6 及 以 上 版 本 体 系 结 构 的 所 有 T 变 体 中 。<br />

示 例<br />

REV<br />

REV16<br />

REVSH<br />

r3, r7<br />

r0, r0<br />

r0, r5<br />

5-32 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


Thumb 指 令 参 考<br />

5.3.8 SEXT 和 UEXT<br />

有 符 号 和 无 符 号 数 据 解 组 指 令 。<br />

这 些 指 令 执 行 下 面 任 一 种 操 作 :<br />

• 将 一 个 8 位 值 用 符 号 或 零 扩 展 到 32 位 ;<br />

• 将 一 个 16 位 值 用 符 号 或 零 扩 展 到 32 位 值 。<br />

语 法<br />

op Rd, Rm<br />

其 中 :<br />

op 是 下 列 值 之 一 :<br />

SEXT8 将 一 个 8 位 值 用 符 号 扩 展 到 32 位 值 。<br />

SEXT16 将 一 个 16 位 值 用 符 号 扩 展 到 32 位 值 。<br />

UEXT8 将 一 个 8 位 值 用 零 扩 展 到 32 位 值 。<br />

UEXT16 将 一 个 16 位 值 用 零 扩 展 到 32 位 值 。<br />

Rd 是 目 标 寄 存 器 。 必 须 位 于 r0 到 r7 范 围 内 。<br />

Rm 是 存 放 操 作 数 的 寄 存 器 。 必 须 位 于 r0 到 r7 范 围 内 。<br />

条 件 标 志<br />

这 些 指 令 不 影 响 任 何 标 志 。<br />

体 系 结 构<br />

这 些 指 令 可 用 在 v6 及 以 上 版 本 体 系 结 构 的 所 有 T 变 体 中 。<br />

示 例<br />

SEXT8 r3, r1<br />

UEXT16 r5, r0<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-33


Thumb 指 令 参 考<br />

5.4 Thumb 跳 转 指 令<br />

本 节 包 含 下 列 各 个 分 节 :<br />

• 第 5-35 页 的 B<br />

跳 转 。<br />

• 第 5-37 页 的 BL<br />

带 链 接 的 跳 转 。<br />

• 第 5-38 页 的 BX<br />

跳 转 和 交 换 指 令 集 。<br />

• 第 5-39 页 的 BLX<br />

带 链 接 的 跳 转 和 交 换 指 令 集 。<br />

5-34 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


Thumb 指 令 参 考<br />

5.4.1 B<br />

跳 转 。 这 是 Thumb 指 令 集 中 唯 一 的 条 件 指 令 。<br />

语 法<br />

B{cond} label<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 代 码 ( 请 参 阅 第 5-36 页 上 的 表 5-2)。<br />

label 是 一 个 相 对 程 序 的 表 达 式 。 这 通 常 是 相 同 代 码 块 内 的 一 个 标 号 。<br />

有 关 详 细 信 息 请 参 阅 第 3-23 页 的 与 寄 存 器 相 关 和 与 程 序 相 关 的 表<br />

达 式 。<br />

label 必 须 位 于 :<br />

• 当 前 指 令 的 -252 到 +258 字 节 内 ( 如 果 使 用 了 cond);<br />

• ±2KB 之 内 ( 如 果 该 指 令 是 无 条 件 的 )。<br />

用 法<br />

如 果 满 足 cond 条 件 , 或 者 如 果 未 使 用 cond, 则 B 指 令 产 生 转 到 label 的 一 个 跳 转 。<br />

备 注<br />

label 必 须 位 于 指 定 的 限 制 范 围 内 。 <strong>ARM</strong> 链 接 程 序 不 能 增 加 代 码 来 生 成 更 长 的<br />

跳 转 。<br />

体 系 结 构<br />

此 指 令 可 用 在 <strong>ARM</strong> 体 系 结 构 的 所 有 T 变 体 中 。<br />

示 例<br />

B dloop<br />

BEQ sectB<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-35


Thumb 指 令 参 考<br />

表 5-2 Thumb B 指 令 的 条 件 代 码<br />

后 缀 标 志 含 义<br />

EQ Z 设 置 等 于<br />

NE Z 清 除 不 等 于<br />

CS/HS C 设 置 大 于 或 等 于 ( 无 符 号 的 >= )<br />

CC/LO C 清 除 小 于 ( 无 符 号 的


Thumb 指 令 参 考<br />

5.4.2 BL<br />

带 链 接 的 长 跳 转 。<br />

语 法<br />

BL label<br />

其 中 :<br />

label<br />

是 一 个 相 对 程 序 的 表 达 式 。 有 关 详 细 信 息 请 参 阅 第 3-23 页 的 与 寄<br />

存 器 相 关 和 与 程 序 相 关 的 表 达 式 。<br />

用 法<br />

BL 将 下 一 个 指 令 的 地 址 复 制 到 r14 (lr, 链 接 寄 存 器 ) 中 , 并 产 生 转 到 label 的<br />

一 个 跳 转 。<br />

机 器 级 指 令 不 能 跳 转 到 当 前 指 令 的 ±4Mb 范 围 外 的 地 址 。 必 要 时 <strong>ARM</strong> 链 接 程 序<br />

插 入 代 码 ( 一 段 胶 合 代 码 ) 以 允 许 更 长 的 跳 转 ( 请 参 阅 <strong>RealView</strong> 编 译 工 具 2.0<br />

版 链 接 程 序 和 实 用 程 序 指 南 中 的 <strong>ARM</strong> 链 接 程 序 一 章 )。<br />

体 系 结 构<br />

BL 指 令 可 用 在 <strong>ARM</strong> 体 系 结 构 的 所 有 T 变 体 中 。<br />

示 例<br />

BL extract<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-37


Thumb 指 令 参 考<br />

5.4.3 BX<br />

跳 转 和 可 选 的 交 换 指 令 集 。<br />

语 法<br />

BX Rm<br />

其 中 :<br />

Rm 是 一 个 <strong>ARM</strong> 寄 存 器 , 包 含 要 跳 转 到 的 目 标 地 址 。<br />

Rm 的 第 0 位 不 用 作 地 址 的 一 部 分 。<br />

如 果 Rm 的 第 0 位 被 清 除 :<br />

• 位 1 也 必 须 被 清 除 ;<br />

• 该 指 令 清 除 CPSR 中 的 T 标 志 , 并 且 将 目 标 位 置 处 的 代 码 解<br />

释 为 <strong>ARM</strong> 代 码 。<br />

用 法<br />

BX 产 生 转 到 Rm 中 地 址 的 一 个 跳 转 , 并 且 如 果 设 置 了 Rm 的 0 位 , 则 将 改 变 为<br />

Thumb 指 令 集 。<br />

体 系 结 构<br />

BX 指 令 可 用 在 <strong>ARM</strong> 体 系 结 构 的 所 有 T 变 体 中 。<br />

示 例<br />

BX r5<br />

5-38 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


Thumb 指 令 参 考<br />

5.4.4 BLX<br />

带 链 接 的 跳 转 和 可 选 交 换 指 令 集 。<br />

语 法<br />

BLX Rm<br />

BLX label<br />

其 中 :<br />

Rm 是 一 个 <strong>ARM</strong> 寄 存 器 , 包 含 要 跳 转 到 的 目 标 地 址 。<br />

label<br />

Rm 的 第 0 位 不 用 作 地 址 的 一 部 分 。 如 果 Rm 的 第 0 位 被 清 除 :<br />

• 位 1 也 必 须 被 清 除 。<br />

• 此 指 令 清 除 CPSR 中 的 T 标 志 。 目 标 地 址 处 的 代 码 被 解 释 为<br />

<strong>ARM</strong> 代 码 。<br />

是 一 个 相 对 程 序 的 表 达 式 。 有 关 详 细 信 息 请 参 阅 第 3-23 页 的 与 寄<br />

存 器 相 关 和 与 程 序 相 关 的 表 达 式 。<br />

BLX label 总 是 造 成 <strong>ARM</strong> 状 态 的 改 变 。<br />

用 法<br />

BLX 指 令 :<br />

• 将 下 一 个 指 令 的 地 址 复 制 到 r14 (lr, 链 接 寄 存 器 ) 中 ;<br />

• 产 生 转 到 label 或 Rm 中 存 放 的 地 址 处 的 一 个 跳 转 ;<br />

• 如 果 符 合 下 列 条 件 之 一 , 则 将 指 令 集 改 变 为 <strong>ARM</strong> 指 令 集 :<br />

— 如 果 Rm 的 第 0 位 是 清 除 的 ;<br />

— 使 用 了 BLX label 形 式 的 指 令 。<br />

机 器 级 指 令 不 能 跳 转 到 当 前 指 令 的 ±4Mb 范 围 外 的 地 址 。 必 要 时 <strong>ARM</strong> 链 接 程 序<br />

插 入 代 码 ( 一 段 胶 合 代 码 ) 以 允 许 更 长 的 跳 转 ( 请 参 阅 <strong>RealView</strong> 编 译 工 具 2.0<br />

版 链 接 程 序 和 实 用 程 序 指 南 中 的 <strong>ARM</strong> 链 接 程 序 一 章 )。<br />

体 系 结 构<br />

BLX 可 用 在 版 本 5 及 以 上 版 本 的 <strong>ARM</strong> 体 系 结 构 的 T 变 体 中 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-39


Thumb 指 令 参 考<br />

示 例<br />

BLX r6<br />

BLX armsub<br />

5-40 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


Thumb 指 令 参 考<br />

5.5 其 它 Thumb 指 令<br />

本 节 包 含 下 列 各 个 分 节 :<br />

• 第 5-42 页 的 SWI<br />

软 件 中 断 。<br />

• 第 5-43 页 的 CPS<br />

改 变 处 理 器 状 态 。<br />

• 第 5-44 页 的 SETEND<br />

设 置 CPSR 中 的 端 序 。<br />

• 第 5-45 页 的 BKPT<br />

断 点 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-41


Thumb 指 令 参 考<br />

5.5.1 SWI<br />

软 件 中 断 。<br />

语 法<br />

SWI immed_8<br />

其 中 :<br />

immed_8 是 一 个 数 值 表 达 式 , 其 取 值 为 0-255 范 围 内 的 一 个 整 数 。<br />

用 法<br />

SWI 指 令 引 起 一 个 SWI 异 常 。 这 意 味 着 处 理 器 状 态 改 变 为 <strong>ARM</strong>, 处 理 器 模 式 改<br />

变 为 [Supervisor], CPSR 保 存 到 [Supervisor] 模 式 SRSP, 并 且 代 码 的 执 行 跳 转<br />

到 SWI 向 量 ( 请 参 阅 <strong>RealView</strong> 编 译 工 具 2.0 版 开 发 者 指 南 中 的 处 理 处 理 器 异 常<br />

一 章 )。<br />

immed_8 被 处 理 器 忽 略 。 但 是 , 它 出 现 在 指 令 操 作 码 的 [7:0] 位 中 。 其 可 由 异 常 处<br />

理 程 序 检 索 得 到 , 以 确 定 正 在 请 求 哪 种 服 务 。<br />

条 件 标 志<br />

SWI 指 令 不 影 响 标 志 。<br />

体 系 结 构<br />

SWI 指 令 可 用 在 <strong>ARM</strong> 体 系 结 构 的 所 有 T 变 体 中 。<br />

示 例<br />

SWI 12<br />

5-42 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


Thumb 指 令 参 考<br />

5.5.2 CPS<br />

改 变 处 理 器 状 态 。<br />

语 法<br />

CPSeffect iflags<br />

其 中 :<br />

effect 是 以 下 指 令 之 一 :<br />

IE 启 用 中 断 。<br />

ID 禁 用 中 断 。<br />

iflags 是 由 下 面 一 个 或 多 个 选 项 组 成 的 序 列 。<br />

a 启 用 或 禁 用 不 精 确 的 异 常 中 止 。<br />

i 启 用 或 禁 用 IRQ 中 断 。<br />

f 启 用 或 禁 用 FIQ 中 断 。<br />

运 算<br />

CPS 进 行 指 定 的 改 变 , 但 不 影 响 CPSR 中 的 任 何 其 它 位 。<br />

条 件 标 志<br />

CPS 指 令 不 影 响 标 志 。<br />

体 系 结 构<br />

CPS 指 令 可 用 在 v6 及 以 上 版 本 体 系 结 构 的 所 有 T 变 体 中 。<br />

示 例<br />

CPSIE if<br />

CPSID a<br />

; enable interrupts and fast interrupts<br />

; disable imprecise aborts<br />

不 正 确 的 示 例<br />

CPSID ai, #17 ; cannot change mode with Thumb CPS<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-43


Thumb 指 令 参 考<br />

5.5.3 SETEND<br />

设 置 CPSR 中 的 端 序 。<br />

语 法<br />

SETEND specifier<br />

其 中 :<br />

specifier 是 以 下 指 令 之 一 :<br />

BE 大 端 。<br />

LE 小 端 。<br />

用 法<br />

使 用 SETEND 访 问 采 用 不 同 端 序 存 储 方 式 的 数 据 , 例 如 通 过 其 它 采 用 小 端 存 储<br />

方 式 的 应 用 程 序 , 来 访 问 几 个 采 用 大 端 存 储 方 式 的 DMA 格 式 化 数 据 字 段 。<br />

体 系 结 构<br />

SETEND 指 令 可 用 在 v6 及 以 上 版 本 体 系 结 构 的 T 变 体 中 。<br />

示 例<br />

SETEND BE<br />

; Set the CPSR E bit for big-endian accesses<br />

LDR r0, [r2, #header]<br />

LDR r1, [r2, #CRC32]<br />

SETEND LE<br />

; Set the CPSR E bit for little-endian accesses for the<br />

; rest of the application<br />

5-44 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


Thumb 指 令 参 考<br />

5.5.4 BKPT<br />

断 点 。<br />

语 法<br />

BKPT immed_8<br />

其 中 :<br />

immed_8 是 一 个 表 达 式 , 其 取 值 为 0-255 范 围 内 的 一 个 整 数 。<br />

用 法<br />

BKPT 使 处 理 器 进 入 调 试 Debug ( 调 试 ) 模 式 。 当 指 令 到 达 某 个 特 定 地 址 处 时 , 调<br />

试 工 具 可 以 使 用 此 指 令 来 检 查 系 统 状 态 。<br />

immed_8 被 处 理 器 忽 略 。 但 是 , 它 出 现 在 指 令 操 作 码 的 [7:0] 位 中 。 其 可 由 调 试 程<br />

序 用 于 存 储 有 关 断 点 的 附 加 信 息 。<br />

体 系 结 构<br />

BKPT 可 用 在 版 本 5 及 以 上 版 本 的 <strong>ARM</strong> 体 系 结 构 的 T 变 体 中 。<br />

示 例<br />

BKPT 67<br />

BKPT 2_10110<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-45


Thumb 指 令 参 考<br />

5.6 Thumb 伪 指 令<br />

<strong>ARM</strong> 汇 编 程 序 支 持 很 多 Thumb 伪 指 令 , 在 汇 编 时 将 这 些 伪 指 令 解 释 为 适 当 的<br />

Thumb 指 令 。<br />

可 在 Thumb 状 态 下 使 用 的 伪 指 令 在 以 下 各 节 介 绍 :<br />

• 第 5-47 页 的 ADR Thumb 伪 指 令 ;<br />

• 第 5-48 页 的 LDR Thumb 伪 指 令 ;<br />

• 第 5-50 页 的 NOP Thumb 伪 指 令 。<br />

5-46 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


Thumb 指 令 参 考<br />

5.6.1 ADR Thumb 伪 指 令<br />

ADR 将 一 个 相 对 程 序 的 地 址 装 载 到 一 个 寄 存 器 中 。<br />

语 法<br />

ADR register, expr<br />

其 中 :<br />

register 是 要 装 载 的 寄 存 器 。<br />

expr<br />

用 法<br />

是 一 个 相 对 程 序 的 表 达 式 。 偏 移 量 必 须 是 正 值 且 小 于 1KB。 expr<br />

必 须 局 部 定 义 , 它 不 能 被 导 入 。<br />

在 Thumb 状 态 下 ,ADR 只 能 产 生 字 对 齐 的 地 址 。 使 用 ALIGN 命 令 确 保 expr 是 对 齐<br />

的 ( 请 参 阅 第 7-52 页 的 ALIGN)。<br />

expr 的 取 值 必 须 等 于 与 ADR 伪 指 令 在 同 一 代 码 段 内 的 一 个 地 址 。 如 果 其 位 于 另<br />

一 个 ELF 段 内 , 则 不 能 保 证 链 接 后 该 地 址 将 处 在 范 围 内 。<br />

示 例<br />

ADR r4,txampl ; => ADD r4,pc,#nn<br />

; code<br />

ALIGN<br />

txampl DCW 0,0,0,0<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-47


Thumb 指 令 参 考<br />

5.6.2 LDR Thumb 伪 指 令<br />

LDR 伪 指 令 装 载 一 个 低 位 寄 存 器 , 采 用 下 列 形 式 之 一 :<br />

• 一 个 32 位 常 数 值 ;<br />

• 一 个 地 址 。<br />

备 注<br />

本 节 仅 介 绍 LDR 伪 指 令 。 有 关 LDR 指 令 的 信 息 请 参 阅 第 5-4 页 的 Thumb 存 储 器 访<br />

问 指 令 。<br />

语 法<br />

LDR register, =[expr | label-exp]<br />

其 中 :<br />

register<br />

是 要 加 载 的 寄 存 器 。 LDR 只 能 访 问 低 位 寄 存 器 (r0-r7)。<br />

expr 取 值 为 一 个 数 值 常 数 :<br />

• 如 果 expr 的 值 位 于 一 个 MOV 指 令 的 范 围 内 , 则 汇 编 程 序 生 成<br />

该 指 令 ;<br />

• 如 果 expr 的 值 不 在 一 个 MOV 指 令 的 范 围 内 , 则 汇 编 程 序 将 该<br />

常 数 放 入 一 个 文 字 池 中 , 并 生 成 相 对 程 序 的 LDR 指 令 来 从 文 字<br />

池 中 读 取 该 常 数 。<br />

label-exp 是 一 个 相 对 于 程 序 的 或 外 部 的 表 达 式 。 汇 编 程 序 将 label-exp 的 值<br />

放 在 一 个 文 字 池 中 , 并 生 成 一 个 相 对 程 序 的 LDR 指 令 来 从 文 字 池<br />

中 装 载 该 值 。<br />

如 果 label-exp 是 一 个 外 部 表 达 式 , 或 者 未 包 含 于 当 前 段 内 , 则 汇<br />

编 程 序 在 目 标 文 件 中 放 置 一 个 链 接 程 序 重 定 位 指 令 。 链 接 程 序 确 保<br />

在 链 接 时 生 成 正 确 的 地 址 。<br />

从 pc 到 文 字 池 中 的 值 的 偏 移 量 必 须 是 正 值 且 小 于 1KB。 用 户 要 确 保 范 围 内 有 一<br />

个 文 字 池 。 有 关 详 细 信 息 请 参 阅 第 7-14 页 的 LTORG。<br />

5-48 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


Thumb 指 令 参 考<br />

用 法<br />

LDR 伪 指 令 用 于 两 个 主 要 用 途 :<br />

• 当 一 个 直 接 值 因 为 超 出 MOV 指 令 的 范 围 而 不 能 被 移 动 到 寄 存 器 中 时 , 用 于<br />

生 成 文 本 常 数 。<br />

• 将 相 对 于 程 序 的 地 址 或 外 部 地 址 装 载 到 一 个 寄 存 器 中 。 不 管 链 接 程 序 将 包<br />

含 LDR 的 ELF 段 放 在 何 处 , 该 地 址 仍 保 持 有 效 。<br />

示 例<br />

LDR r1, =0xfff ; loads 0xfff into r1<br />

LDR<br />

r2, =labelname ; loads the address of labelname into r2<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-49


Thumb 指 令 参 考<br />

5.6.3 NOP Thumb 伪 指 令<br />

NOP 生 成 首 选 的 Thumb 无 操 作 指 令 。<br />

可 能 使 用 下 列 指 令 , 但 并 不 保 证 :<br />

MOV r8,r8<br />

语 法<br />

NOP 指 令 的 语 法 是 :<br />

NOP<br />

条 件 标 志<br />

NOP 不 改 变 ALU 状 态 标 志 。<br />

5-50 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


第 6 章<br />

向 量 浮 点 编 程<br />

本 章 提 供 有 关 用 汇 编 语 言 实 现 浮 点 协 处 理 器 编 程 的 参 考 信 息 。 其 中 包 含 下 列<br />

各 节 :<br />

• 第 6-4 页 的 向 量 浮 点 协 处 理 器 ;<br />

• 第 6-5 页 的 浮 点 寄 存 器 ;<br />

• 第 6-7 页 的 向 量 和 标 量 运 算 ;<br />

• 第 6-8 页 的 VFP 和 条 件 码 ;<br />

• 第 6-10 页 的 VFP 系 统 寄 存 器 ;<br />

• 第 6-13 页 的 清 零 模 式 ;<br />

• 第 6-15 页 的 VFP 指 令 ;<br />

• 第 6-36 页 的 VFP 伪 指 令 ;<br />

• 第 6-38 页 的 VFP 命 令 和 向 量 记 号 。<br />

有 关 个 别 指 令 的 描 述 的 位 置 , 请 参 阅 第 6-2 上 的 表 6-1。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 6-1


向 量 浮 点 编 程<br />

表 6-1 VFP 指 令 描 述 位 置<br />

助 记 码 简 单 描 述 页 码 运 算 体 系 结 构<br />

FABS 绝 对 值 第 6-16 页 向 量 全 部<br />

FADD 加 法 第 6-17 页 向 量 全 部<br />

FCMP 比 较 第 6-18 页 标 量 全 部<br />

FCPY 复 制 第 6-16 页 向 量 全 部<br />

FCVTDS 将 单 精 度 转 换 为 双 精 度 第 6-19 页 标 量 全 部<br />

FCVTSD 将 双 精 度 转 换 为 单 精 度 第 6-20 页 标 量 全 部<br />

FDIV 除 法 第 6-21 页 向 量 全 部<br />

FLD 装 载 ( 另 请 参 阅 第 6-36 页 的 FLD 伪 指 令 ) 第 6-22 页 标 量 全 部<br />

FLDM 装 载 多 个 第 6-24 页 - 全 部<br />

FMAC 乘 加 第 6-26 页 标 量 全 部<br />

FMDHR、<br />

FMDLR<br />

从 一 个 <strong>ARM</strong> 寄 存 器 传 送 到 半 个 双 精 度 值 第 6-28 页 标 量 全 部<br />

FMDRR 从 两 个 <strong>ARM</strong> 寄 存 器 传 送 到 双 精 度 值 第 6-27 页 标 量 VFPv2<br />

FMRDH、<br />

FMRDL<br />

从 半 个 双 精 度 值 传 送 到 <strong>ARM</strong> 寄 存 器 第 6-28 页 标 量 全 部<br />

FMRRD 从 双 精 度 值 传 送 到 两 个 <strong>ARM</strong> 寄 存 器 第 6-27 页 标 量 VFPv2<br />

FMRRS 在 两 个 <strong>ARM</strong> 寄 存 器 和 两 个 单 精 度 值 之 间 传 送 第 6-30 页 标 量 VFPv2<br />

FMRS 从 单 精 度 值 传 送 到 <strong>ARM</strong> 寄 存 器 第 6-29 页 标 量 全 部<br />

FMRX 从 VFP 系 统 寄 存 器 传 送 到 <strong>ARM</strong> 寄 存 器 第 6-31 页 - 全 部<br />

FMSC 乘 减 第 6-26 页 向 量 全 部<br />

FMSR 从 <strong>ARM</strong> 寄 存 器 传 送 到 单 精 度 值 第 6-29 页 标 量 全 部<br />

FMSRR 在 两 个 <strong>ARM</strong> 寄 存 器 和 两 个 单 精 度 值 之 间 传 送 第 6-30 页 标 量 VFPv2<br />

FMSTAT 将 VFP 状 态 标 志 传 送 到 <strong>ARM</strong> CPSR 状 态 标 志 第 6-31 页 - 全 部<br />

FMUL 乘 法 第 6-32 页 向 量 全 部<br />

FMXR 从 <strong>ARM</strong> 寄 存 器 传 送 到 VFP 系 统 寄 存 器 第 6-31 页 - 全 部<br />

6-2 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


向 量 浮 点 编 程<br />

表 6-1 VFP 指 令 描 述 位 置 ( 续 )<br />

助 记 码 简 单 描 述 页 码 运 算 体 系 结 构<br />

FNEG 求 反 第 6-16 页 向 量 全 部<br />

FNMAC 求 反 - 乘 法 - 累 加 第 6-26 页 向 量 全 部<br />

FNMSC 求 反 - 乘 法 - 减 法 第 6-26 页 向 量 全 部<br />

FNMUL 求 反 - 乘 法 第 6-32 页 向 量 全 部<br />

FSITO 将 有 符 号 整 数 转 换 为 浮 点 数 第 6-33 页 标 量 全 部<br />

FSQRT 平 方 根 第 6-34 页 向 量 全 部<br />

FST 存 储 第 6-22 页 标 量 全 部<br />

FSTM 存 储 多 个 数 第 6-24 页 - 全 部<br />

FSUB 减 法 第 6-17 页 向 量 全 部<br />

FTOSI、<br />

FTOUI<br />

将 浮 点 数 转 换 为 有 符 号 或 无 符 号 整 数 第 6-35 页 标 量 全 部<br />

FUITO 将 无 符 号 整 数 转 换 为 浮 点 数 第 6-33 页 标 量 全 部<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 6-3


向 量 浮 点 编 程<br />

6.1 向 量 浮 点 协 处 理 器<br />

向 量 浮 点 (VFP) 协 处 理 器 与 相 关 的 支 持 代 码 一 起 提 供 单 精 度 和 双 精 度 浮 点 运<br />

算 , 这 些 运 算 由 ANSI/IEEE Std. 754-1985 IEEE 二 进 制 浮 点 运 算 标 准 定 义 。 在 本<br />

章 中 将 该 文 档 称 为 IEEE 754 标 准 。 在 <strong>RealView</strong> 编 译 工 具 2.0 版 编 译 器 和 程 序 库<br />

指 南 的 浮 点 一 章 中 , 有 关 于 该 标 准 的 概 述 。<br />

由 不 超 过 八 个 单 精 度 数 或 四 个 双 精 度 数 组 成 的 短 向 量 的 处 理 效 率 特 别 高 。 大 多<br />

数 算 术 运 算 指 令 都 可 应 用 在 这 些 向 量 上 , 从 而 允 许 单 指 令 、 多 数 据 (SIMD) 并 行<br />

处 理 。 此 外 , 浮 点 装 载 和 存 储 指 令 具 有 多 种 寄 存 器 形 式 , 使 得 能 实 现 向 量 和 存 储<br />

器 之 间 的 高 效 率 传 送 。<br />

有 关 向 量 浮 点 协 处 理 器 的 详 细 信 息 , 请 参 阅 <strong>ARM</strong> 体 系 结 构 参 考 手 册 。<br />

6.1.1 VFP 体 系 结 构<br />

VFP 体 系 结 构 有 两 个 版 本 。 VFPv2 含 有 VFPv1 的 全 部 指 令 , 并 有 四 个 附 加 的<br />

指 令 。<br />

这 些 增 加 的 指 令 允 许 在 <strong>ARM</strong> 寄 存 器 和 VFP 寄 存 器 之 间 用 一 条 指 令 来 传 送 2 个<br />

32 位 的 字 。<br />

6-4 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


向 量 浮 点 编 程<br />

6.2 浮 点 寄 存 器<br />

向 量 浮 点 协 处 理 器 拥 有 从 s0 到 s31 的 32 个 单 精 度 寄 存 器 。 每 个 寄 存 器 可 以 包 含<br />

一 个 单 精 度 浮 点 值 或 一 个 32 位 整 数 。<br />

也 可 将 这 32 个 寄 存 器 当 作 16 个 双 精 度 寄 存 器 - d0 到 d15。dn 与 s(2n) 和 s(2n+1)<br />

占 用 相 同 的 硬 件 。<br />

可 以 使 用 :<br />

• 一 些 寄 存 器 用 于 单 精 度 值 , 同 时 使 用 其 它 寄 存 器 用 于 双 精 度 值 ;<br />

• 在 不 同 的 时 间 , 使 用 相 同 的 寄 存 器 用 于 单 精 度 值 和 双 精 度 值 。<br />

不 要 试 图 同 时 使 用 对 应 的 单 精 度 和 双 精 度 寄 存 器 。 这 样 做 不 会 造 成 损 失 , 但 结 果<br />

没 有 意 义 。<br />

6.2.1 寄 存 器 组<br />

VFP 寄 存 器 被 编 排 为 四 个 组 :<br />

• 八 个 单 精 度 寄 存 器 ,s0 到 s7,s8 到 s15,s16 到 s23, 以 及 s24 到 s31 ;<br />

• 四 个 双 精 度 寄 存 器 ,d0 到 d3,d4 到 d7,d8 到 d11, 以 及 d12 到 d15 ;<br />

• 单 精 度 和 双 精 度 寄 存 器 的 任 何 组 合 。<br />

进 一 步 的 说 明 请 参 阅 图 6-1。<br />

图 6-1 VFP 寄 存 器 组<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 6-5


向 量 浮 点 编 程<br />

6.2.2 向 量<br />

一 个 向 量 可 以 使 用 来 自 同 一 组 的 最 多 八 个 单 精 度 寄 存 器 或 四 个 双 精 度 寄 存 器 。<br />

向 量 中 使 用 的 寄 存 器 数 由 FPSCR 中 的 LEN 位 控 制 ( 参 阅 第 6-10 页 的 FPSCR, 浮<br />

点 状 态 和 控 制 寄 存 器 )。<br />

一 个 向 量 可 以 从 任 何 寄 存 器 开 始 。 一 个 向 量 所 用 的 第 一 个 寄 存 器 在 个 别 指 令 的<br />

寄 存 器 字 段 中 指 定 。<br />

向 量 绕 回<br />

如 果 向 量 扩 展 超 过 寄 存 器 组 的 末 尾 , 其 将 绕 回 到 同 一 组 的 开 始 处 , 例 如 :<br />

• 从 s5 开 始 的 长 度 为 6 的 向 量 是 {s5, s6, s7, s0, s1, s2} ;<br />

• 从 s15 开 始 的 长 度 为 3 的 向 量 是 {s15, s8, s9} ;<br />

• 从 s22 开 始 的 长 度 为 4 的 向 量 是 {s22, s23, s16, s17} ;<br />

• 从 d7 开 始 的 长 度 为 2 的 向 量 是 {d7, d4} ;<br />

• 从 d10 开 始 的 长 度 为 3 的 向 量 是 {d10, d11, d8}。<br />

一 个 向 量 不 能 包 含 来 自 多 个 组 的 寄 存 器 。<br />

向 量 跨 度<br />

向 量 可 以 占 用 连 续 的 寄 存 器 ( 如 上 述 例 子 所 示 ), 也 可 以 占 用 交 替 的 寄 存 器 。 这<br />

是 由 FPSCR 中 的 STRIDE 位 来 控 制 的 ( 参 阅 第 6-10 页 的 FPSCR, 浮 点 状 态 和 控 制<br />

寄 存 器 )。 例 如 :<br />

• 长 度 为 3, 跨 度 为 2, 从 s1 开 始 的 向 量 是 {s1, s3, s5} ;<br />

• 长 度 为 4, 跨 度 为 2, 从 s6 开 始 的 向 量 是 {s6, s0, s2, s4} ;<br />

• 长 度 为 2, 跨 度 为 2, 从 d1 开 始 的 向 量 是 {d1, d3}。<br />

向 量 长 度 的 限 制<br />

向 量 不 能 使 用 同 一 寄 存 器 两 次 。 允 许 向 量 绕 回 , 这 意 味 着 您 不 能 拥 有 :<br />

• 长 度 > 4 且 跨 度 = 2 的 单 精 度 向 量 ;<br />

• 长 度 > 4 且 跨 度 = 1 的 双 精 度 向 量 ;<br />

• 长 度 > 2 且 跨 度 = 2 的 双 精 度 向 量 。<br />

6-6 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


向 量 浮 点 编 程<br />

6.3 向 量 和 标 量 运 算<br />

可 以 使 用 VFP 运 算 指 令 来 操 作 :<br />

• 标 量 ;<br />

• 向 量 ;<br />

• 标 量 和 向 量 。<br />

使 用 FPSCR 中 的 LEN 位 来 控 制 向 量 的 长 度 ( 请 参 阅 第 6-10 页 的 FPSCR, 浮 点 状<br />

态 和 控 制 寄 存 器 )。<br />

当 LEN 是 1 时 , 所 有 运 算 都 是 标 量 运 算 。<br />

6.3.1 控 制 标 量 、 向 量 和 混 合 运 算<br />

当 LEN 大 于 1 时 , 算 术 运 算 的 行 为 取 决 于 目 标 和 操 作 数 寄 存 器 位 于 哪 个 寄 存 器 组<br />

中 ( 参 阅 第 6-5 页 的 寄 存 器 组 )。<br />

指 令 的 行 为 具 有 下 列 一 般 形 式 :<br />

Op Fd,Fn,Fm<br />

Op Fd,Fm<br />

是 如 下 几 种 情 形 :<br />

• 如 果 Fd 位 于 第 一 组 寄 存 器 ( 即 s0 到 s7 或 d0 到 d3) 中 , 则 运 算 是 标 量 运 算 。<br />

• 如 果 Fm 位 于 第 一 组 寄 存 器 中 , 但 Fd 不 在 其 中 , 则 运 算 是 混 合 运 算 。<br />

• 如 果 Fm 和 Fd 都 在 第 一 组 寄 存 器 中 , 则 运 算 是 向 量 运 算 。<br />

标 量 运 算<br />

Op 作 用 在 Fm 中 的 值 上 , 以 及 Fn 中 的 值 上 ( 如 果 存 在 )。 结 果 存 放 在 Fd 中 。<br />

向 量 运 算<br />

Op 作 用 在 从 Fm 开 始 的 向 量 值 上 , 也 作 用 在 从 Fn 开 始 的 向 量 值 上 ( 如 果 存 在 )。<br />

结 果 存 放 在 从 Fd 开 始 的 向 量 中 。<br />

标 量 和 向 量 混 合 运 算<br />

对 于 单 操 作 数 指 令 , Op 作 用 在 Fm 中 的 单 个 值 上 。 结 果 的 LEN 个 副 本 存 放 在 从 Fd<br />

开 始 的 向 量 中 。<br />

对 于 多 操 作 数 的 指 令 ,Op 作 用 在 Fm 中 的 单 个 值 上 , 也 作 用 在 从 Fn 开 始 的 向 量 的<br />

值 上 。 结 果 存 放 在 从 Fd 开 始 的 向 量 中 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 6-7


向 量 浮 点 编 程<br />

6.4 VFP 和 条 件 码<br />

可 以 使 用 条 件 码 来 控 制 任 何 VFP 指 令 的 执 行 。 指 令 是 根 据 CPSR 中 的 状 态 标 志<br />

来 条 件 执 行 , 执 行 方 式 与 几 乎 所 有 其 它 <strong>ARM</strong> 指 令 相 同 。<br />

可 用 于 更 新 状 态 标 志 的 唯 一 VFP 指 令 是 FCMP。 其 并 不 直 接 更 新 CPSR 中 的 标 志 ,<br />

而 是 更 新 FPSCR 中 的 一 个 单 独 的 标 志 集 ( 参 阅 第 6-10 页 的 FPSCR, 浮 点 状 态<br />

和 控 制 寄 存 器 )。<br />

备 注<br />

如 要 使 用 这 些 标 志 来 控 制 条 件 指 令 , 包 括 条 件 VFP 指 令 , 必 须 先 使 用 一 个 FMSTAT<br />

指 令 将 其 拷 贝 到 CPSR 中 ( 参 阅 第 6-31 页 的 FMRX、 FMXR 和 FMSTAT)。<br />

在 FCMP 指 令 后 的 标 志 的 准 确 含 义 , 与 其 在 <strong>ARM</strong> 数 据 处 理 指 令 后 的 含 义 是 不 同<br />

的 。 这 是 因 为 :<br />

• 浮 点 值 总 是 有 符 号 的 , 因 此 不 需 要 无 符 号 的 条 件 ;<br />

• 非 数 字 (NaN) 值 与 数 字 之 间 或 者 彼 此 之 间 没 有 排 序 关 系 , 因 此 需 要 附 加 条<br />

件 来 允 许 无 序 的 结 果 。<br />

条 件 码 助 记 码 的 含 义 如 表 6-2 所 示 。<br />

表 6-2 条 件 码<br />

助 记 码 在 <strong>ARM</strong> 数 据 处 理 指 令 后 的 含 义 在 VFP FCMP 指 令 后 的 含 义<br />

EQ 等 于 等 于<br />

NE 不 等 于 不 等 于 , 或 无 序 的<br />

CS/HS 设 置 进 位 / 无 符 号 的 大 于 或 相 同 大 于 或 等 于 , 或 无 序 的<br />

CC/LO 清 除 进 位 / 无 符 号 的 小 于 小 于<br />

MI 负 数 小 于<br />

PL 正 数 或 零 大 于 或 等 于 , 或 无 序 的<br />

VS 溢 出 无 序 的 ( 至 少 一 个 非 数 字 操 作 数 )<br />

VC 无 溢 出 非 无 序 的<br />

6-8 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


向 量 浮 点 编 程<br />

表 6-2 条 件 码 ( 续 )<br />

助 记 码 在 <strong>ARM</strong> 数 据 处 理 指 令 后 的 含 义 在 VFP FCMP 指 令 后 的 含 义<br />

HI 无 符 号 的 大 于 大 于 , 或 无 序 的<br />

LS 无 符 号 的 小 于 或 相 同 小 于 或 等 于<br />

GE 有 符 号 的 大 于 或 等 于 大 于 或 等 于<br />

LT 有 符 号 的 小 于 小 于 , 或 无 序 的<br />

GT 有 符 号 的 大 于 大 于<br />

LE 有 符 号 的 小 于 或 等 于 小 于 或 等 于 , 或 无 序 的<br />

AL 总 是 ( 通 常 省 略 ) 总 是 ( 通 常 省 略 )<br />

备 注<br />

最 后 更 新 CPSR 中 的 标 志 的 指 令 类 型 确 定 条 件 码 的 含 义 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 6-9


向 量 浮 点 编 程<br />

6.5 VFP 系 统 寄 存 器<br />

在 执 行 所 有 VFP 时 , 可 以 使 用 三 个 VFP 系 统 寄 存 器 :<br />

• FPSCR, 浮 点 状 态 和 控 制 寄 存 器 ;<br />

• 第 6-12 页 的 FPEXC, 浮 点 异 常 寄 存 器 ;<br />

• 第 6-12 页 的 FPSID, 浮 点 系 统 标 识 寄 存 器 。<br />

一 个 特 别 实 现 的 VFP 可 以 拥 有 附 加 的 寄 存 器 ( 参 阅 所 用 的 VFP 协 处 理 器 的 技 术<br />

参 考 手 册 )。<br />

6.5.1 FPSCR, 浮 点 状 态 和 控 制 寄 存 器<br />

FPSCR 包 含 所 有 用 户 级 VFP 状 态 和 控 制 位 :<br />

[31:28] 位 是 N、Z、C 和 V 标 志 。 这 些 是 VFP 状 态 标 志 。 在 将 其 拷 贝 到 CPSR<br />

中 的 状 态 标 志 之 后 , 才 能 用 于 控 制 条 件 执 行 ( 参 阅 第 6-8 页 的 VFP<br />

和 条 件 码 )。<br />

[24] 位 是 清 零 模 式 控 制 位 :<br />

0 禁 用 清 零 模 式 。<br />

1 启 用 清 零 模 式 。<br />

根 据 所 用 的 硬 件 和 软 件 , 清 零 模 式 能 以 范 围 损 失 作 为 代 价 , 提 供 更<br />

高 的 性 能 ( 参 阅 第 6-13 页 的 清 零 模 式 )。<br />

备 注<br />

当 要 求 兼 容 IEEE 754 时 , 不 得 使 用 清 零 模 式 。<br />

[23:22] 位 按 如 下 方 式 控 制 舍 入 模 式 :<br />

0b00 舍 入 到 最 接 近 的 数 (RN) 模 式 ;<br />

0b01 向 正 无 穷 大 舍 入 (RP) 模 式 ;<br />

0b10 向 负 无 穷 大 舍 入 (RM) 模 式 ;<br />

0b11 向 零 舍 入 (RZ) 模 式 。<br />

[21:20] 位 STRIDE 是 向 量 中 的 连 续 值 之 间 的 距 离 ( 参 阅 第 6-6 页 的 向 量 )。 跨<br />

度 的 控 制 方 式 如 下 :<br />

0b00 跨 度 = 1 ;<br />

0b11 跨 度 = 2。<br />

6-10 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


向 量 浮 点 编 程<br />

[18:16] 位 LEN 是 每 个 向 量 所 用 的 寄 存 器 数 目 ( 参 阅 第 6-6 页 的 向 量 )。 其 值 是<br />

1 + [18:16] 位 的 值 :<br />

0b000 LEN = 1 ;<br />

.<br />

.<br />

0b111 LEN = 8。<br />

[12:8] 位 是 异 常 捕 获 启 用 位 :<br />

IXE 启 用 不 精 确 的 异 常 ;<br />

UFE 启 用 下 溢 异 常 ;<br />

OFE 启 用 溢 出 异 常 ;<br />

DZE 启 用 除 零 异 常 ;<br />

IOE 启 用 无 效 运 算 异 常 。<br />

本 指 南 不 涉 及 浮 点 异 常 捕 获 的 用 法 。 有 关 的 信 息 请 参 阅 所 用 的 VFP<br />

协 处 理 器 的 技 术 参 考 手 册 。<br />

[4:0] 位 是 累 积 异 常 位 :<br />

IXC 不 精 确 的 异 常 ;<br />

UFC 下 溢 异 常 ;<br />

OFC 溢 出 异 常 ;<br />

DZC 除 零 异 常 ;<br />

IOC 无 效 运 算 异 常 。<br />

当 发 生 相 应 的 异 常 时 , 将 设 置 累 加 异 常 位 。 只 有 在 直 接 写 到 FPSCR<br />

中 来 加 以 清 除 之 后 , 才 会 清 除 累 加 异 常 位 。<br />

其 它 所 有 位 在 基 本 VFP 规 范 中 未 使 用 。 它 们 可 以 用 在 特 殊 的 实 现 中 ( 参 阅 所<br />

用 的 VFP 协 处 理 器 的 技 术 参 考 手 册 )。 除 了 遵 照 特 殊 实 现 中 的 所 有<br />

用 法 外 , 不 要 修 改 这 些 位 。<br />

如 要 改 变 某 些 位 而 不 影 响 其 它 位 , 请 使 用 读 、 改 、 写 过 程 ( 参 阅 第 6-12 页 的 修<br />

改 VFP 系 统 寄 存 器 的 个 别 位 )。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 6-11


向 量 浮 点 编 程<br />

6.5.2 FPEXC, 浮 点 异 常 寄 存 器<br />

只 能 在 特 权 模 式 下 访 问 FPEXC。 其 包 含 下 列 位 :<br />

[31] 位 是 EX 位 。 可 以 在 所 有 VFP 实 现 中 读 取 它 。 在 有 些 实 现 中 , 也 可 能<br />

写 到 该 位 上 。<br />

如 果 该 值 是 0, 那 么 VFP 系 统 中 的 仅 有 的 重 要 状 态 , 是 通 用 寄 存 器<br />

加 上 FPSCR 和 FPEXC 的 内 容 。<br />

如 果 该 值 是 1, 则 需 要 与 执 行 相 关 的 信 息 来 保 存 状 态 ( 参 阅 所 用 的<br />

VFP 协 处 理 器 的 技 术 参 考 手 册 )。<br />

[30] 位 是 EN 位 。 可 以 在 所 有 VFP 实 现 中 读 、 写 它 。<br />

如 果 该 值 是 1, 则 启 用 VFP 协 处 理 器 并 正 常 操 作 。<br />

如 果 该 值 是 0, 则 禁 用 VFP 协 处 理 器 。 当 协 处 理 器 被 禁 用 时 , 可 以<br />

读 或 写 FPSID 或 FPEXC 寄 存 器 , 但 会 将 其 它 VFP 指 令 作 为 未 定 义 的<br />

指 令 来 处 理 。<br />

[29:0] 位 可 以 由 VFP 的 特 定 实 现 所 用 。 可 以 使 用 本 章 介 绍 的 所 有 VFP 功 能<br />

而 无 需 访 问 这 些 位 。<br />

除 了 遵 照 特 殊 实 现 中 的 所 有 用 法 外 , 不 要 修 改 这 些 位 ( 参 阅 所 用 的<br />

VFP 协 处 理 器 的 技 术 参 考 手 册 )。<br />

如 要 改 变 某 些 位 而 不 影 响 其 它 位 , 请 使 用 读 、 改 、 写 过 程 ( 参 阅 修 改 VFP 系 统<br />

寄 存 器 的 个 别 位 )。<br />

6.5.3 FPSID, 浮 点 系 统 标 识 寄 存 器<br />

FPSID 是 一 个 只 读 寄 存 器 。 可 以 读 取 它 来 确 定 程 序 运 行 在 VFP 体 系 结 构 的 哪 一 个<br />

实 现 版 本 上 。<br />

6.5.4 修 改 VFP 系 统 寄 存 器 的 个 别 位<br />

如 要 改 变 一 个 VFP 系 统 寄 存 器 的 某 些 位 而 不 影 响 其 它 位 , 可 使 用 与 下 例 类 似 的<br />

读 、 改 、 写 过 程 :<br />

FMRX r10,FPSCR ; copy FPSCR into r10<br />

BIC r10,r10,#0x00370000 ; clears STRIDE and LEN<br />

ORR r10,r10,#0x00030000 ; sets STRIDE = 1, LEN = 4<br />

FMXR FPSCR,r10 ; copy r10 back into FPSCR<br />

请 参 阅 第 6-31 页 的 FMRX、 FMXR 和 FMSTAT。<br />

6-12 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


向 量 浮 点 编 程<br />

6.6 清 零 模 式<br />

VFP 的 某 些 实 现 版 本 使 用 支 持 代 码 来 处 理 非 标 准 数 。 在 涉 及 非 标 准 数 的 计 算 中 ,<br />

这 种 系 统 的 性 能 比 其 在 常 规 计 算 中 的 性 能 低 得 多 。<br />

清 零 模 式 用 +0 替 代 非 标 准 数 。 这 一 点 不 符 合 IEEE 754 算 法 , 但 在 某 些 情 况 下 可<br />

大 大 改 进 性 能 。<br />

6.6.1 何 时 使 用 清 零 模 式<br />

如 果 下 面 所 有 各 条 件 都 满 足 , 则 应 选 择 清 零 模 式 :<br />

• 对 系 统 没 有 IEEE 754 兼 容 性 要 求 ;<br />

• 正 在 使 用 的 算 法 有 时 会 产 生 非 标 准 数 ;<br />

• 系 统 使 用 支 持 代 码 来 处 理 非 标 准 数 ;<br />

• 正 在 使 用 的 算 法 不 依 赖 于 其 对 非 标 准 数 的 保 存 精 度 ;<br />

• 正 在 使 用 的 算 法 不 会 因 用 +0 替 换 非 标 准 数 而 产 生 常 见 异 常 。<br />

如 果 不 同 部 分 的 代 码 有 不 同 的 要 求 , 可 以 随 时 在 清 零 模 式 和 正 常 模 式 之 间 转 换 。<br />

已 经 在 寄 存 器 中 的 数 不 受 改 变 的 模 式 的 影 响 。<br />

6.6.2 使 用 清 零 模 式 的 影 响<br />

对 于 某 些 异 常 ( 参 阅 第 6-14 页 的 运 算 不 受 清 零 模 式 的 影 响 ), 清 零 模 式 对 浮 点<br />

运 算 有 下 列 影 响 :<br />

• 当 将 非 标 准 数 用 作 浮 点 运 算 的 输 入 时 , 将 其 当 作 +0 来 处 理 。 源 寄 存 器 不<br />

改 变 ;<br />

• 如 果 在 舍 入 之 前 , 一 个 单 精 度 浮 点 运 算 的 结 果 是 在 –2 –126 到 +2 –126 的 范 围<br />

内 , 则 用 +0 替 换 它 ;<br />

• 如 果 在 舍 入 之 前 , 一 个 双 精 度 浮 点 运 算 的 结 果 是 在 –2 –1022 到 +2 –1022 的 范<br />

围 内 , 则 用 +0 替 换 它 。<br />

当 将 非 标 准 数 用 作 一 个 操 作 数 , 或 将 一 个 结 果 刷 新 为 零 时 , 将 发 生 一 个 不 精 确 异<br />

常 。 在 清 零 模 式 下 不 发 生 下 溢 异 常 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 6-13


向 量 浮 点 编 程<br />

6.6.3 运 算 不 受 清 零 模 式 的 影 响<br />

即 使 在 清 零 模 式 下 , 也 可 以 对 非 标 准 数 执 行 下 列 运 算 , 而 不 必 将 结 果 清 除 为 零 :<br />

• 复 制 、 绝 对 值 和 求 反 ( 参 阅 第 6-16 页 的 FABS、 FCPY 和 FNEG);<br />

• 装 载 和 存 储 ( 参 阅 第 6-22 页 的 FLD 和 FST);<br />

• 装 载 多 个 和 存 储 多 个 ( 参 阅 第 6-24 页 的 FLDM 和 FSTM);<br />

• 在 浮 点 寄 存 器 和 <strong>ARM</strong> 通 用 寄 存 器 之 间 的 传 送 ( 参 阅 第 6-27 页 的 FMDRR<br />

和 FMRRD 和 第 6-30 页 的 FMRRS 和 FMSRR)。<br />

6-14 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


向 量 浮 点 编 程<br />

6.7 VFP 指 令<br />

本 节 包 含 下 列 各 个 小 节 :<br />

• 第 6-16 页 的 FABS、FCPY 和 FNEG<br />

浮 点 绝 对 值 、 复 制 和 求 反 值 。<br />

• 第 6-17 页 的 FADD 和 FSUB<br />

浮 点 加 法 和 减 法 。<br />

• 第 6-18 页 的 FCMP<br />

浮 点 比 较 。<br />

• 第 6-19 页 的 FCVTDS<br />

将 单 精 度 浮 点 数 转 换 为 双 精 度 浮 点 数 。<br />

• 第 6-20 页 的 FCVTSD<br />

将 双 精 度 浮 点 数 转 换 为 单 精 度 浮 点 数 。<br />

• 第 6-21 页 的 FDIV<br />

浮 点 除 法 。<br />

• 第 6-22 页 的 FLD 和 FST<br />

浮 点 装 载 和 存 储 。<br />

• 第 6-24 页 的 FLDM 和 FSTM<br />

浮 点 装 载 多 个 和 存 储 多 个 。<br />

• 第 6-26 页 的 FMAC、FNMAC、FMSC 和 FNMSC<br />

浮 点 乘 加 指 令 。<br />

• 第 6-27 页 的 FMDRR 和 FMRRD<br />

在 <strong>ARM</strong> 寄 存 器 和 双 精 度 浮 点 寄 存 器 之 间 传 送 内 容 。<br />

• 第 6-30 页 的 FMRRS 和 FMSRR<br />

在 单 精 度 浮 点 寄 存 器 和 <strong>ARM</strong> 寄 存 器 之 间 传 送 内 容 。<br />

• 第 6-31 页 的 FMRX、FMXR 和 FMSTAT<br />

在 <strong>ARM</strong> 寄 存 器 和 VFP 系 统 寄 存 器 之 间 传 送 内 容 。<br />

• 第 6-32 页 的 FMUL 和 FNMUL<br />

浮 点 乘 法 和 求 反 乘 法 。<br />

• 第 6-33 页 的 FSITO 和 FUITO<br />

将 有 符 号 整 数 转 换 为 浮 点 数 以 及 将 无 符 号 整 数 转 换 为 浮 点 数 。<br />

• 第 6-34 页 的 FSQRT<br />

浮 点 数 平 方 根 。<br />

• 第 6-35 页 的 FTOSI 和 FTOUI<br />

将 浮 点 数 转 换 为 有 符 号 整 数 以 及 将 浮 点 数 转 换 为 无 符 号 整 数 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 6-15


向 量 浮 点 编 程<br />

6.7.1 FABS、 FCPY 和 FNEG<br />

浮 点 复 制 、 绝 对 值 和 求 反 。<br />

这 些 指 令 可 以 是 标 量 、 向 量 或 混 合 运 算 ( 参 阅 第 6-7 页 的 向 量 和 标 量 运 算 )。<br />

语 法<br />

{cond} Fd, Fm<br />

其 中 :<br />

必 须 是 FCPY、 FABS 或 FNEG 之 一 。<br />

对 于 单 精 度 必 须 是 S, 对 于 双 精 度 必 须 是 D。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 6-8 页 的 VFP 和 条 件 码 )。<br />

Fd 是 用 于 存 放 结 果 的 VFP 寄 存 器 。<br />

Fm 是 存 放 操 作 数 的 VFP 寄 存 器 。<br />

Fd 和 Fm 的 精 度 必 须 与 中 指 定 的 精 度 相 同 。<br />

用 法<br />

FCPY 指 令 将 Fm 的 内 容 复 制 到 Fd 中 。<br />

FABS 指 令 取 Fm 的 内 容 , 清 除 符 号 位 , 并 将 结 果 放 到 Fd 中 。 这 样 就 得 到 绝 对 值 。<br />

FENG 指 令 取 Fm 的 内 容 , 改 变 符 号 位 , 并 将 结 果 放 到 Fd 中 。 这 样 就 得 到 与 该 值 符<br />

号 相 反 的 值 。<br />

如 果 操 作 数 是 一 个 非 数 字 , 则 按 以 上 各 种 情 形 确 定 符 号 位 , 但 不 产 生 异 常 。<br />

异 常<br />

这 些 指 令 都 不 会 产 生 异 常 。<br />

示 例<br />

FABSD d3, d5<br />

FNEGSMI s15, s15<br />

6-16 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


向 量 浮 点 编 程<br />

6.7.2 FADD 和 FSUB<br />

浮 点 加 法 和 减 法 。<br />

FADD 和 FSUB 指 令 可 以 是 标 量 、 向 量 或 混 合 运 算 ( 参 阅 第 6-7 页 的 向 量 和 标 量<br />

运 算 )。<br />

语 法<br />

FADD{cond} Fd, Fn, Fm<br />

FSUB{cond} Fd, Fn, Fm<br />

其 中 :<br />

对 于 单 精 度 必 须 是 S, 对 于 双 精 度 必 须 是 D。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 6-8 页 的 VFP 和 条 件 码 )。<br />

Fd 是 用 于 存 放 结 果 的 VFP 寄 存 器 。<br />

Fn 是 存 放 第 一 个 操 作 数 的 VFP 寄 存 器 。<br />

Fm 是 存 放 第 二 个 操 作 数 的 VFP 寄 存 器 。<br />

Fd、 Fn 和 Fm 的 精 度 必 须 与 中 指 定 的 精 度 相 同 。<br />

用 法<br />

FADD 指 令 将 Fn 和 Fm 中 的 值 相 加 , 并 将 结 果 存 放 到 Fd 中 。<br />

FSUB 指 令 将 Fn 的 值 减 去 Fm 中 的 值 , 并 将 结 果 存 放 到 Fd 中 。<br />

异 常<br />

FADD 和 FSUB 指 令 会 产 生 “ 无 效 运 算 ”、“ 溢 出 ” 或 “ 不 精 确 ” 异 常 。<br />

示 例<br />

FSUBSEQ<br />

FADDDGT<br />

FSUBD<br />

s2, s4, s17<br />

d4, d0, d12<br />

d0, d0, d12<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 6-17


向 量 浮 点 编 程<br />

6.7.3 FCMP<br />

浮 点 比 较 。<br />

FCMP 总 是 操 作 标 量 。<br />

语 法<br />

FCMP{E}{cond} Fd, Fm<br />

FCMP{E}Z{cond} Fd<br />

其 中 :<br />

E<br />

是 一 个 可 选 的 参 数 。 如 果 存 在 E, 那 么 , 如 果 一 个 操 作 数 是 任 一 种<br />

“ 非 数 字 ” 类 型 , 则 会 产 生 异 常 。 否 则 , 仅 当 一 个 操 作 数 是 信 号 化<br />

“ 非 数 字 ” 时 才 会 产 生 异 常 。<br />

Z 是 指 定 与 零 进 行 比 较 的 一 个 参 数 。<br />

对 于 单 精 度 必 须 是 S, 对 于 双 精 度 必 须 是 D。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 6-8 页 的 VFP 和 条 件 码 )。<br />

Fd 是 存 放 第 一 个 操 作 数 的 VFP 寄 存 器 。<br />

Fm<br />

是 存 放 第 二 个 操 作 数 的 VFP 寄 存 器 。 对 于 与 零 比 较 的 指 令 , 可 省<br />

略 Fm。<br />

Fd 和 Fm 的 精 度 必 须 与 中 指 定 的 精 度 相 同 。<br />

用 法<br />

FCMP 指 令 将 Fd 中 的 值 减 去 Fm 中 的 值 , 并 设 置 结 果 的 VFP 标 志 ( 参 阅 第 6-8 页<br />

的 VFP 和 条 件 码 )。<br />

异 常<br />

FCMP 会 产 生 “ 无 效 运 算 ” 异 常 。<br />

示 例<br />

FCMPS<br />

FCMPEDNE<br />

FCMPZSEQ<br />

s3, s0<br />

d5, d13<br />

s2<br />

6-18 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


向 量 浮 点 编 程<br />

6.7.4 FCVTDS<br />

将 单 精 度 浮 点 数 转 换 为 双 精 度 浮 点 数 。<br />

FCVTDS 总 是 标 量 。<br />

语 法<br />

FCVTDS{cond} Dd, Sm<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 6-8 页 的 VFP 和 条 件 码 )。<br />

Dd 是 用 于 存 放 结 果 的 双 精 度 VFP 寄 存 器 。<br />

Sm 是 用 于 存 放 操 作 数 的 单 精 度 VFP 寄 存 器 。<br />

用 法<br />

FCVTDS 指 令 将 Sm 中 的 单 精 度 值 转 换 为 双 精 度 值 , 并 将 结 果 放 到 Dd 中 。<br />

异 常<br />

FCVTDS 会 产 生 “ 无 效 运 算 ” 异 常 。<br />

示 例<br />

FCVTDS<br />

FCVTDSGT<br />

d5, s7<br />

d0, s4<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 6-19


向 量 浮 点 编 程<br />

6.7.5 FCVTSD<br />

将 双 精 度 浮 点 数 转 换 为 单 精 度 浮 点 数 。<br />

FCVTSD 总 是 标 量 。<br />

语 法<br />

FCVTSD{cond} Sd, Dm<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 6-8 页 的 VFP 和 条 件 码 )。<br />

Sd 是 用 于 存 放 结 果 的 单 精 度 VFP 寄 存 器 。<br />

Dm 是 用 于 存 放 操 作 数 的 双 精 度 VFP 寄 存 器 。<br />

用 法<br />

FCVTSD 指 令 将 Dm 中 的 双 精 度 值 转 换 为 单 精 度 值 , 并 将 结 果 放 到 Sd 中 。<br />

异 常<br />

FCVTSD 指 令 会 产 生 “ 无 效 运 算 ”、“ 溢 出 ”、“ 下 溢 ” 或 “ 不 精 确 ” 异 常 。<br />

示 例<br />

FCVTSD<br />

FCVTSDMI<br />

s3, d14<br />

s0, d1<br />

6-20 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


向 量 浮 点 编 程<br />

6.7.6 FDIV<br />

浮 点 除 法 。FDIV 可 以 是 标 量 、 向 量 或 混 合 型 ( 参 阅 第 6-7 页 的 向 量 和 标 量 运 算 )。<br />

语 法<br />

FDIV{cond} Fd, Fn, Fm<br />

其 中 :<br />

对 于 单 精 度 必 须 是 S, 对 于 双 精 度 必 须 是 D。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 6-8 页 的 VFP 和 条 件 码 )。<br />

Fd 是 用 于 存 放 结 果 的 VFP 寄 存 器 。<br />

Fn 是 存 放 第 一 个 操 作 数 的 VFP 寄 存 器 。<br />

Fm 是 存 放 第 二 个 操 作 数 的 VFP 寄 存 器 。<br />

Fd、 Fn 和 Fm 的 精 度 必 须 与 中 指 定 的 精 度 相 同 。<br />

用 法<br />

FDIV 指 令 将 Fn 的 值 除 以 Fm 中 的 值 , 并 将 结 果 存 放 到 Fd 中 。<br />

异 常<br />

FDIV 运 算 会 产 生 “ 除 零 ”、“ 无 效 运 算 ”、“ 溢 出 ”、 或 “ 不 精 确 ” 异 常 。<br />

示 例<br />

FDIVS<br />

FDIVSNE<br />

FDIVD<br />

s8, s0, s12<br />

s2, s27, s28<br />

d10, d2, d10<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 6-21


向 量 浮 点 编 程<br />

6.7.7 FLD 和 FST<br />

浮 点 装 载 和 存 储 。<br />

语 法<br />

FLD{cond} Fd, [Rn{, #offset}]<br />

FST{cond} Fd, [Rn{, #offset}]<br />

FLD{cond} Fd, label<br />

FST{cond} Fd, label<br />

其 中 :<br />

对 于 单 精 度 必 须 是 S, 对 于 双 精 度 必 须 是 D。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 6-8 页 的 VFP 和 条 件 码 )。<br />

Fd 是 要 装 载 或 存 储 的 VFP 寄 存 器 。 Fd 的 精 度 必 须 与 中 指<br />

定 的 精 度 相 同 。<br />

Rn 是 存 放 要 传 送 的 基 址 的 <strong>ARM</strong> 寄 存 器 。<br />

offset 是 一 个 可 选 的 数 值 表 达 式 。 在 汇 编 时 其 值 必 须 等 于 一 个 数 字 常 数 。<br />

该 值 必 须 是 4 的 一 个 倍 数 , 并 且 位 于 –1020 到 +1020 的 范 围 内 。 该<br />

值 被 加 到 基 址 上 以 构 成 传 送 的 地 址 。<br />

label<br />

是 一 个 与 程 序 相 关 的 表 达 式 。 有 关 详 细 信 息 请 参 阅 第 3-23 页 的 与<br />

寄 存 器 相 关 和 与 程 序 相 关 的 表 达 式 。<br />

label 必 须 位 于 当 前 指 令 的 ±1KB 范 围 内 。<br />

用 法<br />

FLD 指 令 从 存 储 器 中 装 载 浮 点 寄 存 器 。 FST 指 令 将 一 个 浮 点 寄 存 器 的 内 容 存 储 到<br />

存 储 器 中 。<br />

如 果 被 设 置 为 S, 则 传 送 一 个 字 。 如 果 被 设 置 为 D, 则 传<br />

送 两 个 字 。<br />

还 有 一 个 FLD 伪 指 令 ( 参 阅 第 6-36 页 的 FLD 伪 指 令 )。<br />

示 例<br />

FLDD d5, [r7, #-12]<br />

FLDSNE s3, [r2, #72+count]<br />

6-22 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


向 量 浮 点 编 程<br />

FSTS<br />

FLDD<br />

FLDS<br />

s2, [r5]<br />

d2, [r15, #addr-{PC}]<br />

s9, fpconst<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 6-23


向 量 浮 点 编 程<br />

6.7.8 FLDM 和 FSTM<br />

浮 点 装 载 多 个 和 存 储 多 个 。<br />

语 法<br />

FLDM{cond} Rn,{!} VFPregisters<br />

FSTM{cond} Rn,{!} VFPregisters<br />

其 中 :<br />

必 须 是 下 面 几 个 值 之 一 :<br />

IA 表 示 在 每 次 传 送 后 增 加 地 址 。<br />

DB 表 示 在 每 次 传 送 后 减 小 地 址 。<br />

EA 表 示 空 的 升 序 栈 操 作 。 对 于 装 载 , 这 与 DB 相 同 , 对<br />

于 存 储 , 则 与 IA 相 同 。<br />

FD 表 示 完 全 的 降 序 栈 操 作 。 对 于 装 载 , 这 与 IA 相 同 ,<br />

对 于 存 储 , 则 与 DB 相 同 。<br />

必 须 是 下 面 几 个 值 之 一 :<br />

S 对 于 单 精 度 ;<br />

D. 对 于 双 精 度 ;<br />

X. 对 于 未 指 定 的 精 度 。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 6-8 页 的 VFP 和 条 件 码 )。<br />

Rn 是 存 放 要 传 送 的 基 址 的 <strong>ARM</strong> 寄 存 器 。<br />

! 是 可 选 的 。 ! 指 定 更 新 后 的 基 址 必 须 写 回 到 Rn 中 。<br />

备 注<br />

如 果 未 指 定 ! , 则 必 须 是 IA。<br />

VFPregisters<br />

是 包 含 在 花 括 号 { 和 } 内 的 连 续 浮 点 寄 存 器 的 一 个 列 表 。 该<br />

列 表 必 须 是 用 逗 号 分 隔 的 , 或 者 采 用 范 围 格 式 。 列 表 中 必 须<br />

至 少 有 一 个 寄 存 器 。<br />

6-24 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


向 量 浮 点 编 程<br />

用 法<br />

FLDM 指 令 从 存 储 器 中 装 载 几 个 连 续 的 浮 点 寄 存 器 。<br />

FSTM 指 令 将 几 个 连 续 的 浮 点 寄 存 器 的 内 容 存 储 到 存 储 器 中 。<br />

如 果 指 定 为 D, 则 VFPregisters 必 须 是 双 精 度 寄 存 器 的 列 表 , 并 且 为<br />

该 列 表 中 的 每 个 寄 存 器 传 送 两 个 字 。<br />

如 果 指 定 为 S, 则 VFPregisters 必 须 是 单 精 度 寄 存 器 的 列 表 , 并 且 为<br />

该 列 表 中 的 每 个 寄 存 器 传 送 一 个 字 。<br />

未 指 定 的 精 度<br />

如 果 指 定 为 X, 那 么 必 须 将 VFPregisters 指 定 为 双 精 度 寄 存 器 。 但 是 ,<br />

任 何 或 所 有 指 定 的 双 精 度 寄 存 器 实 际 上 都 可 包 含 两 个 单 精 度 数 值 或 整 数 。<br />

传 送 的 字 数 可 以 是 2n 或 (2n + 1), 此 处 n 是 列 表 中 的 双 精 度 寄 存 器 数 。 这 将 取 决<br />

于 执 行 结 果 。 但 是 , 如 果 指 定 了 回 写 , 那 么 Rn 总 是 被 调 整 (2n + 1) 个 字 。<br />

必 须 只 以 配 对 方 式 使 用 未 指 定 精 度 的 装 载 和 存 储 , 来 存 储 和 还 原 数 据 。 所 存 储 数<br />

据 的 格 式 依 赖 于 执 行 结 果 。<br />

示 例<br />

FLDMIAS r2, {s1-s5}<br />

FSTMFDD r13!, {d3-d6}<br />

FSTMIAS r0!, {s31}<br />

下 列 指 令 是 等 价 的 :<br />

FLDMIAS r7, {s3-s7}<br />

FLDMIAS r7, {s3,s4,s5,s6,s7}<br />

下 列 指 令 必 须 始 终 配 对 使 用 :<br />

FSTMFDX r13!, {d0-d3}<br />

FLDMFDX r13!, {d0-d3}<br />

下 列 指 令 是 非 法 的 , 因 为 列 表 中 的 寄 存 器 不 是 连 续 的 :<br />

FLDMIAD r13!, {d0,d2,d3}<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 6-25


向 量 浮 点 编 程<br />

6.7.9 FMAC、 FNMAC、 FMSC 和 FNMSC<br />

浮 点 乘 加 、 求 反 乘 加 、 乘 减 和 求 反 乘 减 。 这 些 指 令 可 以 是 标 量 、 向 量 或 混 合 型<br />

( 参 阅 第 6-7 页 的 向 量 和 标 量 运 算 )。<br />

语 法<br />

{cond} Fd, Fn, Fm<br />

其 中 :<br />

必 须 是 FMAC、 FNMAC、 FMSC 或 FNMSC 之 一 。<br />

对 于 单 精 度 必 须 是 S, 对 于 双 精 度 必 须 是 D。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 6-8 页 的 VFP 和 条 件 码 )。<br />

Fd 是 用 于 存 放 结 果 的 VFP 寄 存 器 。<br />

Fn 是 存 放 第 一 个 操 作 数 的 VFP 寄 存 器 。<br />

Fm 是 存 放 第 二 个 操 作 数 的 VFP 寄 存 器 。<br />

Fd、 Fn 和 Fm 的 精 度 必 须 与 中 指 定 的 精 度 相 同 。<br />

用 法<br />

FMAC 指 令 计 算 Fd + Fn * Fm, 并 将 结 果 存 放 到 Fd 中 。<br />

FNMAC 指 令 计 算 Fd – Fn * Fm, 并 将 结 果 存 放 到 Fd 中 。<br />

FMSC 指 令 计 算 –Fd +Fn * Fm, 并 将 结 果 存 放 到 Fd 中 。<br />

FNMSC 指 令 计 算 –Fd – Fn * Fm, 并 将 结 果 存 放 到 Fd 中 。<br />

异 常<br />

这 些 运 算 会 产 生 “ 无 效 运 算 ”、“ 溢 出 ”、“ 下 溢 ” 或 “ 不 精 确 ” 异 常 。<br />

示 例<br />

FMACD<br />

FMACS<br />

FNMSCSLE<br />

d8, d0, d8<br />

s20, s24, s28<br />

s6, s0, s26<br />

6-26 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


向 量 浮 点 编 程<br />

6.7.10 FMDRR 和 FMRRD<br />

在 两 个 <strong>ARM</strong> 寄 存 器 和 一 个 双 精 度 浮 点 寄 存 器 之 间 传 送 内 容 。<br />

语 法<br />

FMDRR{cond} Dn, Rd, Rn<br />

FMRRD{cond} Rd, Rn, Dn<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 6-8 页 的 VFP 和 条 件 码 )。<br />

Dn 是 VFP 双 精 度 寄 存 器 。<br />

Rd、 Rn 是 <strong>ARM</strong> 寄 存 器 。 不 要 使 用 r15。<br />

用 法<br />

FMDRR Dn, Rd, Rn 将 Rd 的 内 容 传 送 到 Dn 的 低 位 半 部 分 , 并 将 Rn 的 内 容 传 送 到 Dn<br />

的 高 位 半 部 分 。<br />

FMRRD Rd, Rn, Dn 指 令 将 Dn 的 低 位 半 部 分 的 内 容 传 送 到 Rd, 并 将 Dn 的 低 位 半 部 分<br />

的 内 容 传 送 到 Rn。<br />

异 常<br />

这 些 指 令 不 产 生 异 常 。<br />

体 系 结 构<br />

这 些 指 令 可 用 在 VFPv2 及 更 高 版 本 中 。<br />

示 例<br />

FMDRR d5, r3, r4<br />

FMRRDPL r12, r2, d2<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 6-27


向 量 浮 点 编 程<br />

6.7.11 FMDHR、 FMDLR、 FMRDH 和 FMRDL<br />

在 一 个 <strong>ARM</strong> 寄 存 器 和 半 个 双 精 度 浮 点 寄 存 器 之 间 传 送 内 容 。<br />

语 法<br />

FMDHR{cond} Dn, Rd<br />

FMDLR{cond} Dn, Rd<br />

FMRDH{cond} Rd, Dn<br />

FMRDL{cond} Rd, Dn<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 6-8 页 的 VFP 和 条 件 码 )。<br />

Dn 是 VFP 双 精 度 寄 存 器 。<br />

Rd 是 <strong>ARM</strong> 寄 存 器 。 Rd 不 能 是 r15。<br />

用 法<br />

下 面 这 些 指 令 配 对 使 用 :<br />

• FMDHR 与 FMDLR 一 起 使 用<br />

FMDHR 将 Rd 的 内 容 复 制 到 Dn 的 高 位 半 部 分<br />

FMDLR 将 Rd 的 内 容 复 制 到 Dn 的 低 位 半 部 分<br />

• FMRDH 与 FMRDL 一 起 使 用<br />

FMRDH 将 Dn 的 高 位 半 部 分 的 内 容 复 制 到 Rd 中<br />

FMRDL 将 Dn 的 低 位 半 部 分 的 内 容 复 制 到 Rd 中<br />

异 常<br />

这 些 指 令 不 产 生 异 常 。<br />

示 例<br />

FMDHR d5, r3<br />

FMDLR d5, r12<br />

FMRDH r5, d3<br />

FMRDL r9, d3<br />

FMDLRPL d2, r1<br />

6-28 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


向 量 浮 点 编 程<br />

6.7.12 FMRS 和 FMSR<br />

在 单 精 度 浮 点 寄 存 器 和 <strong>ARM</strong> 寄 存 器 之 间 传 送 内 容 。<br />

语 法<br />

FMRS{cond} Rd, Sn<br />

FMSR{cond} Sn, Rd<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 6-8 页 的 VFP 和 条 件 码 )。<br />

Sn 是 VFP 单 精 度 寄 存 器 。<br />

Rd 是 <strong>ARM</strong> 寄 存 器 。 Rd 不 能 是 r15。<br />

用 法<br />

FMRS 指 令 将 Sn 的 内 容 传 送 到 Fd 中 。<br />

FMSR 指 令 将 Rd 的 内 容 传 送 到 Sn 中 。<br />

异 常<br />

这 些 指 令 不 产 生 异 常 。<br />

示 例<br />

FMRS<br />

FMSRNE<br />

r2, s0<br />

s30, r5<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 6-29


向 量 浮 点 编 程<br />

6.7.13 FMRRS 和 FMSRR<br />

在 两 个 单 精 度 浮 点 寄 存 器 和 两 个 <strong>ARM</strong> 寄 存 器 之 间 传 送 内 容 。<br />

语 法<br />

FMRRS{cond} Rd, Rn, {Sn,Sm}<br />

FMSRR{cond} {Sn,Sm}, Rd, Rn<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 6-8 页 的 VFP 和 条 件 码 )。<br />

Sn°¢Sm 是 两 个 连 续 的 VFP 单 精 度 寄 存 器 。<br />

Rd°¢Rn 是 <strong>ARM</strong> 寄 存 器 。 不 要 使 用 r15。<br />

用 法<br />

FMRRS 指 令 将 Sn 的 内 容 传 送 到 Rd 中 , 并 将 Sm 的 内 容 传 送 到 Rn 中 。<br />

FMSRR 指 令 将 Rd 的 内 容 传 送 到 Sn 中 , 并 将 Rn 的 内 容 传 送 到 Sm 中 。<br />

异 常<br />

这 些 指 令 不 产 生 异 常 。<br />

体 系 结 构<br />

这 些 指 令 可 用 在 VFPv2 及 更 高 版 本 中 。<br />

示 例<br />

FMRRS<br />

FMSRRNE<br />

r2, r3, {s0,s1}<br />

{s27,s28}, r5, r2<br />

不 正 确 的 示 例<br />

FMRRS r2, r3, {s2,s4} ; VFP registers must be consecutive<br />

FMSRR {s5,s6}, r15, r0 ; you must not use r15<br />

6-30 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


向 量 浮 点 编 程<br />

6.7.14 FMRX、 FMXR 和 FMSTAT<br />

在 <strong>ARM</strong> 寄 存 器 和 VFP 系 统 寄 存 器 之 间 传 送 内 容 。<br />

语 法<br />

FMRX{cond} Rd, VFPsysreg<br />

FMXR{cond} VFPsysreg, Rd<br />

FMSTAT{cond}<br />

其 中 :<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 6-8 页 的 VFP 和 条 件 码 )。<br />

VFPsysreg 是 VFP 系 统 寄 存 器 , 通 常 是 FPSCR、 FPSID 或 FPEXC ( 请 参 阅 第 6-5<br />

页 的 浮 点 寄 存 器 )。<br />

Rd 是 <strong>ARM</strong> 寄 存 器 。<br />

用 法<br />

FMRX 指 令 将 VFPsysreg 的 内 容 传 送 到 Fd 中 。<br />

FMXR 指 令 将 Rd 的 内 容 传 送 到 VFPsysreg 中 。<br />

FMSTAT 指 令 是 FMRX r15, FPSCR 的 同 义 字 。 该 指 令 将 浮 点 条 件 标 志 传 送 到 <strong>ARM</strong><br />

CPSR 中 的 相 应 标 志 中 ( 参 阅 第 6-8 页 的 VFP 和 条 件 码 )。<br />

备 注<br />

这 些 指 令 使 <strong>ARM</strong> 停 止 运 行 , 直 到 完 成 当 前 所 有 VFP 操 作 。<br />

异 常<br />

这 些 指 令 不 产 生 异 常 。<br />

示 例<br />

FMSTAT<br />

FMSTATNE<br />

FMXR<br />

FMRX<br />

FPSCR, r2<br />

r3, FPSID<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 6-31


向 量 浮 点 编 程<br />

6.7.15 FMUL 和 FNMUL<br />

浮 点 乘 法 和 求 反 乘 法 。 FMUL 和 FNMUL 指 令 可 以 是 标 量 、 向 量 或 混 合 型 ( 参 阅 第<br />

6-7 页 的 向 量 和 标 量 运 算 )。<br />

语 法<br />

FMUL{cond} Fd, Fn, Fm<br />

FNMUL{cond} Fd, Fn, Fm<br />

其 中 :<br />

对 于 单 精 度 必 须 是 S, 对 于 双 精 度 必 须 是 D。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 6-8 页 的 VFP 和 条 件 码 )。<br />

Fd 是 用 于 存 放 结 果 的 VFP 寄 存 器 。<br />

Fn 是 存 放 第 一 个 操 作 数 的 VFP 寄 存 器 。<br />

Fm 是 存 放 第 二 个 操 作 数 的 VFP 寄 存 器 。<br />

Fd、 Fn 和 Fm 的 精 度 必 须 与 中 指 定 的 精 度 相 同 。<br />

用 法<br />

FMUL 指 令 将 Fn 和 Fm 中 的 值 相 乘 , 并 将 结 果 存 放 到 Fd 中 。<br />

FNMUL 指 令 将 Fn 和 Fm 中 的 值 相 乘 , 并 将 结 果 的 反 号 值 存 放 到 Fd 中 。<br />

异 常<br />

FMUL 和 FNMUL 运 算 会 产 生 “ 无 效 运 算 ”、“ 溢 出 ”、“ 下 溢 ” 或 “ 不 精 确 ” 异 常 。<br />

示 例<br />

FNMULS<br />

FMULDLT<br />

s10, s10, s14<br />

d0, d7, d8<br />

6-32 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


向 量 浮 点 编 程<br />

6.7.16 FSITO 和 FUITO<br />

将 有 符 号 整 数 转 换 为 浮 点 数 以 及 将 无 符 号 整 数 转 换 为 浮 点 数 。<br />

FSITO 和 FUITO 总 是 操 作 标 量 。<br />

语 法<br />

FSITO{cond} Fd, Sm<br />

FUITO{cond} Fd, Sm<br />

其 中 :<br />

对 于 单 精 度 必 须 是 S, 对 于 双 精 度 必 须 是 D。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 6-8 页 的 VFP 和 条 件 码 )。<br />

Fd 是 用 于 存 放 结 果 的 VFP 寄 存 器 。 Fd 的 精 度 必 须 与 中 指<br />

定 的 精 度 相 同 。<br />

Sm 是 用 于 存 放 整 数 操 作 数 的 单 精 度 VFP 寄 存 器 。<br />

用 法<br />

FSITO 指 令 将 Sm 中 的 有 符 号 整 数 值 转 换 为 浮 点 值 , 并 将 结 果 放 到 Fd 中 。<br />

FUITO 指 令 将 Sm 中 的 无 符 号 整 数 值 转 换 为 浮 点 值 , 并 将 结 果 放 到 Fd 中 。<br />

异 常<br />

FSITOS 和 FUITOS 指 令 会 产 生 “ 不 精 确 ” 异 常 。<br />

FSITOD 和 FUITOD 指 令 不 产 生 任 何 异 常 。<br />

示 例<br />

FUITOD<br />

FSITOD<br />

FSITOSNE<br />

d3, s31 ; unsigned integer to double-precision<br />

d5, s16 ; signed integer to double-precision<br />

s2, s2 ; signed integer to single-precision<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 6-33


向 量 浮 点 编 程<br />

6.7.17 FSQRT<br />

浮 点 数 平 方 根 指 令 。 此 指 令 可 以 是 标 量 、 向 量 或 混 合 型 ( 参 阅 第 6-7 页 的 向 量 和<br />

标 量 运 算 )。<br />

语 法<br />

FSQRT{cond} Fd, Fm<br />

其 中 :<br />

对 于 单 精 度 必 须 是 S, 对 于 双 精 度 必 须 是 D。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 6-8 页 的 VFP 和 条 件 码 )。<br />

Fd 是 用 于 存 放 结 果 的 VFP 寄 存 器 。<br />

Fm 是 存 放 操 作 数 的 VFP 寄 存 器 。<br />

Fd 和 Fm 的 精 度 必 须 与 中 指 定 的 精 度 相 同 。<br />

用 法<br />

FSQRT 指 令 计 算 Fm 的 值 的 平 方 根 , 将 结 果 放 到 Fd 中 。<br />

异 常<br />

FSQRT 运 算 会 产 生 “ 无 效 运 算 ” 或 “ 不 精 确 ” 异 常 。<br />

示 例<br />

FSQRTS<br />

FSQRTD<br />

FSQRTSNE<br />

s4, s28<br />

d14, d6<br />

s15, s13<br />

6-34 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


向 量 浮 点 编 程<br />

6.7.18 FTOSI 和 FTOUI<br />

将 浮 点 数 转 换 为 有 符 号 整 数 以 及 将 浮 点 数 转 换 为 无 符 号 整 数 。<br />

FTOSI 和 FTOUI 总 是 标 量 。<br />

语 法<br />

FTOSI{Z}{cond} Sd, Fm<br />

FTOUI{Z}{cond} Sd, Fm<br />

其 中 :<br />

Z<br />

是 一 个 可 选 参 数 , 指 定 向 零 舍 入 。 如 果 指 定 了 该 参 数 , 其 将 覆 盖 当<br />

前 在 FPSCR 中 指 定 的 舍 入 模 式 。 FPSCR 不 变 。<br />

对 于 单 精 度 必 须 是 S, 对 于 双 精 度 必 须 是 D。<br />

cond 是 一 个 可 选 的 条 件 码 ( 参 阅 第 6-8 页 的 VFP 和 条 件 码 )。<br />

Sd 是 用 于 存 放 整 数 结 果 的 单 精 度 VFP 寄 存 器 。<br />

Fm<br />

用 法<br />

是 存 放 操 作 数 的 VFP 寄 存 器 。 Fm 的 精 度 必 须 与 中 指 定<br />

的 精 度 相 匹 配 。<br />

FTOSI 指 令 将 Fm 中 的 浮 点 值 转 换 为 有 符 号 整 数 , 并 将 结 果 放 到 Sd 中 。<br />

FTOUI 指 令 将 Fm 中 的 浮 点 值 转 换 为 无 符 号 整 数 , 并 将 结 果 放 到 Sd 中 。<br />

异 常<br />

FTOSI 和 FTOUI 指 令 会 产 生 “ 无 效 运 算 ” 或 “ 不 精 确 ” 异 常 。<br />

示 例<br />

FTOSID<br />

FTOUID<br />

FTOSIZS<br />

s10, d2<br />

s3, d1<br />

s3, s31<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 6-35


向 量 浮 点 编 程<br />

6.8 VFP 伪 指 令<br />

有 一 个 VFP 伪 指 令 。<br />

6.8.1 FLD 伪 指 令<br />

FLD 伪 指 令 用 一 个 单 精 度 或 双 精 度 浮 点 常 数 装 载 VFP 浮 点 寄 存 器 。<br />

备 注<br />

只 有 将 命 令 行 选 项 -fpu 设 置 为 vfp、softvfp+vfp、vfpv1、vfpv2 或 softvfp+vfpv2,<br />

才 能 使 用 FLD。<br />

本 节 仅 介 绍 FLD 伪 指 令 。 有 关 FLD 指 令 的 信 息 请 参 阅 第 6-22 页 的 FLD 和 FST。<br />

语 法<br />

FLD{cond} fp-register,=fp-literal<br />

其 中 :<br />

对 于 单 精 度 是 S, 对 于 双 精 度 是 D。<br />

cond 是 一 个 可 选 的 条 件 码 。<br />

fp-register 是 要 装 载 的 浮 点 寄 存 器 。<br />

fp-literal 是 一 个 单 精 度 或 双 精 度 浮 点 文 本 ( 参 阅 第 3-22 页 的 浮 点 文 本 )。<br />

用 法<br />

汇 编 程 序 将 常 数 放 在 文 字 池 中 , 并 产 生 一 个 相 对 程 序 的 FLD 指 令 来 从 文 字 池 中<br />

读 取 该 常 数 。 文 字 池 中 的 一 个 字 用 于 存 储 一 个 单 精 度 常 数 。 两 个 字 用 于 存 储 一 个<br />

双 精 度 常 数 。<br />

从 程 序 计 数 器 到 该 常 数 的 偏 移 必 须 小 于 1KB。 您 要 确 保 范 围 内 有 一 个 文 字 池 。 有<br />

关 详 细 信 息 请 参 阅 第 7-14 页 的 LTORG。<br />

6-36 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


向 量 浮 点 编 程<br />

示 例<br />

FLDD d1,=3.12E106 ; loads 3.12E106 into d1<br />

FLDS s31,=3.12E-16 ; loads 3.12E-16 into s31<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 6-37


向 量 浮 点 编 程<br />

6.9 VFP 命 令 和 向 量 记 号<br />

本 节 仅 适 用 于 armasm。C 和 C++ 编 译 器 中 的 内 联 汇 编 程 序 不 接 受 这 些 命 令 或 向 量<br />

记 号 。<br />

可 以 在 代 码 中 做 出 关 于 VFP 向 量 长 度 和 跨 度 的 声 明 , 并 让 汇 编 程 序 检 查 它 们 。<br />

请 参 阅 :<br />

• 第 6-39 页 的 VFPASSERT SCALAR ;<br />

• 第 6-40 页 的 VFPASSERT VECTOR。<br />

如 果 使 用 VFPASSERT 命 令 , 则 必 须 在 所 有 VFP 数 据 处 理 指 令 中 指 定 向 量 细 节 信<br />

息 。 向 量 记 号 描 述 如 下 。 如 果 不 使 用 VFPASSERT 命 令 , 则 不 能 使 用 此 向 量 记 号 。<br />

在 VFP 数 据 处 理 指 令 中 , 使 用 尖 括 号 指 定 VFP 寄 存 器 向 量 :<br />

sn 是 一 个 单 精 度 标 量 寄 存 ; 器 n ;<br />

sn 是 一 个 单 精 度 向 量 , 其 长 度 和 跨 度 由 当 前 向 量 长 度 和 跨 度 给 出 , 从 寄 存 器 n<br />

开 始 算 起 ;<br />

sn 是 一 个 单 精 度 向 量 , 长 度 为 L, 跨 度 为 1, 从 寄 存 器 n 开 始 算 起 ;<br />

sn 是 一 个 单 精 度 向 量 , 长 度 为 L, 跨 度 为 S, 从 寄 存 器 n 开 始 算 起 ;<br />

dn 是 一 个 双 精 度 标 量 寄 存 器 n ;<br />

dn 是 一 个 从 寄 存 器 n 开 始 的 双 精 度 向 量 , 其 长 度 和 跨 度 由 当 前 向 量 长 度 和 跨<br />

度 给 出 ;<br />

dn 是 一 个 双 精 度 向 量 , 长 度 为 L, 跨 度 为 1, 从 寄 存 器 n 开 始 算 起 ;<br />

dn 是 一 个 双 精 度 向 量 , 长 度 为 L, 跨 度 为 S, 从 寄 存 器 n 开 始 算 起 。<br />

可 以 将 此 向 量 记 号 与 用 DN 和 SN 命 令 定 义 的 名 称 一 起 使 用 ( 参 阅 第 7-11 页 的 DN<br />

和 SN)。<br />

不 能 在 DN 和 SN 命 令 内 部 使 用 此 向 量 记 号 。<br />

6-38 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


向 量 浮 点 编 程<br />

6.9.1 VFPASSERT SCALAR<br />

VFPASSERT SCALAR 命 令 指 示 汇 编 程 序 , 说 明 下 列 VFP 指 令 处 于 标 量 模 式 。<br />

语 法<br />

VFPASSERT SCALAR<br />

用 法<br />

使 用 VFPASSERT SCALAR 命 令 标 记 其 中 的 VFP 模 式 是 向 量 模 式 的 任 何 代 码 块 的 结 束 。<br />

将 VFPASSERT SCALAR 命 令 直 接 放 在 发 生 变 化 的 指 令 的 后 面 。 这 通 常 是 一 个 FMXR 指<br />

令 , 但 也 可 以 是 一 个 BL 指 令 。<br />

如 果 某 个 函 数 预 期 在 退 出 时 VFP 将 处 于 向 量 模 式 , 可 以 在 紧 靠 最 后 一 个 指 令 之<br />

后 放 一 个 VFPASSERT SCALAR 命 令 。 这 种 函 数 将 与 ATPCS 不 一 致 。 有 关 详 细 信 息 ,<br />

请 参 阅 <strong>RealView</strong> 编 译 工 具 2.0 版 开 发 者 指 南 中 的 使 用 程 序 调 用 标 准 一 章 。<br />

另 请 参 阅 :<br />

• 第 6-38 页 的 VFP 命 令 和 向 量 记 号 ;<br />

• 第 6-40 页 的 VFPASSERT VECTOR。<br />

备 注<br />

此 命 令 不 产 生 任 何 代 码 。 其 只 是 程 序 员 所 做 的 声 明 。 如 果 任 何 这 类 声 明 彼 此 不 一<br />

致 , 或 者 与 VFP 数 据 处 理 指 令 中 的 任 何 向 量 记 号 不 兼 容 , 那 么 汇 编 程 序 会 产 生<br />

出 错 信 息 。<br />

汇 编 程 序 将 VFPASSERT SCALAR 命 令 后 面 的 VFP 数 据 处 理 指 令 中 的 向 量 记 号 当 作 错<br />

误 来 处 理 , 即 使 该 向 量 的 长 度 为 1 ( 也 是 如 此 )。<br />

示 例<br />

VFPASSERT SCALAR ; scalar mode<br />

faddd d4, d4, d0 ; okay<br />

fadds s4, s0, s8 ; ERROR, vector in scalar mode<br />

fabss s24, s28 ; ERROR, vector in scalar mode<br />

; (even though length==1)<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 6-39


向 量 浮 点 编 程<br />

6.9.2 VFPASSERT VECTOR<br />

VFPASSERT VECTOR 命 令 指 示 汇 编 程 序 , 说 明 下 列 VFP 指 令 处 于 向 量 模 式 。 其 也 可<br />

指 定 向 量 的 长 度 和 跨 度 。<br />

语 法<br />

VFPASSERT VECTOR[]<br />

其 中 :<br />

n 是 向 量 的 长 度 , 取 1 到 8 之 间 的 值 。<br />

s 是 向 量 的 跨 度 , 取 1 到 2 之 间 的 值 。<br />

用 法<br />

使 用 VFPASSERT VECTOR 命 令 来 标 记 VFP 模 式 为 VECTOR 的 指 令 块 的 开 始 , 以 及 标 记<br />

向 量 的 长 度 和 跨 度 的 变 化 。<br />

将 VFPASSERT VECTOR 命 令 直 接 放 在 发 生 变 化 的 指 令 的 后 面 。 这 通 常 是 一 个 FMXR 指<br />

令 , 但 也 可 以 是 一 个 BL 指 令 。<br />

如 果 某 个 函 数 期 待 在 进 入 时 VFP 处 于 向 量 模 式 , 可 以 在 紧 靠 第 一 个 指 令 前 面 放<br />

一 个 VFPASSERT VECTOR 命 令 。 这 种 函 数 将 与 ATPCS 不 一 致 。 有 关 详 细 信 息 , 请 参<br />

阅 <strong>RealView</strong> 编 译 工 具 2.0 版 开 发 者 指 南 中 的 使 用 程 序 调 用 标 准 一 章 。<br />

请 参 阅 :<br />

• 第 6-38 页 的 VFP 命 令 和 向 量 记 号 ;<br />

• 第 6-39 页 的 VFPASSERT SCALAR。<br />

备 注<br />

此 命 令 不 产 生 任 何 代 码 。 其 只 是 程 序 员 所 做 的 声 明 。 如 果 任 何 这 类 声 明 彼 此 不 一<br />

致 , 或 者 与 VFP 数 据 处 理 指 令 中 的 任 何 向 量 记 号 不 兼 容 , 那 么 汇 编 程 序 会 产 生<br />

出 错 信 息 。<br />

6-40 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


向 量 浮 点 编 程<br />

示 例<br />

FMRX r10,FPSCR<br />

BIC r10,r10,#0x00370000<br />

ORR r10,r10,#0x00020000 ; set length = 3, stride = 1<br />

FMXR FPSCR,r10<br />

VFPASSERT VECTOR<br />

faddd d4, d4, d0<br />

fadds s16, s0, s8<br />

fabss s24, s28<br />

; assert vertor mode, unspecitied length and stride<br />

; ERROR, scalar in vector mode<br />

; okay<br />

; wrong length, but not faulted (unspecified)<br />

FMRX r10,FPSCR<br />

BIC r10,r10,#0x00370000<br />

ORR r10,r10,#0x00030000 ; set length = 4, stride = 1<br />

FMXR FPSCR,r10<br />

VFPASSERT VECTOR ; assert vector mode, length 4, stride 1<br />

fadds s24, s0, s8 ; okay<br />

fabss s24, s24 ; ERROR, wrong length<br />

FMRX r10,FPSCR<br />

BIC r10,r10,#0x00370000<br />

ORR r10,r10,#0x00130000 ; set length = 4, stride = 2<br />

FMXR FPSCR,r10<br />

VFPASSERT VECTOR ; assert vector mode, length 4, stride 2<br />

fadds s8, s0, s16 ; ERROR, wrong stride<br />

fabss s16, s28 ; okay<br />

fadds s8, s2, s16 ; okay (s8 and s16 both have<br />

; length 4 and stride 2.<br />

; s2 is scalar.)<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 6-41


向 量 浮 点 编 程<br />

6-42 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


第 7 章<br />

命 令 参 考<br />

本 章 介 绍 由 <strong>ARM</strong> 汇 编 程 序 armasm 提 供 的 命 令 。 其 中 包 含 下 列 各 部 分 :<br />

• 第 7-2 页 的 按 字 母 顺 序 排 列 的 命 令 表 ;<br />

• 第 7-3 页 的 符 号 定 义 命 令 ;<br />

• 第 7-13 页 的 数 据 定 义 命 令 ;<br />

分 配 存 储 器 , 定 义 数 据 结 构 , 设 置 存 储 器 的 初 始 值 。<br />

• 第 7-26 页 的 汇 编 控 制 命 令 ;<br />

条 件 汇 编 , 循 环 , 包 含 , 以 及 宏 命 令 。<br />

• 第 7-34 页 的 结 构 描 述 命 令 ;<br />

• 第 7-46 页 的 报 告 命 令 ;<br />

• 第 7-51 页 的 其 它 命 令 。<br />

备 注<br />

这 些 命 令 都 不 能 用 于 <strong>ARM</strong> C 和 C++ 编 译 程 序 的 内 联 汇 编 程 序 中 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-1


命 令 参 考<br />

7.1 按 字 母 顺 序 排 列 的 命 令 表<br />

表 7-1 说 明 在 哪 里 能 找 到 每 个 命 令 的 描 述 。<br />

第 7-52 页 的 ALIGN 第 7-61 页 的 EXPORT 或 GLOBAL 第 7-66 页 的 INCLUDE<br />

第 7-54 页 的 AREA 第 7-62 页 的 EXPORTAS 第 7-47 页 的 INFO<br />

第 7-46 页 的 ASSERT 第 7-63 页 的 EXTERN 第 7-67 页 的 KEEP<br />

表 7-1 命 令 描 述 位 置<br />

第 7-9 页 的 CN 第 7-16 页 的 FIELD 第 7-6 页 的 LCLA、 LCLL 和<br />

LCLS<br />

第 7-57 页 的 CODE16 和<br />

CODE32<br />

第 7-12 页 的 FN<br />

第 7-14 页 的 LTORG<br />

第 7-10 页 的 CP 第 7-35 页 的 FRAME ADDRESS 第 7-27 页 的 MACRO 和 MEND<br />

第 7-25 页 的 DATA 第 7-36 页 的 FRAME POP 第 7-15 页 的 MAP<br />

第 7-18 页 的 DCB 第 7-37 页 的 FRAME PUSH 第 7-29 页 的 MEXIT<br />

第 7-19 页 的 DCD 和 DCDU 第 7-38 页 的 FRAME REGISTER 第 7-68 页 的 NOFP<br />

第 7-20 页 的 DCDO 第 7-39 页 的 FRAME RESTORE 第 7-48 页 的 OPT<br />

第 7-21 页 的 DCFD 和 DCFDU 第 7-41 页 的 FRAME SAVE 第 7-68 页 的 REQUIRE<br />

第 7-22 页 的 DCFS 和 DCFSU<br />

第 7-23 页 的 DCI<br />

第 7-42 页 的 FRAME STATE<br />

REMEMBER<br />

第 7-43 页 的 FRAME STATE<br />

RESTORE<br />

第 7-69 页 的 REQUIRE8 和<br />

PRESERVE8<br />

第 7-7 页 的 RLIST<br />

第 7-24 页 的 DCQ 和 DCQU 第 7-44 页 的 FUNCTION 或 PROC 第 7-70 页 的 RN<br />

第 7-25 页 的 DCW 和 DCWU 第 7-4 页 的 GBLA、 GBLL 和 GBLS 第 7-71 页 的 ROUT<br />

第 7-11 页 的 DN 和 SN 第 7-64 页 的 GET 或 INCLUDE 第 7-7 页 的 SETA、 SETL 和<br />

SETS<br />

第 7-58 页 的 END 第 7-65 页 的 GLOBAL 第 7-11 页 的 DN 和 SN<br />

第 7-45 页 的 ENDFUNC 或<br />

ENDP<br />

第 7-30 页 的 IF、 ELSE、 ENDIF 和<br />

ELIF<br />

第 7-17 页 的 SPACE<br />

第 7-59 页 的 ENTRY 第 7-65 页 的 IMPORT 第 7-50 页 的 TTL 和 SUBT<br />

第 7-60 页 的 EQU 第 7-66 页 的 INCBIN 第 7-33 页 的 WHILE 和 WEND<br />

7-2 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.2 符 号 定 义 命 令<br />

本 节 介 绍 下 列 命 令 :<br />

• 第 7-4 页 的 GBLA、 GBLL 和 GBLS<br />

声 明 全 局 算 术 、 逻 辑 或 字 符 串 变 量 。<br />

• 第 7-6 页 的 LCLA、 LCLL 和 LCLS<br />

声 明 局 部 算 术 、 逻 辑 或 字 符 串 变 量 。<br />

• 第 7-7 页 的 SETA、 SETL 和 SETS<br />

设 置 算 术 、 逻 辑 或 字 符 串 变 量 的 值 。<br />

• 第 7-7 页 的 RLIST<br />

为 一 组 通 用 寄 存 器 定 义 一 个 名 称 。<br />

• 第 7-9 页 的 CN<br />

定 义 协 处 理 器 寄 存 器 名 称 。<br />

• 第 7-10 页 的 CP<br />

定 义 协 处 理 器 名 称 。<br />

• 第 7-11 页 的 DN 和 SN<br />

定 义 双 精 度 或 单 精 度 VFP 寄 存 器 名 称 。<br />

• 第 7-12 页 的 FN<br />

定 义 FPA 寄 存 器 名 称 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-3


命 令 参 考<br />

7.2.1 GBLA、 GBLL 和 GBLS<br />

GBLA 命 令 声 明 一 个 全 局 算 术 变 量 , 并 将 其 值 初 始 化 为 0。<br />

GBLL 命 令 声 明 一 个 全 局 逻 辑 变 量 , 并 将 其 值 初 始 化 为 {FALSE}。<br />

GBLS 命 令 声 明 一 个 全 局 字 符 串 变 量 , 并 将 其 值 初 始 化 为 一 个 空 字 符 串 ""。<br />

语 法<br />

variable<br />

其 中 :<br />

是 GBLA、 GBLL 或 GBLS 之 一 。<br />

variable 是 变 量 的 名 称 。 variable 在 一 个 源 文 件 内 的 符 号 中 必 须 是 唯 一 的 。<br />

用 法<br />

对 于 已 经 定 义 的 变 量 , 使 用 上 述 命 令 之 一 来 将 其 重 新 初 始 化 为 上 面 给 出 的 相 同 值 。<br />

变 量 的 使 用 范 围 限 制 为 包 含 它 的 源 文 件 内 。<br />

用 一 个 SETA、SETL 或 SETS 命 令 来 设 置 变 量 的 值 ( 请 参 阅 第 7-7 页 的 SETA、SETL<br />

和 SETS)。<br />

有 关 声 明 局 部 变 量 的 信 息 , 请 参 阅 第 7-6 页 的 LCLA、 LCLL 和 LCLS。<br />

全 局 变 量 也 可 以 用 -predefine 汇 编 程 序 命 令 行 选 项 来 设 置 。 有 关 详 细 信 息 请 参 阅<br />

第 3-2 页 的 命 令 语 法 。<br />

7-4 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

示 例<br />

示 例 7-1 声 明 一 个 变 量 objectsize, 将 objectsize 的 值 设 置 为 0xFF, 随 后 在 一 个<br />

SPACE 命 令 中 使 用 它 。<br />

示 例 7-1<br />

GBLA objectsize ; declare the variable name<br />

objectsize SETA 0xFF ; set its value<br />

.<br />

. ; other code<br />

.<br />

SPACE objectsize ; quote the variable<br />

示 例 7-2 说 明 在 调 用 armasm 时 如 何 声 明 和 设 置 变 量 。 当 需 要 在 汇 编 时 设 置 变 量 的<br />

值 时 , 就 可 以 利 用 此 示 例 。 -pd 是 -predefine 的 同 义 词 。<br />

示 例 7-2<br />

armasm -pd "objectsize SETA 0xFF" -o objectfile sourcefile<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-5


命 令 参 考<br />

7.2.2 LCLA、 LCLL 和 LCLS<br />

LCLA 命 令 声 明 一 个 局 部 算 术 变 量 , 并 将 其 值 初 始 化 为 0。<br />

LCLL 命 令 声 明 一 个 局 部 逻 辑 变 量 , 并 将 其 值 初 始 化 为 {FALSE}。<br />

GBLS 命 令 声 明 一 个 局 部 字 符 串 变 量 , 并 将 其 值 初 始 化 为 一 个 空 字 符 串 ""。<br />

语 法<br />

variable<br />

其 中 :<br />

是 LCLA、 LCLL 或 LCLS 之 一 。<br />

variable 是 变 量 的 名 称 。 在 其 所 在 宏 命 令 内 , variable 必 须 是 唯 一 的 。<br />

用 法<br />

对 于 已 经 定 义 的 变 量 , 使 用 上 述 命 令 之 一 , 来 将 其 重 新 初 始 化 为 与 上 面 给 出 的 值<br />

相 同 的 值 。<br />

变 量 的 作 用 范 围 限 制 为 包 含 它 的 宏 命 令 的 特 定 示 实 例 ( 请 参 阅 第 7-27 页 的<br />

MACRO 和 MEND)。<br />

用 一 个 SETA、SETL 或 SETS 命 令 来 设 置 变 量 的 值 ( 请 参 阅 第 7-7 页 的 SETA、SETL<br />

和 SETS)。<br />

有 关 声 明 全 局 变 量 的 信 息 , 请 参 阅 第 7-4 页 的 GBLA、 GBLL 和 GBLS。<br />

示 例<br />

MACRO<br />

; Declare a macro<br />

$label message $a<br />

; Macro prototype line<br />

LCLS err ; Declare local string<br />

; variable err.<br />

err SETS "error no: " ; Set value of err<br />

$label ; code<br />

INFO 0, "err":CC::STR:$a ; Use string<br />

MEND<br />

7-6 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.2.3 SETA、 SETL 和 SETS<br />

SETA 命 令 设 置 一 个 局 部 或 全 局 算 术 变 量 的 值 。<br />

SETL 命 令 设 置 一 个 局 部 或 全 局 逻 辑 变 量 的 值 。<br />

SETS 命 令 设 置 一 个 局 部 或 全 局 字 符 串 变 量 的 值 。<br />

语 法<br />

variable expr<br />

其 中 :<br />

是 SETA、 SETL 或 SETS 之 一 。<br />

variable 是 由 GBLA、 GBLL、 GBLS、 LCLA、 LCLL 或 LCLS 命 令 声 明 的 变 量 名 称 。<br />

expr 是 一 个 表 达 式 , 其 取 值 为 以 下 几 种 类 型 :<br />

• 数 值 类 型 , 用 于 SETA ( 请 参 阅 第 3-20 页 的 数 字 表 达 式 ;<br />

• 逻 辑 类 型 , 用 于 SETL ( 请 参 阅 第 3-23 页 的 逻 辑 表 达 式 );<br />

• 字 符 串 类 型 , 用 于 SETS( 请 参 阅 第 3-19 页 的 字 符 串 表 达 式 )。<br />

用 法<br />

在 使 用 这 些 命 令 之 前 , 必 须 使 用 一 个 全 局 或 局 部 声 明 命 令 声 明 一 个 变 量 。 有 关 详<br />

细 信 息 请 参 阅 第 7-4 页 的 GBLA、 GBLL 和 GBLS 和 第 7-6 页 的 LCLA、 LCLL 和<br />

LCLS。<br />

也 可 以 在 命 令 行 上 预 定 义 变 量 名 。 有 关 详 细 信 息 请 参 阅 第 3-2 页 的 命 令 语 法 。<br />

示 例<br />

GBLA VersionNumber<br />

VersionNumber SETA 21<br />

GBLL Debug<br />

Debug SETL {TRUE}<br />

GBLS VersionString<br />

VersionString SETS "Version 1.0"<br />

7.2.4 RLIST<br />

RLIST ( 寄 存 器 列 表 ) 命 令 为 一 个 通 用 寄 存 器 集 指 定 一 个 名 称 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-7


命 令 参 考<br />

语 法<br />

name RLIST {list-of-registers}<br />

其 中 :<br />

name<br />

list-of-registers<br />

用 法<br />

是 要 为 寄 存 器 集 指 定 的 名 称 。 name 不 能 与 第 3-9 页 的 预 定 义 的 寄 存<br />

器 和 协 处 理 器 名 称 中 列 出 的 任 何 预 定 义 名 称 相 同 。<br />

是 一 个 用 逗 号 分 隔 的 寄 存 器 名 称 列 表 和 / 或 寄 存 器 范 围 。 寄 存 器 列<br />

表 必 须 括 在 大 括 号 内 。<br />

使 用 RLIST 为 要 用 LDM 或 STM 指 令 传 送 的 寄 存 器 集 指 定 一 个 名 称 。<br />

LDM 和 STM 总 是 将 最 低 的 物 理 寄 存 器 编 号 放 在 存 储 器 的 最 低 地 址 处 , 而 不 考 虑 为<br />

LDM 或 STM 指 令 提 供 的 顺 序 。 如 果 用 户 已 定 义 了 符 号 寄 存 器 名 称 , 那 么 寄 存 器 列<br />

表 不 按 递 增 顺 序 时 就 不 太 明 显 。<br />

使 用 -checkreglist 汇 编 程 序 选 项 , 来 确 保 寄 存 器 列 表 中 的 寄 存 器 是 按 递 增 顺 序<br />

提 供 的 。 如 果 寄 存 器 不 是 以 递 增 顺 序 提 供 的 , 则 发 出 一 个 警 告 。<br />

示 例<br />

Context RLIST<br />

{r0-r6,r8,r10-r12,r15}<br />

7-8 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.2.5 CN<br />

CN 命 令 为 一 个 协 处 理 器 寄 存 器 定 义 一 个 名 称 。<br />

语 法<br />

name CN expr<br />

其 中 :<br />

name<br />

是 要 为 协 处 理 器 寄 存 器 定 义 的 名 称 。 name 不 能 与 第 3-9 页 的 预 定 义<br />

的 寄 存 器 和 协 处 理 器 名 称 中 列 出 的 任 何 预 定 义 名 称 相 同 。<br />

expr 取 值 为 0 到 15 之 间 的 一 个 协 处 理 器 寄 存 器 编 号 。<br />

用 法<br />

使 用 CN 为 寄 存 器 分 配 便 于 记 忆 的 名 称 , 以 帮 助 记 忆 所 使 用 的 每 个 寄 存 器 。<br />

备 注<br />

要 避 免 用 不 同 的 名 称 使 用 同 一 寄 存 器 而 发 生 冲 突 。<br />

从 c0 到 c15 的 名 称 是 预 先 定 义 的 。<br />

示 例<br />

power CN 6 ; defines power as a symbol for<br />

; coprocessor register 6<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-9


命 令 参 考<br />

7.2.6 CP<br />

CP 命 令 为 一 个 指 定 的 协 处 理 器 定 义 一 个 名 称 。 协 处 理 器 编 号 必 须 在 0 到 15 范<br />

围 内 。<br />

语 法<br />

name CP expr<br />

其 中 :<br />

name<br />

是 要 为 协 处 理 器 分 配 的 名 称 。 name 不 能 与 第 3-9 页 的 预 定 义 的 寄 存<br />

器 和 协 处 理 器 名 称 中 列 出 的 任 何 预 定 义 名 称 相 同 。<br />

expr 取 值 为 0 到 15 之 间 的 一 个 协 处 理 器 编 号 。<br />

用 法<br />

使 用 CP 为 协 处 理 器 分 配 便 于 记 忆 的 名 称 , 以 帮 助 记 忆 所 使 用 的 每 个 协 处 理 器 。<br />

备 注<br />

要 避 免 用 不 同 的 名 称 使 用 同 一 协 处 理 器 。<br />

p0 到 p15 是 为 0 到 15 的 协 处 理 器 预 先 定 义 的 名 称 。<br />

示 例<br />

dmu CP 6 ; defines dmu as a symbol for<br />

; coprocessor 6<br />

7-10 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.2.7 DN 和 SN<br />

DN 命 令 为 一 个 指 定 的 双 精 度 VFP 寄 存 器 定 义 一 个 名 称 。 名 称 d0-d15 和 D0-D15<br />

是 预 先 定 义 的 。<br />

SN 命 令 为 一 个 指 定 的 单 精 度 VFP 寄 存 器 定 义 一 个 名 称 。 名 称 s0-s31 和 S0-S31 是<br />

预 先 定 义 的 。<br />

语 法<br />

name DN expr<br />

name SN expr<br />

其 中 :<br />

name<br />

是 要 为 VFP 寄 存 器 分 配 的 名 称 。name 不 能 与 第 3-9 页 的 预 定 义 的 寄<br />

存 器 和 协 处 理 器 名 称 中 列 出 的 任 何 预 定 义 名 称 相 同 。<br />

expr 取 值 为 0 到 15 之 间 的 一 个 双 精 度 VFP 寄 存 器 编 号 , 或 者 取 值 为 0<br />

到 31 之 间 的 一 个 适 当 的 单 精 度 VFP 寄 存 器 编 号 。<br />

用 法<br />

使 用 DN 或 SN 为 VFP 寄 存 器 分 配 便 于 记 忆 的 名 称 , 以 帮 助 记 忆 所 使 用 的 每 个 VFP<br />

寄 存 器 。<br />

备 注<br />

要 避 免 用 不 同 的 名 称 使 用 相 同 的 寄 存 器 。<br />

不 能 在 一 个 DN 或 SN 命 令 中 指 定 一 个 向 量 长 度 ( 请 参 阅 第 6-38 页 的 VFP 命 令 和<br />

向 量 记 号 )。<br />

示 例<br />

energy DN 6<br />

; defines energy as a symbol for<br />

; VFP double-precision register 6<br />

mass<br />

SN 16 ; defines mass as a symbol for<br />

; VFP single-precision register 16<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-11


命 令 参 考<br />

7.2.8 FN<br />

FN 命 令 为 一 个 指 定 的 FPA 浮 点 寄 存 器 定 义 一 个 名 称 。 名 称 f0-f7 和 F0-F7 是 预 先<br />

定 义 的 。<br />

语 法<br />

name FN expr<br />

其 中 :<br />

name<br />

是 要 为 浮 点 寄 存 器 分 配 的 名 称 。 name 不 能 与 第 3-9 页 的 预 定 义 的 寄<br />

存 器 和 协 处 理 器 名 称 中 列 出 的 任 何 预 定 义 名 称 相 同 。<br />

expr 取 值 为 0 到 7 之 间 的 一 个 浮 点 寄 存 器 编 号 。<br />

用 法<br />

使 用 FN 为 FPA 浮 点 寄 存 器 分 配 便 于 记 忆 的 名 称 , 以 帮 助 记 忆 所 使 用 的 每 个 寄 存<br />

器 。<br />

备 注<br />

要 避 免 用 不 同 的 名 称 使 用 同 一 寄 存 器 。<br />

示 例<br />

energy FN 6<br />

; defines energy as a symbol for<br />

; floating-point register 6<br />

7-12 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.3 数 据 定 义 命 令<br />

本 节 介 绍 下 列 命 令 :<br />

• 第 7-14 页 的 LTORG<br />

设 置 一 个 文 字 池 的 原 点 。<br />

• 第 7-15 页 的 MAP<br />

设 置 一 个 存 储 器 映 射 的 原 点 。<br />

• 第 7-16 页 的 FIELD<br />

定 义 一 个 存 储 器 映 射 内 的 一 个 位 段 。<br />

• 第 7-17 页 的 SPACE<br />

分 配 一 个 用 零 填 充 的 存 储 器 块 。<br />

• 第 7-18 页 的 DCB<br />

分 配 存 储 器 的 字 节 , 并 指 定 初 始 内 容 。<br />

• 第 7-19 页 的 DCD 和 DCDU<br />

分 配 存 储 器 的 字 , 并 指 定 初 始 内 容 。<br />

• 第 7-20 页 的 DCDO<br />

分 配 存 储 器 的 字 , 并 将 初 始 内 容 指 定 为 相 对 静 态 基 址 寄 存 器 的 偏 移 量 。<br />

• 第 7-21 页 的 DCFD 和 DCFDU<br />

分 配 存 储 器 的 双 字 , 并 将 初 始 内 容 指 定 为 双 精 度 浮 点 数 。<br />

• 第 7-22 页 的 DCFS 和 DCFSU<br />

分 配 存 储 器 的 字 , 并 将 初 始 内 容 指 定 为 单 精 度 浮 点 数 。<br />

• 第 7-23 页 的 DCI<br />

分 配 存 储 器 的 字 , 并 指 定 初 始 内 容 。 将 位 置 标 记 为 代 码 而 非 数 据 。<br />

• 第 7-24 页 的 DCQ 和 DCQU<br />

分 配 存 储 器 的 双 字 , 并 将 初 始 内 容 指 定 为 64 位 整 数 。<br />

• 第 7-25 页 的 DCW 和 DCWU<br />

分 配 存 储 器 的 半 字 , 并 指 定 初 始 内 容 。<br />

• 第 7-25 页 的 DATA<br />

标 记 一 个 代 码 段 内 的 数 据 。 已 不 再 使 用 , 仅 用 于 向 下 兼 容 性 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-13


命 令 参 考<br />

7.3.1 LTORG<br />

LTORG 命 令 指 示 汇 编 程 序 立 即 汇 编 当 前 文 字 池 。<br />

语 法<br />

LTORG<br />

用 法<br />

汇 编 程 序 在 每 个 代 码 段 结 尾 处 汇 编 当 前 文 字 池 。 代 码 段 的 结 束 位 置 由 后 续 段 开<br />

始 处 的 AREA 命 令 确 定 , 或 由 汇 编 代 码 的 结 束 位 置 确 定 。<br />

这 些 默 认 文 字 池 有 时 会 超 出 某 些 LDR、LDFD 和 LDFS 伪 指 令 的 范 围 。 有 关 详 细 信 息<br />

请 参 阅 第 4-126 页 的 LDR <strong>ARM</strong> 伪 指 令 和 第 5-48 页 的 LDR Thumb 伪 指 令 。 使 用<br />

LTORG 以 确 保 是 在 范 围 内 汇 编 一 个 文 字 池 。 大 型 程 序 可 能 需 要 几 个 文 字 池 。<br />

将 LTORG 命 令 放 在 无 条 件 跳 转 或 子 程 序 返 回 指 令 之 后 , 以 使 处 理 器 不 会 试 图 将 常<br />

数 作 为 指 令 来 执 行 。<br />

汇 编 程 序 对 文 字 池 中 的 数 据 进 行 字 对 齐 。<br />

示 例<br />

AREA Example, CODE, READONLY<br />

start BL func1<br />

func1<br />

; function body<br />

; code<br />

LDR r1,=0x55555555 ; => LDR R1, [pc, #offset to Literal Pool 1]<br />

; code<br />

MOV pc,lr ; end function<br />

LTORG<br />

; Literal Pool 1 contains literal &55555555.<br />

data SPACE 4200 ; Clears 4200 bytes of memory,<br />

; starting at current location.<br />

END<br />

; Default literal pool is empty.<br />

7-14 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.3.2 MAP<br />

MAP 命 令 将 存 储 器 映 射 的 原 点 设 置 为 一 个 指 定 的 地 址 。 存 储 器 映 射 位 置 计 数 器<br />

{VAR} 也 被 设 置 为 相 同 的 地 址 。 ^ 是 MAP 的 一 个 同 义 词 。<br />

语 法<br />

MAP expr{,base-register}<br />

其 中 :<br />

expr 是 一 个 数 值 表 达 式 或 相 对 程 序 的 表 达 式 :<br />

• 如 果 未 指 定 base-register, 则 expr 的 取 值 为 存 储 器 映 射 的 起<br />

始 地 址 。 存 储 器 映 射 位 置 计 数 器 也 设 置 为 该 地 址 。<br />

• 如 果 expr 是 相 对 程 序 的 , 那 么 在 映 射 中 使 用 它 之 前 , 必 须 已<br />

定 义 了 标 号 。 在 第 一 轮 汇 编 程 序 时 , 映 射 需 要 标 号 的 定 义 。<br />

base-register<br />

指 定 一 个 寄 存 器 。 如 果 指 定 了 base-register, 则 存 储 器 映 射 的 起 始<br />

地 址 是 expr 与 运 行 时 的 base-register 值 之 和 。<br />

用 法<br />

将 MAP 命 令 与 FIELD 命 令 配 合 使 用 来 描 述 一 个 存 储 器 映 射 。<br />

指 定 base-register 以 定 义 相 对 寄 存 器 的 标 号 。 在 由 后 面 的 FIELD 命 令 定 义 的 所 有<br />

标 号 中 , 基 址 寄 存 器 变 成 隐 含 的 , 直 到 出 现 下 一 个 MAP 命 令 。 相 对 寄 存 器 的 标 号<br />

可 用 在 加 载 和 存 储 指 令 中 。 请 参 阅 第 7-16 页 的 FIELD 的 一 个 示 例 。<br />

可 以 任 意 多 次 使 用 MAP 命 令 来 定 义 多 个 存 储 器 映 射 。<br />

在 使 用 MAP 命 令 之 前 , {VAR} 计 数 器 被 设 置 为 0。<br />

示 例<br />

MAP 0,r9<br />

MAP 0xff,r9<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-15


命 令 参 考<br />

7.3.3 FIELD<br />

FIELD 命 令 描 述 已 使 用 MAP 命 令 定 义 的 存 储 器 映 射 内 的 空 间 。# 是 FIELD 的 一 个 同<br />

义 词 。<br />

语 法<br />

{label} FIELD expr<br />

其 中 :<br />

label<br />

是 一 个 可 选 的 标 号 。 如 果 指 定 , 则 将 存 储 器 位 置 计 数 器 的 值 {VAR}<br />

分 配 给 label。 存 储 器 位 置 计 数 器 增 加 expr 的 值 。<br />

expr 是 一 个 表 达 式 , 取 值 为 增 量 存 储 计 数 器 的 字 节 数 。<br />

用 法<br />

如 果 存 储 器 映 射 是 由 指 定 一 个 base-register 的 MAP 命 令 设 置 的 , 那 么 在 由 后 续 的<br />

FIELD 命 令 定 义 的 所 有 标 号 中 , 基 址 寄 存 器 是 隐 型 的 , 直 到 出 现 下 一 个 MAP 命 令<br />

为 止 。 在 装 载 和 存 储 指 令 中 可 引 用 这 些 相 对 寄 存 器 的 标 号 ( 请 参 阅 第 7-15 页 的<br />

MAP)。<br />

备 注<br />

在 使 用 MAP、FIELD 和 相 对 寄 存 器 的 标 号 时 , 必 须 要 加 以 小 心 。 有 关 详 细 信 息 请 参<br />

阅 第 2-53 页 的 用 MAP 和 FIELD 命 令 描 述 数 据 结 构 。<br />

示 例<br />

以 下 示 例 说 明 如 何 使 用 MAP 和 FIELD 命 令 定 义 相 对 寄 存 器 的 标 号 。<br />

MAP 0,r9 ; set {VAR} to the address stored in r9<br />

FIELD 4 ; increment {VAR} by 4 bytes<br />

Lab FIELD 4 ; set Lab to the address [r9 + 4]<br />

; and then increment {VAR} by 4 bytes<br />

LDR r0,Lab ; equivalent to LDR r0,[r9,#4]<br />

7-16 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.3.4 SPACE<br />

SPACE 命 令 保 留 一 个 用 零 填 充 的 存 储 器 块 。% 是 SPACE 的 一 个 同 义 词 。<br />

语 法<br />

{label} SPACE expr<br />

其 中 :<br />

expr 取 值 为 要 保 留 的 填 零 字 节 数 ( 请 参 阅 第 3-20 页 的 数 字 表 达 式 )。<br />

用 法<br />

如 果 在 Thumb 代 码 内 用 SPACE 定 义 以 标 号 标 识 的 数 据 , 则 必 须 使 用 DATA 命 令 。<br />

有 关 详 细 信 息 请 参 阅 第 7-25 页 的 DATA。<br />

使 用 ALIGN 命 令 对 齐 SPACE 命 令 后 的 任 何 代 码 。 有 关 详 细 信 息 请 参 阅 第 7-52 页 的<br />

ALIGN。<br />

另 请 参 阅 :<br />

• 第 7-18 页 的 DCB ;<br />

• 第 7-19 页 的 DCD 和 DCDU ;<br />

• 第 7-20 页 的 DCDO ;<br />

• 第 7-25 页 的 DCW 和 DCWU。<br />

示 例<br />

AREA MyData, DATA, READWRITE<br />

data1 SPACE 255 ; defines 255 bytes of zeroed store<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-17


命 令 参 考<br />

7.3.5 DCB<br />

DCB 命 令 分 配 一 个 或 多 个 字 节 的 存 储 器 , 并 定 义 存 储 器 的 运 行 时 初 值 。= 是 DCB 的<br />

一 个 同 义 词 。<br />

语 法<br />

{label} DCB expr{,expr}...<br />

其 中 :<br />

expr 可 以 是 :<br />

• 一 个 数 值 表 达 式 , 取 值 为 –128 到 255 范 围 内 的 一 个 整 数 ( 请<br />

参 阅 第 3-20 页 的 数 字 表 达 式 )<br />

• 引 号 内 的 字 符 串 。 字 符 串 的 字 符 加 载 到 存 储 器 的 连 续 字 节 中 。<br />

用 法<br />

如 果 DCB 后 面 有 一 个 指 令 , 请 使 用 ALIGN 命 令 来 确 保 该 指 令 是 对 齐 的 。 有 关 详 细<br />

信 息 请 参 阅 第 7-52 页 的 ALIGN。<br />

另 请 参 阅 :<br />

• 第 7-19 页 的 DCD 和 DCDU ;<br />

• 第 7-24 页 的 DCQ 和 DCQU ;<br />

• 第 7-25 页 的 DCW 和 DCWU ;<br />

• 第 7-17 页 的 SPACE。<br />

示 例<br />

与 C 语 言 字 符 串 不 同 的 是 , <strong>ARM</strong> 汇 编 程 序 字 符 串 不 是 用 零 终 止 的 。 可 以 使 用<br />

DCB, 按 如 下 方 式 构 造 用 零 终 止 的 C 字 符 串 :<br />

C_string<br />

DCB "C_string",0<br />

7-18 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.3.6 DCD 和 DCDU<br />

DCD 命 令 分 配 一 个 或 多 个 字 的 存 储 器 , 在 四 个 字 节 的 边 界 上 对 齐 , 并 定 义 存 储 器<br />

的 运 行 时 初 值 。<br />

& 是 DCD 的 一 个 同 义 词 。<br />

DCDU 是 相 同 的 , 只 是 存 储 器 对 齐 是 任 意 的 。<br />

语 法<br />

{label} DCD{U} expr{,expr}<br />

其 中 :<br />

expr 可 以 是 :<br />

• 一 个 数 值 表 达 式 ( 请 参 阅 第 3-20 页 的 数 字 表 达 式 )。<br />

• 一 个 相 对 程 序 的 表 达 式 。<br />

用 法<br />

必 要 时 ,DCD 在 定 义 的 第 一 个 字 前 最 多 插 入 三 个 填 充 字 节 , 以 实 现 四 字 节 的 对<br />

齐 。<br />

如 果 不 需 要 对 齐 , 则 可 使 用 DCDU。<br />

另 请 参 阅 :<br />

• 第 7-18 页 的 DCB ;<br />

• 第 7-25 页 的 DCW 和 DCWU ;<br />

• 第 7-24 页 的 DCQ 和 DCQU ;<br />

• 第 7-17 页 的 SPACE。<br />

示 例<br />

data1 DCD 1,5,20 ; Defines 3 words containing<br />

; decimal values 1, 5, and 20<br />

data2 DCD mem06 + 4 ; Defines 1 word containing 4 +<br />

; the address of the label mem06<br />

AREA MyData, DATA, READWRITE<br />

DCB 255 ; Now misaligned ...<br />

data3 DCDU 1,5,20 ; Defines 3 words containing<br />

; 1, 5 and 20, not word aligned<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-19


命 令 参 考<br />

7.3.7 DCDO<br />

DCDO 命 令 分 配 一 个 或 多 个 字 的 存 储 器 , 在 四 个 字 节 的 边 界 上 对 齐 , 并 将 存 储 器 的<br />

运 行 时 初 值 定 义 为 相 对 静 态 基 址 寄 存 器 sb (r9) 的 偏 移 量 。<br />

语 法<br />

{label} DCDO expr{,expr}...<br />

其 中 :<br />

expr<br />

是 一 个 相 对 寄 存 器 的 表 达 式 或 标 号 。 基 址 寄 存 器 必 须 是 sb。<br />

用 法<br />

使 用 DCDO 为 静 态 基 址 相 对 寄 存 器 的 可 重 定 位 地 址 分 配 存 储 器 空 间 。<br />

示 例<br />

IMPORT externsym<br />

DCDO externsym ; 32-bit word relocated by offset of<br />

; externsym from base of SB section.<br />

7-20 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.3.8 DCFD 和 DCFDU<br />

DCFD 命 令 为 字 对 齐 的 双 精 度 浮 点 数 分 配 存 储 器 , 并 定 义 存 储 器 的 运 行 时 初 值 。 双<br />

精 度 数 占 用 两 个 字 , 并 且 必 须 字 对 齐 才 能 用 在 算 术 运 算 中 。<br />

DCDFU 是 相 同 的 , 只 是 存 储 器 对 齐 是 任 意 的 。<br />

语 法<br />

{label} DCFD{U} fpliteral{,fpliteral}...<br />

其 中 :<br />

fpliteral 是 一 个 单 精 度 浮 点 文 字 ( 请 参 阅 第 3-22 页 的 浮 点 文 本 )。<br />

用 法<br />

必 要 时 , 汇 编 程 序 在 定 义 的 第 一 个 数 字 前 最 多 插 入 三 个 填 充 字 节 , 以 实 现 四 字 节<br />

的 对 齐 。<br />

如 果 不 需 要 对 齐 , 则 可 使 用 DCFDU。<br />

在 将 fpliteral 转 换 到 内 部 形 式 时 , 所 使 用 的 字 顺 序 是 由 选 定 的 浮 点 体 系 结 构 来<br />

控 制 的 。 如 果 选 择 了 -fpu none 选 项 , 则 不 能 使 用 DCFD 或 DCFDU。<br />

双 精 度 数 值 的 范 围 是 :<br />

• 最 大 值 1.79769313486231571e+308 ;<br />

• 最 小 值 2.22507385850720138e-308。<br />

另 请 参 阅 第 7-22 页 的 DCFS 和 DCFSU。<br />

示 例<br />

DCFD<br />

DCFDU<br />

1E308,-4E-100<br />

10000,-.1,3.1E26<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-21


命 令 参 考<br />

7.3.9 DCFS 和 DCFSU<br />

DCFS 命 令 为 字 对 齐 的 单 精 度 浮 点 数 分 配 存 储 器 , 并 定 义 存 储 器 的 运 行 时 初 值 。 单<br />

精 度 数 占 用 一 个 字 , 并 且 必 须 字 对 齐 才 能 用 在 算 术 运 算 中 。<br />

DCDSU 是 相 同 的 , 只 是 存 储 器 对 齐 是 任 意 的 。<br />

语 法<br />

{label} DCFS{U} fpliteral{,fpliteral}...<br />

其 中 :<br />

fpliteral 是 一 个 单 精 度 浮 点 文 字 ( 请 参 阅 第 3-22 页 的 浮 点 文 本 )。<br />

用 法<br />

必 要 时 ,DCFS 在 定 义 的 第 一 个 数 前 最 多 插 入 三 个 填 充 字 节 , 以 实 现 四 字 节 的 对 齐 。<br />

如 果 不 需 要 对 齐 , 则 可 使 用 DCDU。<br />

单 击 精 度 数 值 的 范 围 是 :<br />

• 最 大 值 3.40282347e+38 ;<br />

• 最 小 值 1.17549435e-38。<br />

另 请 参 阅 第 7-21 页 的 DCFD 和 DCFDU。<br />

示 例<br />

DCFS<br />

DCFSU<br />

1E3,-4E-9<br />

1.0,-.1,3.1E6<br />

7-22 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.3.10 DCI<br />

在 <strong>ARM</strong> 代 码 中 , DCI 命 令 分 配 一 个 或 多 个 字 的 存 储 器 , 在 四 个 字 节 的 边 界 上 对<br />

齐 , 并 定 义 存 储 器 的 运 行 时 初 值 。<br />

在 Thumb 代 码 中 ,DCI 命 令 分 配 一 个 或 多 个 半 字 的 存 储 器 , 在 两 个 字 节 的 边 界 上<br />

对 齐 , 并 定 义 存 储 器 的 运 行 时 初 值 。<br />

语 法<br />

{label} DCI expr{,expr}<br />

其 中 :<br />

expr 是 一 个 数 值 表 达 式 ( 请 参 阅 第 3-20 页 的 数 字 表 达 式 )。<br />

用 法<br />

DCI 命 令 非 常 类 似 于 DCD 或 DCW 命 令 , 但 位 置 被 标 记 为 代 码 而 不 是 数 据 。 在 为 当<br />

前 汇 编 程 序 版 本 不 支 持 的 新 指 令 编 写 宏 时 , 可 使 用 DCI。<br />

在 <strong>ARM</strong> 代 码 中 , 必 要 时 , DCD 在 定 义 的 第 一 个 字 前 最 多 插 入 三 个 填 充 字 节 , 以<br />

实 现 四 字 节 的 对 齐 。 在 Thumb 代 码 中 ,DCI 必 要 时 插 入 一 个 初 始 填 充 字 节 , 以 实<br />

现 两 个 字 节 的 对 齐 。<br />

另 请 参 阅 第 7-19 页 的 DCD 和 DCDU 和 第 7-25 页 的 DCW 和 DCWU。<br />

示 例<br />

MACRO<br />

newinst<br />

DCI<br />

MEND<br />

; this macro translates newinstr Rd,Rm<br />

; to the appropriate machine code<br />

$Rd,$Rm<br />

0xe16f0f10 :OR: ($Rd:SHL:12) :OR: $Rm<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-23


命 令 参 考<br />

7.3.11 DCQ 和 DCQU<br />

DCQ 命 令 分 配 一 个 或 多 个 八 字 节 的 存 储 器 块 , 在 四 字 节 的 边 界 上 对 齐 , 并 定 义 存<br />

储 器 的 运 行 时 初 值 。<br />

DCQU 是 相 同 的 , 只 是 存 储 器 对 齐 是 任 意 的 。<br />

语 法<br />

{label} DCQ{U} {-}literal{,{-}literal}...<br />

其 中 :<br />

literal 一 个 64 位 数 值 文 字 ( 请 参 阅 第 3-21 页 的 数 字 文 本 )。<br />

允 许 的 数 值 范 围 是 0 到 2 64 - 1。<br />

除 了 在 数 值 文 字 中 通 常 允 许 的 字 符 之 外 , 可 以 用 减 号 作 为 literal<br />

的 前 缀 。 在 这 种 情 况 下 , 允 许 的 数 值 范 围 是 - 2 63 到 - 1。<br />

指 定 - n 后 的 结 果 , 与 指 定 2 64 - n 时 的 结 果 相 同 。<br />

用 法<br />

必 要 时 ,DCQ 在 定 义 的 第 一 个 八 字 节 块 前 面 最 多 插 入 三 个 填 充 字 节 , 以 实 现 四 字<br />

节 的 对 齐 。<br />

如 果 不 需 要 对 齐 , 则 可 使 用 DCQU。<br />

另 请 参 阅 :<br />

• 第 7-18 页 的 DCB ;<br />

• 第 7-19 页 的 DCD 和 DCDU ;<br />

• 第 7-25 页 的 DCW 和 DCWU ;<br />

• 第 7-17 页 的 SPACE。<br />

示 例<br />

AREA MiscData, DATA, READWRITE<br />

data DCQ -225,2_101 ; 2_101 means binary 101.<br />

DCQU number+4 ; number must already be defined.<br />

7-24 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.3.12 DCW 和 DCWU<br />

DCW 命 令 分 配 一 个 或 多 个 半 字 的 存 储 器 , 在 两 个 字 节 的 边 界 上 对 齐 , 并 定 义 存 储<br />

器 的 运 行 时 初 值 。<br />

DCWU 是 相 同 的 , 不 过 存 储 器 对 齐 是 任 意 的 。<br />

语 法<br />

{label} DCW expr{,expr}...<br />

其 中 :<br />

expr<br />

是 一 个 数 值 表 达 式 , 取 值 为 - 32768 到 65535 范 围 内 的 一 个 整 数 ( 请<br />

参 阅 第 3-20 页 的 数 字 表 达 式 )<br />

用 法<br />

必 要 时 ,DCW 在 定 义 的 第 一 个 半 字 前 最 多 插 入 一 个 填 充 字 节 , 以 实 现 二 个 字 节 的<br />

对 齐 。<br />

如 果 不 需 要 对 齐 , 则 可 使 用 DCWU。<br />

另 请 参 阅 :<br />

• 第 7-18 页 的 DCB ;<br />

• 第 7-19 页 的 DCD 和 DCDU ;<br />

• 第 7-24 页 的 DCQ 和 DCQU ;<br />

• 第 7-17 页 的 SPACE。<br />

示 例<br />

data DCW -225,2*number ; number must already be defined<br />

DCWU<br />

number+4<br />

7.3.13 DATA<br />

不 再 需 要 DATA 命 令 。 汇 编 程 序 会 忽 略 它 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-25


命 令 参 考<br />

7.4 汇 编 控 制 命 令<br />

本 节 介 绍 下 列 命 令 :<br />

• 第 7-27 页 的 MACRO 和 MEND ;<br />

• 第 7-29 页 的 MEXIT ;<br />

• 第 7-30 页 的 IF、 ELSE、 ENDIF 和 ELIF ;<br />

• 第 7-33 页 的 WHILE 和 WEND。<br />

7.4.1 嵌 套 命 令<br />

下 列 结 构 可 以 嵌 套 到 256 层 的 总 深 度 :<br />

• MACRO 定 义 ;<br />

• WHILE...WEND 循 环 ;<br />

• IF...ELSE...ENDIF 条 件 结 构 ;<br />

• INCLUDE 文 件 包 含 。<br />

该 限 制 适 用 于 放 到 一 起 的 所 有 结 构 , 不 论 它 们 是 如 何 嵌 套 的 。 并 不 是 每 种 结 构 类<br />

型 都 是 256 层 限 制 。<br />

7-26 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.4.2 MACRO 和 MEND<br />

MACRO 命 令 标 记 一 个 宏 定 义 的 开 始 。 宏 扩 展 在 MEND 命 令 处 终 止 。 有 关 详 细 信 息 请<br />

参 阅 第 2-50 页 的 使 用 宏 。<br />

语 法<br />

这 两 个 命 令 用 于 定 义 一 个 宏 。 其 语 法 是 :<br />

MACRO<br />

{$label} macroname {$parameter{,$parameter}...}<br />

; code<br />

MEND<br />

其 中 :<br />

$label<br />

是 一 个 参 数 , 用 调 用 宏 时 提 供 的 符 号 替 换 。 该 符 号 通 常 是 一<br />

个 标 号 。<br />

macroname 是 宏 的 名 称 。 它 不 能 以 一 个 指 令 或 命 令 名 开 始 。<br />

$parameter<br />

用 法<br />

是 调 用 宏 时 被 替 换 的 一 个 参 数 。 可 用 以 下 格 式 设 置 一 个 参 数<br />

的 默 认 值 :<br />

$parameter=" 默 认 值 "<br />

如 果 默 认 值 内 或 两 端 有 空 格 , 则 必 须 使 用 双 引 号 。<br />

如 果 在 一 个 宏 内 开 始 任 何 WHILE...WEND 循 环 或 IF...ENDIF 条 件 , 则 必 须 在 到 达<br />

MEND 命 令 之 前 结 束 它 们 。 如 果 需 要 允 许 提 前 从 一 个 宏 内 退 出 ( 例 如 从 一 个 循 环<br />

内 ), 请 参 阅 第 7-29 页 的 MEXIT。<br />

在 宏 体 内 , 可 以 像 其 它 变 量 一 样 使 用 类 似 于 $label、$parameter 等 参 数 ( 请 参 阅<br />

第 3-14 页 的 汇 编 时 的 变 量 替 换 )。 每 次 调 用 宏 时 , 都 为 它 们 指 定 新 的 值 。 参 数 必<br />

须 以 $ 开 始 , 以 区 别 于 常 规 的 符 号 。 可 以 使 用 任 意 数 目 的 参 数 。<br />

$label 是 可 选 的 。 如 果 宏 定 义 了 内 部 标 号 , 则 它 很 有 用 。 它 被 当 作 宏 的 一 个 参<br />

数 。 其 不 一 定 代 表 宏 扩 展 中 的 第 一 个 指 令 。 宏 定 义 任 何 标 号 的 位 置 。<br />

使 用 | 作 为 自 变 量 来 使 用 参 数 的 默 认 值 。 如 果 忽 略 该 自 变 量 , 则 使 用 一 个 空 字<br />

符 串 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-27


命 令 参 考<br />

在 一 个 使 用 几 个 内 部 标 号 的 宏 内 , 将 每 个 内 部 标 号 定 义 为 带 有 不 同 后 缀 的 基 址<br />

标 号 会 很 有 用 。<br />

如 果 在 扩 展 中 不 需 要 空 格 , 则 在 一 个 参 数 与 后 面 的 文 本 或 参 数 之 间 使 用 一 个 圆<br />

点 。 不 得 在 前 面 的 文 本 与 一 个 参 数 之 间 使 用 圆 点 。<br />

宏 定 义 了 局 部 变 量 的 作 用 范 围 ( 请 参 阅 第 7-6 页 的 LCLA、 LCLL 和 LCLS)。<br />

宏 可 以 被 嵌 套 ( 请 参 阅 第 7-26 页 的 嵌 套 命 令 )。<br />

示 例<br />

;macro definition<br />

MACRO<br />

$label xmac $p1,$p2<br />

; code<br />

$label.loop1 ; code<br />

; code<br />

BGE $label.loop1<br />

$label.loop2 ; code<br />

BL $p1<br />

BGT $label.loop2<br />

; code<br />

ADR $p2<br />

; code<br />

MEND<br />

; start macro definition<br />

; end macro definition<br />

; macro invocation<br />

abc xmac subr1,de ; invoke macro<br />

; code ; this is what is<br />

abcloop1 ; code ; is produced when<br />

; code ; the xmac macro is<br />

BGE abcloop1 ; expanded<br />

abcloop2 ; code<br />

BL subr1<br />

BGT abcloop2<br />

; code<br />

ADR de<br />

; code<br />

7-28 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

使 用 宏 来 生 成 汇 编 时 的 诊 断 信 息 :<br />

MACRO<br />

; Macro definition<br />

diagnose $param1="default" ; This macro produces<br />

INFO 0,"$param1" ; assembly-time diagnostics<br />

MEND<br />

; (on second assembly pass)<br />

; macro expansion<br />

diagnose<br />

diagnose "hello"<br />

diagnose |<br />

; Prints blank line at assembly-time<br />

; Prints "hello" at assembly-time<br />

; Prints "default" at assembly-time<br />

7.4.3 MEXIT<br />

MEXIT 命 令 用 于 在 宏 结 束 之 前 退 出 宏 定 义 。<br />

用 法<br />

当 需 要 从 一 个 宏 体 内 退 出 时 , 可 使 用 MEXIT。 在 退 出 宏 之 前 , 宏 体 内 的 任 何 未 结<br />

束 的 WHILE...WEND 循 环 或 IF...ENDIF 条 件 将 由 汇 编 程 序 结 束 。<br />

另 请 参 阅 第 7-27 页 的 MACRO 和 MEND。<br />

示 例<br />

MACRO<br />

$abc macro abc $param1,$param2<br />

; code<br />

WHILE condition1<br />

; code<br />

IF condition2<br />

; code<br />

MEXIT<br />

ELSE<br />

; code<br />

ENDIF<br />

WEND<br />

; code<br />

MEND<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-29


命 令 参 考<br />

7.4.4 IF、 ELSE、 ENDIF 和 ELIF<br />

IF 命 令 引 入 一 个 条 件 , 用 于 决 定 是 否 汇 编 一 个 指 令 序 列 和 / 或 一 些 命 令 。[ 是 IF<br />

的 一 个 同 义 词 。<br />

ELSE 命 令 标 记 一 个 指 令 和 / 或 命 令 序 列 的 开 始 , 如 果 不 满 足 前 面 的 条 件 , 则 要 汇<br />

编 该 序 列 。 | 是 ELSE 的 一 个 同 义 词 。<br />

ENDIF 命 令 标 记 一 个 要 进 行 条 件 汇 编 的 指 令 和 / 或 命 令 序 列 的 结 束 。] 是 ENDIF 的<br />

一 个 同 义 词 。<br />

ELIF 命 令 生 成 一 个 与 ELSE IF 等 价 的 结 构 , 而 无 需 嵌 套 或 重 复 条 件 。 详 细 信 息 请<br />

参 阅 第 7-31 页 的 使 用 ELIF。<br />

语 法<br />

IF logical-expression<br />

...<br />

{ELSE<br />

...}<br />

ENDIF<br />

其 中 :<br />

logical-expression 是 一 个 取 值 为 {TRUE} 或 {FALSE} 的 表 达 式 。<br />

请 参 阅 第 3-30 页 的 关 系 运 算 符 。<br />

用 法<br />

对 于 只 能 在 指 定 的 条 件 下 被 汇 编 或 执 行 的 指 令 和 / 或 命 令 序 列 , 使 用 IF 和 ENDIF<br />

以 及 可 选 的 ELSE。<br />

IF...ENDIF 条 件 可 以 被 嵌 套 ( 请 参 阅 第 7-26 页 的 嵌 套 命 令 )。<br />

7-30 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

使 用 ELIF<br />

不 使 用 ELIF 时 , 可 以 构 造 类 似 如 下 的 一 组 嵌 套 的 条 件 指 令 :<br />

IF logical-expression<br />

instructions<br />

ELSE<br />

IF logical-expression2<br />

instructions<br />

ELSE<br />

IF logical-expression3<br />

instructions<br />

ENDIF<br />

ENDIF<br />

ENDIF<br />

类 似 这 样 的 嵌 套 结 构 可 以 最 多 嵌 套 到 256 层 深 。<br />

使 用 ELIF 可 以 更 简 单 地 编 写 相 同 的 结 构 :<br />

IF logical-expression<br />

instructions<br />

ELIF logical-expression2<br />

instructions<br />

ELIF logical-expression3<br />

instructions<br />

ENDIF<br />

对 于 IF ENDIF 命 令 对 , 此 结 构 只 在 当 前 嵌 套 深 度 上 增 加 1 层 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-31


命 令 参 考<br />

示 例<br />

示 例 7-3 中 , 如 果 定 义 了 NEWVERSION 则 汇 编 第 一 个 指 令 集 , 否 则 汇 编 备 选 指 令 集 。<br />

示 例 7-3 根 据 一 个 变 量 的 定 义 执 行 条 件 汇 编<br />

IF :DEF:NEWVERSION<br />

; first set of instructions/directives<br />

ELSE<br />

; alternative set of instructions/directives<br />

ENDIF<br />

按 如 下 方 式 调 用 armasm 来 定 义 NEWVERSION, 以 便 汇 编 第 一 个 指 令 和 命 令 集 :<br />

armasm -PD "NEWVERSION SETL {TRUE}" test.s<br />

按 如 下 方 式 调 用 armasm 将 不 定 义 NEWVERSION, 以 便 汇 编 第 二 个 指 令 和 命 令 集 :<br />

armasm test.s<br />

示 例 7-4 中 , 如 果 NEWVERSION 的 值 为 {TRUE}, 则 汇 编 第 一 个 指 令 集 , 否 则 汇 编 备<br />

选 指 令 集 。<br />

示 例 7-4 根 据 一 个 变 量 的 定 义 执 行 条 件 汇 编<br />

IF NEWVERSION = {TRUE}<br />

; first set of instructions/directives<br />

ELSE<br />

; alternative set of instructions/directives<br />

ENDIF<br />

按 如 下 方 式 调 用 armasm, 将 造 成 汇 编 第 一 个 指 令 和 命 令 集 :<br />

armasm -PD "NEWVERSION SETL {TRUE}" test.s<br />

按 如 下 方 式 调 用 armasm, 将 造 成 汇 编 第 二 个 指 令 和 命 令 集 :<br />

armasm -PD "NEWVERSION SETL {FALSE}" test.s<br />

7-32 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.4.5 WHILE 和 WEND<br />

WHILE 命 令 开 始 一 个 要 重 复 汇 编 的 指 令 或 命 令 序 列 。 该 序 列 用 一 个 WEND 命 令 终 止 。<br />

语 法<br />

WHILE logical-expression<br />

code<br />

WEND<br />

其 中 :<br />

logical-expression<br />

是 一 个 取 值 为 {TRUE} 或 {FALSE} 的 表 达 式 ( 请 参 阅 第 3-23 页 的 逻 辑<br />

表 达 式 )。<br />

用 法<br />

将 WHILE 与 WEND 命 令 一 起 使 用 , 可 以 将 一 个 指 令 序 列 汇 编 很 多 次 。 重 复 次 数 可 以<br />

是 零 。<br />

可 以 在 WHILE...WEND 循 环 内 使 用 IF...ENDIF 。<br />

可 以 嵌 套 WHILE...WEND 循 环 ( 请 参 阅 第 7-26 页 的 嵌 套 命 令 )。<br />

示 例<br />

count SETA 1 ; you are not restricted to<br />

WHILE count


命 令 参 考<br />

7.5 结 构 描 述 命 令<br />

本 节 介 绍 下 列 命 令 :<br />

• 第 7-35 页 的 FRAME ADDRESS ;<br />

• 第 7-36 页 的 FRAME POP ;<br />

• 第 7-37 页 的 FRAME PUSH ;<br />

• 第 7-38 页 的 FRAME REGISTER ;<br />

• 第 7-39 页 的 FRAME RESTORE ;<br />

• 第 7-40 页 的 FRAME RETURN ADDRESS ;<br />

• 第 7-41 页 的 FRAME SAVE ;<br />

• 第 7-42 页 的 FRAME STATE REMEMBER ;<br />

• 第 7-43 页 的 FRAME STATE RESTORE ;<br />

• 第 7-44 页 的 FUNCTION 或 PROC ;<br />

• 第 7-45 页 的 ENDFUNC 或 ENDP。<br />

正 确 使 用 下 面 这 些 命 令 可 以 :<br />

• 允 许 用 armlink -callgraph 选 项 计 算 汇 编 程 序 函 数 的 栈 使 用 量 ;<br />

• 帮 助 避 免 函 数 构 造 中 的 错 误 , 特 别 是 正 在 修 改 现 有 的 代 码 时 ;<br />

• 允 许 汇 编 程 序 对 函 数 构 造 中 的 错 误 发 出 警 告 ;<br />

• 在 调 试 时 启 用 函 数 调 用 的 回 溯 ;<br />

• 允 许 调 试 程 序 剖 析 汇 编 程 序 函 数 。<br />

如 果 需 要 剖 析 汇 编 程 序 函 数 , 但 出 于 其 它 目 的 而 不 需 要 结 构 描 述 命 令 :<br />

• 必 须 使 用 FUNCTION 和 ENDFUNC 命 令 , 或 者 使 用 PROC 和 ENDP 命 令 ;<br />

• 可 以 忽 略 其 它 FRAME 命 令 ;<br />

• 您 只 需 为 所 要 剖 析 的 函 数 使 用 FUNCTION 和 ENDFUNC 命 令 。<br />

在 DWARF 2 中 , 规 范 框 架 地 址 是 栈 上 的 一 个 地 址 , 其 指 定 一 个 中 断 函 数 的 调 用<br />

框 架 的 位 置 。<br />

7-34 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.5.1 FRAME ADDRESS<br />

FRAME ADDRESS 命 令 说 明 如 何 为 后 面 的 指 令 计 算 规 范 框 架 地 址 。 只 能 在 含 有<br />

FUNCTION 和 ENDFUNC 命 令 , 或 含 有 PROC 和 ENDP 命 令 的 函 数 内 使 用 它 。<br />

语 法<br />

FRAME ADDRESS reg[,offset]<br />

其 中 :<br />

reg<br />

是 规 范 框 架 地 址 所 基 于 的 寄 存 器 。 这 一 般 是 sp, 除 非 函 数 使 用 了 独<br />

立 的 框 架 指 针 。<br />

offset 是 规 范 框 架 地 址 从 reg 起 的 偏 移 量 。 如 果 offset 是 0, 可 以 省 略 它 。<br />

用 法<br />

如 果 代 码 改 变 了 规 范 框 架 地 址 的 基 址 寄 存 器 , 或 者 如 果 代 码 改 变 了 规 范 框 架 地<br />

址 对 该 寄 存 器 的 偏 移 量 , 就 可 使 用 FRAME ADDRESS。 必 须 在 改 变 规 范 框 架 地 址 的 计<br />

算 方 式 的 指 令 之 后 , 立 即 使 用 FRAME ADDRESS。<br />

备 注<br />

如 果 代 码 使 用 了 单 个 指 令 来 保 存 寄 存 器 和 改 变 栈 指 针 , 可 以 使 用 FRAME PUSH 来 代<br />

替 FRAME ADDRESS 和 FRAME SAVE ( 请 参 阅 第 7-37 页 的 FRAME PUSH)。<br />

如 果 代 码 使 用 了 单 个 指 令 来 装 载 寄 存 器 和 改 变 栈 指 针 , 可 以 使 用 FRAME POP 来 代<br />

替 FRAME ADDRESS 和 FRAME RESTORE ( 请 参 阅 第 7-36 页 的 FRAME POP)。<br />

示 例<br />

_fn FUNCTION ; CFA (Canonical Frame Address) is value<br />

; of sp on entry to function<br />

STMFD sp!, {r4,fp,ip,lr,pc}<br />

FRAME PUSH {r4,fp,ip,lr,pc}<br />

SUB sp,sp,#4 ; CFA offset now changed<br />

FRAME ADDRESS sp,24<br />

; - so we correct it<br />

ADD fp,sp,#20<br />

FRAME ADDRESS fp,4<br />

; New base register<br />

; code using fp to base call-frame on, instead of sp<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-35


命 令 参 考<br />

7.5.2 FRAME POP<br />

当 被 调 用 代 码 重 新 装 载 寄 存 器 时 , 使 用 FRAME POP 命 令 来 通 知 汇 编 程 序 。 只 能 在<br />

包 含 FUNCTION 和 ENDFUNC 命 令 或 在 PROC 和 ENDP 命 令 的 函 数 内 使 用 它 。<br />

在 函 数 的 最 后 一 条 指 令 后 不 需 要 这 样 做 。<br />

语 法<br />

FRAME POP 有 两 种 备 选 语 法 :<br />

FRAME POP {reglist}<br />

FRAME POP n<br />

其 中 :<br />

reglist 是 一 个 恢 复 进 入 函 数 的 值 的 寄 存 器 列 表 。 列 表 中 必 须 至 少 有 一 个 寄<br />

存 器 。<br />

n 是 堆 指 针 移 动 的 字 节 数 。<br />

用 法<br />

FRAME POP 等 价 于 FRAME ADDRESS 和 FRAME RESTORE 命 令 。 当 单 个 指 令 装 载 寄 存 器 和<br />

改 变 栈 指 针 时 , 可 以 使 用 它 。<br />

必 须 在 其 涉 及 到 的 指 令 后 立 即 使 用 FRAME POP。<br />

汇 编 程 序 计 算 规 范 框 架 地 址 的 新 偏 移 量 。 其 假 定 :<br />

• 弹 出 的 每 个 <strong>ARM</strong> 寄 存 器 占 用 栈 上 的 四 个 字 节 ;<br />

• 弹 出 的 每 个 FPA 浮 点 寄 存 器 占 用 栈 上 的 12 个 字 节 ;<br />

• 弹 出 的 每 个 VFP 单 精 度 寄 存 器 占 用 栈 上 的 四 个 字 节 , 对 每 个 列 表 另 加 上 一<br />

个 附 加 的 四 字 节 字 。<br />

请 参 阅 第 7-35 页 的 FRAME ADDRESS 和 第 7-39 页 的 FRAME RESTORE。<br />

7-36 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.5.3 FRAME PUSH<br />

当 被 调 用 函 数 保 存 寄 存 器 时 ( 通 常 在 函 数 入 口 点 处 ), 使 用 FRAME PUSH 命 令 来 通<br />

知 汇 编 程 序 。 只 能 在 包 含 FUNCTION 和 ENDFUNC 命 令 或 在 PROC 和 ENDP 命 令 的 函 数 内<br />

使 用 它 。<br />

语 法<br />

FRAME PUSH 有 两 种 备 选 语 法 :<br />

FRAME PUSH {reglist}<br />

FRAME PUSH n<br />

其 中 :<br />

reglist 是 一 个 在 规 范 框 架 地 址 后 连 续 保 存 的 寄 存 器 列 表 。 列 表 中 必 须 至 少<br />

有 一 个 寄 存 器 。<br />

n 是 栈 指 针 移 动 的 字 节 数 。<br />

用 法<br />

FRAME PUSH 等 价 于 FRAME ADDRESS 和 FRAME SAVE 命 令 。 当 单 个 指 令 装 载 寄 存 器 和 改<br />

变 栈 指 针 时 , 可 以 使 用 它 。<br />

必 须 在 其 涉 及 到 的 指 令 后 立 即 使 用 FRAME PUSH。<br />

汇 编 程 序 计 算 规 范 框 架 地 址 的 新 偏 移 量 。 其 假 定 :<br />

• 推 入 的 每 个 <strong>ARM</strong> 寄 存 器 占 用 栈 上 的 四 个 字 节 ;<br />

• 推 入 的 每 个 FPA 浮 点 寄 存 器 占 用 栈 上 的 12 个 字 节 ;<br />

• 推 入 的 每 个 VFP 单 精 度 寄 存 器 占 用 栈 上 的 四 个 字 节 , 对 每 个 列 表 另 加 上 一<br />

个 附 加 的 四 字 节 字 。<br />

请 参 阅 第 7-35 页 的 FRAME ADDRESS 和 第 7-41 页 的 FRAME SAVE。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-37


命 令 参 考<br />

示 例<br />

p PROC ; Canonical frame address is sp + 0<br />

EXPORT p<br />

STMFD sp!,{r4-r6,lr}<br />

; sp has moved relative to the canonical frame address,<br />

; and registers r4, r5, r6 and lr are now on the stack<br />

FRAME PUSH {r4-r6,lr}<br />

; Equivalent to:<br />

; FRAME ADDRESS sp,16 ; 16 bytes in {r4-r6,lr}<br />

; FRAME SAVE {r4-r6,lr},-16<br />

7.5.4 FRAME REGISTER<br />

使 用 FRAME REGISTER 命 令 保 存 寄 存 器 中 存 放 的 函 数 自 变 量 位 置 的 一 个 记 录 。 只 能<br />

在 包 含 FUNCTION 和 ENDFUNC 命 令 或 在 PROC 和 ENDP 命 令 的 函 数 内 使 用 它 。<br />

语 法<br />

FRAME REGISTER reg1,reg2<br />

其 中 :<br />

reg1 是 存 放 函 数 入 口 点 自 变 量 的 寄 存 器 。<br />

reg2 是 要 用 于 保 存 参 数 值 的 寄 存 器 。<br />

用 法<br />

当 使 用 一 个 寄 存 器 来 保 存 在 进 入 函 数 时 存 放 在 一 个 不 同 的 寄 存 器 中 的 自 变 量<br />

时 , 可 使 用 FRAME REGISTER 命 令 。<br />

7-38 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.5.5 FRAME RESTORE<br />

使 用 FRAME RESTORE 命 令 来 通 知 汇 编 程 序 : 指 定 的 寄 存 器 的 内 容 已 被 恢 复 为 进 入<br />

函 数 时 存 放 的 值 。 只 能 在 包 含 FUNCTION 和 ENDFUNC 命 令 或 在 PROC 和 ENDP 命 令 的 函<br />

数 内 使 用 它 。<br />

语 法<br />

FRAME RESTORE {reglist}<br />

其 中 :<br />

reglist 是 已 恢 复 其 内 容 的 一 个 寄 存 器 列 表 。 列 表 中 必 须 至 少 有 一 个 寄 存 器 。<br />

用 法<br />

在 被 调 用 函 数 从 栈 中 重 新 加 载 寄 存 器 后 , 立 即 使 用 FRAME RESTORE。 在 函 数 的 最 后<br />

一 条 指 令 后 不 需 要 这 样 做 。<br />

reglist 可 以 包 含 整 数 寄 存 器 或 浮 点 寄 存 器 , 但 不 能 同 时 包 含 。<br />

备 注<br />

如 果 代 码 使 用 了 单 个 指 令 来 加 载 寄 存 器 和 改 变 栈 指 针 , 可 以 使 用 FRAME POP 来 代<br />

替 FRAME ADDRESS 和 FRAME RESTORE ( 请 参 阅 第 7-36 页 的 FRAME POP)。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-39


命 令 参 考<br />

7.5.6 FRAME RETURN ADDRESS<br />

FRAME RETURN ADDRESS 命 令 为 使 用 除 r14 外 的 寄 存 器 的 函 数 提 供 其 返 回 地 址 。 只 能<br />

在 包 含 FUNCTION 和 ENDFUNC 命 令 或 与 PROC 和 ENDP 命 令 的 函 数 内 使 用 它 。<br />

备 注<br />

使 用 非 r14 寄 存 器 作 为 其 返 回 地 址 的 任 何 函 数 与 ATPCS 不 兼 容 。 这 种 函 数 不 能<br />

被 导 出 。<br />

语 法<br />

FRAME RETURN ADDRESS reg<br />

其 中 :<br />

reg 是 用 作 返 回 地 址 的 寄 存 器 。<br />

用 法<br />

在 不 使 用 r14 作 为 其 返 回 地 址 的 任 何 函 数 中 使 用 FRAME RETURN ADDRESS 命 令 。 否<br />

则 , 调 试 程 序 不 能 回 溯 该 函 数 。<br />

在 引 入 该 函 数 的 FUNCTION 或 PROC 命 令 后 立 即 使 用 FRAME RETURN ADDRESS。<br />

7-40 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.5.7 FRAME SAVE<br />

FRAME SAVE 命 令 描 述 所 保 存 的 寄 存 器 内 容 相 对 于 规 范 框 架 地 址 的 位 置 。 只 能 在 包<br />

含 FUNCTION 和 ENDFUNC 命 令 或 与 PROC 和 ENDP 命 令 的 函 数 内 使 用 它 。<br />

语 法<br />

FRAME SAVE {reglist}, offset<br />

其 中 :<br />

reglist 是 从 规 范 框 架 地 址 偏 移 offset 处 开 始 连 续 保 存 的 一 个 寄 存 器 列 表 。<br />

列 表 中 必 须 至 少 有 一 个 寄 存 器 。<br />

用 法<br />

在 被 调 用 函 数 将 寄 存 器 存 储 到 堆 栈 中 后 , 立 即 使 用 FRAME SAVE。<br />

reglist 可 以 包 含 回 溯 不 需 要 的 寄 存 器 。 汇 编 程 序 确 定 需 要 在 DWARF 调 用 框 架<br />

信 息 中 记 录 哪 些 寄 存 器 。<br />

备 注<br />

如 果 代 码 使 用 单 个 指 令 来 保 存 寄 存 器 和 改 变 堆 栈 指 针 , 可 以 使 用 FRAME PUSH 来 代<br />

替 FRAME SAVE 和 FRAME ADDRESS ( 请 参 阅 第 7-37 页 的 FRAME PUSH)。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-41


命 令 参 考<br />

7.5.8 FRAME STATE REMEMBER<br />

FRAME STATE REMEMBER 命 令 保 存 关 于 如 何 计 算 规 范 框 架 地 址 , 以 及 已 保 存 的 寄 存 器<br />

值 的 位 置 的 当 前 信 息 。 只 能 在 包 含 FUNCTION 和 ENDFUNC 命 令 或 与 PROC 和 ENDP 命 令<br />

的 函 数 内 使 用 它 。<br />

语 法<br />

FRAME STATE REMEMBER<br />

用 法<br />

在 一 个 内 联 的 退 出 序 列 过 程 中 , 会 改 变 关 于 规 范 框 架 地 址 的 计 算 信 息 以 及 已 保<br />

存 的 寄 存 器 值 的 位 置 信 息 。 在 退 出 序 列 之 后 , 另 一 个 跳 转 可 以 继 续 像 以 前 一 样 使<br />

用 相 同 的 信 息 。 使 用 FRAME STATE REMEMBER 来 保 存 这 些 信 息 , 使 用 FRAME STATE<br />

RESTORE 来 恢 复 它 。<br />

可 以 嵌 套 这 些 命 令 。 每 个 FRAME STATE RESTORE 命 令 必 须 拥 有 对 应 的 FRAME STATE<br />

REMEMBER 命 令 。 请 参 阅 :<br />

• 第 7-43 页 的 FRAME STATE RESTORE ;<br />

• 第 7-44 页 的 FUNCTION 或 PROC。<br />

示 例<br />

exitB<br />

; function code<br />

FRAME STATE REMEMBER<br />

; save frame state before in-line exit sequence<br />

LDMFD sp!,{r4-r6,pc}<br />

; no need to FRAME POP here, as control has<br />

; transferred out of the function<br />

FRAME STATE RESTORE<br />

; end of exit sequence, so restore state<br />

; code for exitB<br />

LDMFD sp!,{r4-r6,pc}<br />

ENDP<br />

7-42 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.5.9 FRAME STATE RESTORE<br />

FRAME STATE RESTORE 命 令 恢 复 关 于 如 何 计 算 信 息 规 范 框 架 地 址 和 已 保 存 的 寄 存 器<br />

值 的 位 置 信 息 。 只 能 在 包 含 FUNCTION 和 ENDFUNC 命 令 或 在 PROC 和 ENDP 命 令 的 函 数<br />

内 使 用 它 。<br />

语 法<br />

FRAME STATE RESTORE<br />

用 法<br />

请 参 阅 :<br />

• 第 7-42 页 的 FRAME STATE REMEMBER ;<br />

• 第 7-44 页 的 FUNCTION 或 PROC。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-43


命 令 参 考<br />

7.5.10 FUNCTION 或 PROC<br />

FUNCTION 命 令 标 记 一 个 兼 容 ATPCS 的 函 数 开 始 。 PROC 是 FUNCTION 的 一 个 同 义 词 。<br />

语 法<br />

label FUNCTION [{Reglist1} [, {Reglist2}]]<br />

其 中 :<br />

reglist1<br />

是 一 个 可 选 的 由 被 调 用 函 数 保 存 的 <strong>ARM</strong> 寄 存 器 列 表 。 如 果 reglist1<br />

不 出 现 , 并 且 调 试 程 序 检 查 寄 存 器 使 用 情 况 , 则 将 假 定 正 在 使 用<br />

ATPCS。<br />

reglist2 是 一 个 可 选 的 由 被 调 用 函 数 保 存 的 VFP 寄 存 器 列 表 。<br />

用 法<br />

使 用 FUNCTION 来 标 记 函 数 的 开 始 。 在 为 ELF 生 成 DWARF 调 用 框 架 信 息 时 , 汇<br />

编 程 序 使 用 FUNCTION 来 标 识 一 个 函 数 的 开 始 。<br />

FUNCTION 将 规 范 框 架 地 址 设 置 为 sp, 并 将 框 架 状 态 栈 清 空 。<br />

每 个 FUNCTION 命 令 必 须 有 一 个 相 匹 配 的 ENDFUNC 命 令 。 不 能 嵌 套 FUNCTION/ENDFUNC<br />

对 , 并 且 它 们 不 能 包 含 PROC 或 ENDP 命 令 。<br />

如 果 正 在 使 用 自 己 的 程 序 调 用 标 准 , 可 以 使 用 可 选 的 reglist 参 数 来 将 有 关 此 备<br />

选 程 序 调 用 标 准 的 信 息 通 知 调 试 程 序 。 并 非 所 有 调 试 程 序 都 支 持 此 功 能 。 详 细 信<br />

息 请 参 阅 所 用 调 试 器 的 程 序 。<br />

另 请 参 阅 第 7-35 页 的 FRAME ADDRESS 到 第 7-43 页 的 FRAME STATE<br />

RESTORE。<br />

示 例<br />

dadd<br />

func6<br />

FUNCTION<br />

EXPORT dadd<br />

STMFD sp!,{r4-r6,lr}<br />

FRAME PUSH {r4-r6,lr}<br />

; subroutine body<br />

LDMFD sp!,{r4-r6,pc}<br />

ENDFUNC<br />

PROC {r4-r8,r12},{D1-D3} ; non-ATPCS-conforming function<br />

...<br />

ENDP<br />

7-44 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.5.11 ENDFUNC 或 ENDP<br />

ENDFUNC 命 令 标 记 一 个 与 ATPCS 兼 容 函 数 的 结 束 ( 请 参 阅 第 7-44 页 的 FUNCTION<br />

或 PROC)。 ENDP 是 ENDFUNC 的 一 个 同 义 词 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-45


命 令 参 考<br />

7.6 报 告 命 令<br />

本 节 介 绍 下 列 命 令 :<br />

• ASSERT<br />

在 汇 编 时 , 如 果 一 个 声 明 是 假 的 , 则 产 生 一 条 错 误 信 息 。<br />

• 第 7-47 页 的 INFO<br />

在 汇 编 时 产 生 诊 断 信 息 。<br />

• 第 7-48 页 的 OPT<br />

设 置 列 表 选 项 。<br />

• 第 7-50 页 的 TTL 和 SUBT<br />

在 列 表 中 插 入 标 题 和 小 标 题 。<br />

7.6.1 ASSERT<br />

在 第 二 轮 汇 编 时 , 如 果 一 个 给 定 的 声 明 是 假 的 ,ASSERT 命 令 产 生 一 条 错 误 信 息 。<br />

语 法<br />

ASSERT logical-expression<br />

其 中 :<br />

logical-expression<br />

是 一 个 可 取 值 为 {TRUE} 或 {FALSE} 的 声 明 。<br />

用 法<br />

使 用 ASSERT 来 确 保 在 汇 编 时 , 任 何 必 要 的 条 件 能 得 以 满 足 。<br />

如 果 声 明 是 假 的 , 则 产 生 一 条 错 误 信 息 , 并 且 汇 编 失 败 。<br />

另 请 参 阅 第 7-47 页 的 INFO。<br />

示 例<br />

ASSERT label1


命 令 参 考<br />

7.6.2 INFO<br />

INFO 命 令 支 持 在 每 一 轮 汇 编 过 程 中 产 生 诊 断 信 息 。<br />

! 与 INFO 相 似 , 但 输 出 报 告 相 对 简 单 。<br />

语 法<br />

INFO numeric-expression, string-expression<br />

其 中 :<br />

numeric-expression<br />

string-expression<br />

用 法<br />

是 在 汇 编 时 取 值 的 一 个 数 值 表 达 式 。 如 果 该 表 达 式 的 值 等 于 零 :<br />

• 在 第 一 轮 汇 编 时 不 执 行 操 作 ;<br />

• 在 第 二 轮 汇 编 时 显 示 string-expression。<br />

如 果 该 表 达 式 的 值 不 等 于 零 , 则 显 示 string-expression 作 为 错 误 信<br />

息 , 并 且 汇 编 失 败 。<br />

是 取 值 为 一 个 字 符 串 的 表 达 式 。<br />

INFO 提 供 了 灵 活 的 方 式 来 生 成 自 定 义 错 误 信 息 。 有 关 数 值 表 达 式 和 字 符 串 表 达<br />

式 的 其 它 信 息 , 请 参 阅 第 3-20 页 的 数 字 表 达 式 和 第 3-19 页 的 字 符 串 表 达 式 。<br />

另 请 参 阅 第 7-46 页 的 ASSERT。<br />

示 例<br />

INFO 0, "Version 1.0"<br />

IF endofdata


命 令 参 考<br />

7.6.3 OPT<br />

OPT 命 令 从 源 代 码 内 设 置 列 表 选 项 。<br />

语 法<br />

OPT n<br />

其 中 :<br />

n 是 OPT 命 令 设 置 。 表 7-2 列 出 了 有 效 的 设 置 。<br />

表 7-2 OPT 命 令 设 置<br />

OPT n<br />

效 果<br />

1 启 用 常 规 列 表 。<br />

2 关 闭 常 规 列 表 。<br />

4 进 页 。 产 生 一 个 立 即 换 页 并 开 始 一 个 新 页 。<br />

8 将 行 号 计 数 器 重 置 为 零 。<br />

16 启 用 SET、 GBL 和 LCL 命 令 的 列 表 。<br />

32 关 闭 SET、 GBL 和 LCL 命 令 的 列 表 。<br />

64 启 用 宏 扩 展 的 列 表 。<br />

128 关 闭 宏 扩 展 的 列 表 。<br />

256 启 用 宏 调 用 的 列 表 。<br />

512 关 闭 宏 调 用 的 列 表 。<br />

1024 启 用 第 一 轮 汇 编 列 表 。<br />

2048 关 闭 第 一 轮 汇 编 列 表 。<br />

4096 启 用 条 件 命 令 的 列 表 。<br />

8192 关 闭 条 件 命 令 的 列 表 。<br />

16384 打 开 MEND 命 令 的 列 表 。<br />

32768 关 闭 MEND 命 令 的 列 表 。<br />

7-48 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

用 法<br />

指 定 -list 汇 编 程 序 选 项 以 启 用 列 表 。<br />

默 认 情 况 下 , -list 选 项 产 生 一 个 普 通 列 表 , 其 中 包 含 变 量 声 明 、 宏 扩 展 、 调 用<br />

条 件 命 令 以 及 MEND 命 令 。 列 表 仅 在 第 二 轮 汇 编 时 产 生 。 使 用 OPT 命 令 来 从 代 码 内<br />

修 改 默 认 列 表 选 项 。 有 关 -list 选 项 的 信 息 , 请 参 阅 第 3-2 页 的 命 令 语 法 。<br />

可 以 使 用 OPT 来 格 式 化 代 码 列 表 。 例 如 , 可 以 在 函 数 和 段 前 指 定 一 个 新 页 。<br />

示 例<br />

start<br />

func1<br />

AREA<br />

; code<br />

; code<br />

BL<br />

; code<br />

OPT 4<br />

; code<br />

Example, CODE, READONLY<br />

func1<br />

; places a page break before func1<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-49


命 令 参 考<br />

7.6.4 TTL 和 SUBT<br />

TTL 命 令 在 一 个 列 表 文 件 的 每 页 开 头 插 入 一 个 标 题 。 在 每 页 上 打 印 标 题 , 直 到 发<br />

出 一 个 新 的 TTL 命 令 为 止 。<br />

SUBT 命 令 在 一 个 列 表 文 件 的 各 页 上 放 置 一 个 小 标 题 。 在 每 页 上 打 印 小 标 题 , 直 到<br />

发 出 一 个 新 的 SUBT 命 令 为 止 。<br />

语 法<br />

TTL title<br />

SUBT subtitle<br />

其 中 :<br />

title<br />

subtitle<br />

是 标 题<br />

是 小 标 题<br />

用 法<br />

使 用 TTL 命 令 在 一 个 列 表 文 件 的 每 页 顶 部 插 入 一 个 小 标 题 。 如 果 想 让 标 题 出 现 在<br />

第 一 页 , 那 么 TTL 命 令 必 须 在 源 文 件 的 第 一 行 。<br />

使 用 附 加 的 TTL 命 令 可 更 改 标 题 。 每 个 新 的 TTL 命 令 从 下 一 页 的 顶 部 开 始 生 效 。<br />

使 用 SUBT 命 令 在 一 个 列 表 文 件 的 每 页 顶 部 插 入 一 个 小 标 题 。 小 标 题 出 现 在 标 题<br />

下 面 的 行 中 。 如 果 想 让 小 标 题 出 现 在 第 一 页 , 那 么 SUBT 命 令 必 须 在 源 文 件 的 第<br />

一 行 。<br />

使 用 附 加 的 SUBT 命 令 可 更 改 小 标 题 。 每 个 新 的 SUBT 命 令 从 下 一 页 的 顶 部 开 始 生 效 。<br />

示 例<br />

TTL First Title ; places a title on the first<br />

; and subsequent pages of a<br />

; listing file.<br />

SUBT First Subtitle ; places a subtitle on the<br />

; second and subsequent pages<br />

; of a listing file.<br />

7-50 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.7 其 它 命 令<br />

本 节 介 绍 下 列 命 令 :<br />

• 第 7-52 页 的 ALIGN ;<br />

• 第 7-54 页 的 AREA ;<br />

• 第 7-57 页 的 CODE16 和 CODE32 ;<br />

• 第 7-58 页 的 END ;<br />

• 第 7-59 页 的 ENTRY ;<br />

• 第 7-60 页 的 EQU ;<br />

• 第 7-61 页 的 EXPORT 或 GLOBAL ;<br />

• 第 7-63 页 的 EXTERN ;<br />

• 第 7-64 页 的 GET 或 INCLUDE ;<br />

• 第 7-65 页 的 GLOBAL ;<br />

• 第 7-65 页 的 IMPORT ;<br />

• 第 7-66 页 的 INCBIN ;<br />

• 第 7-66 页 的 INCLUDE ;<br />

• 第 7-67 页 的 KEEP ;<br />

• 第 7-68 页 的 NOFP ;<br />

• 第 7-68 页 的 REQUIRE ;<br />

• 第 7-69 页 的 REQUIRE8 和 PRESERVE8 ;<br />

• 第 7-70 页 的 RN ;<br />

• 第 7-71 页 的 ROUT。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-51


命 令 参 考<br />

7.7.1 ALIGN<br />

ALIGN 命 令 通 过 用 零 填 充 来 使 当 前 位 置 与 一 个 指 定 的 边 界 对 齐 。<br />

语 法<br />

ALIGN {expr{,offset{,pad }}}<br />

其 中 :<br />

expr 是 一 个 数 值 表 达 式 , 取 值 为 2 0 到 2 31 范 围 内 的 2 的 任 何 次 幂 。<br />

offset 可 以 是 任 何 数 值 表 达 式 。<br />

pad 可 以 是 任 何 数 值 表 达 式 。<br />

运 算<br />

使 当 前 位 置 对 齐 到 如 下 形 式 的 下 一 地 址 :<br />

offset + n * expr<br />

如 果 未 指 定 expr, 那 么 ALIGN 将 当 前 位 置 设 置 到 下 一 个 字 ( 四 字 节 ) 边 界 。<br />

前 一 个 位 置 和 当 前 新 位 置 之 间 的 未 用 字 节 , 用 pad 的 最 低 有 效 字 节 的 拷 贝 填 充 ,<br />

或 者 如 果 未 指 定 pad 则 用 零 填 充 。<br />

用 法<br />

使 用 ALIGN 来 确 保 数 据 和 代 码 对 齐 到 适 当 的 边 界 上 。 在 下 列 情 况 下 , 通 常 这 是 必<br />

须 的 :<br />

• ADR Thumb 伪 指 令 只 能 加 载 字 对 齐 的 地 址 , 但 Thumb 代 码 内 的 标 号 可 能 不 是<br />

字 对 齐 的 。 使 用 ALIGN 4 来 确 保 Thumb 代 码 内 的 一 个 地 址 是 四 字 节 对 齐 的 。<br />

• 使 用 ALIGN 来 利 用 有 些 <strong>ARM</strong> 处 理 器 上 的 高 速 缓 存 。 例 如 , <strong>ARM</strong>940T 带 有<br />

一 个 含 16 字 节 行 的 高 速 缓 存 。 使 用 ALIGN 16 来 在 16 字 节 边 界 上 对 齐 函 数<br />

入 口 点 , 并 使 高 速 缓 存 的 效 率 最 高 。<br />

• LDRD 和 STRD 双 字 数 据 传 送 必 须 是 八 字 节 对 齐 的 。 如 果 要 用 LDRD 或 STRD 来<br />

存 取 数 据 , 在 存 储 器 分 配 命 令 如 DCQ 之 前 使 用 ALIGN 8 ( 请 参 阅 第 7-13 页<br />

的 数 据 定 义 命 令 )。<br />

7-52 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

• 一 行 中 的 标 号 本 身 可 以 是 任 意 对 齐 的 。 随 后 的 <strong>ARM</strong> 代 码 是 字 对 齐 的<br />

(Thumb 代 码 是 半 字 对 齐 的 )。 因 此 标 号 不 能 正 确 寻 址 代 码 。 在 标 号 前 使<br />

用 ALIGN 4 ( 或 对 Thumb 代 码 , 使 用 ALIGN 2)。<br />

对 齐 是 相 对 于 ELF 段 的 开 始 位 置 的 , 这 是 例 程 所 在 的 位 置 。 段 必 须 对 齐 到 相 同<br />

的 或 更 近 似 的 边 界 上 。 在 AREA 命 令 上 可 以 指 定 不 同 的 ALIGN 属 性 ( 第 7-54 页 的<br />

AREA 和 示 例 )。<br />

示 例<br />

AREA cacheable, CODE, ALIGN=3<br />

rout1 ; code ; aligned on 8-byte boundary<br />

; code<br />

MOV pc,lr ; aligned only on 4-byte boundary<br />

ALIGN 8 ; now aligned on 8-byte boundary<br />

rout2 ; code<br />

AREA OffsetExample, CODE<br />

DCB 1 ; This example places the two<br />

ALIGN 4,3 ; bytes in the first and fourth<br />

DCB 1 ; bytes of the same word.<br />

AREA Example, CODE, READONLY<br />

start LDR r6,=label1<br />

; code<br />

MOV pc,lr<br />

label1 DCB 1 ; pc now misaligned<br />

ALIGN<br />

; ensures that subroutine1 addresses<br />

subroutine1<br />

; the following instruction.<br />

MOV r5,#0x5<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-53


命 令 参 考<br />

7.7.2 AREA<br />

AREA 命 令 指 示 汇 编 程 序 汇 编 一 个 新 的 代 码 段 或 数 据 段 。 段 是 独 立 的 、 指 定 的 、 不<br />

可 见 的 代 码 或 数 据 块 , 它 们 由 链 接 程 序 处 理 。 有 关 详 细 信 息 请 参 阅 第 2-16 页 的<br />

ELF 段 和 AREA 命 令 。<br />

语 法<br />

AREA sectionname{,attr}{,attr}...<br />

其 中 :<br />

sectionname 是 将 要 指 定 的 段 名 。<br />

可 以 为 段 选 择 任 何 段 名 。 但 是 , 以 一 个 数 字 开 始 的 名 称 必 须 包 含 在<br />

竖 杠 号 内 , 否 则 会 产 生 一 个 缺 失 段 名 错 误 。 例 如 , |1_DataArea|。<br />

有 些 名 称 是 习 惯 性 的 名 称 。 例 如 , |.text| 用 于 表 示 由 C 编 译 程 序<br />

产 生 的 代 码 段 , 或 用 于 以 某 种 方 式 与 C 库 关 联 的 代 码 段 。<br />

attr 是 一 个 或 多 个 用 逗 号 分 隔 的 段 属 性 。 有 效 的 属 性 是 :<br />

ALIGN=expression<br />

默 认 情 况 下 ,ELF 段 在 四 字 节 边 界 上 对 齐 。expression 可<br />

以 拥 有 0 到 31 的 任 何 整 数 。 段 在 2 expression 字 节 边 界 上 对<br />

齐 。 例 如 , 如 果 expression 是 10, 则 段 是 在 1KB 边 界 上<br />

对 齐 。 这 与 ALIGN 命 令 所 指 定 的 方 式 并 不 相 同 。 请 参 阅 第<br />

7-52 页 的 ALIGN。<br />

备 注<br />

不 能 对 代 码 段 使 用 ALIGN=0 或 ALIGN=1。<br />

ASSOC=section<br />

section 指 定 一 个 关 联 的 ELF 段 。sectionname 必 须 包 含 在<br />

含 有 section 的 任 何 链 接 中 。<br />

CODE 包 含 机 器 指 令 。 READONLY 是 默 认 值 。<br />

COMDEF 是 一 个 公 共 段 定 义 。 这 是 包 含 代 码 或 数 据 的 ELF 段 。 其<br />

必 须 等 同 于 与 其 它 源 文 件 中 拥 有 相 同 名 称 的 任 何 其 它 段<br />

必 须 是 同 一 段 。<br />

7-54 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

拥 有 相 同 名 称 的 同 一 ELF 段 在 存 储 器 的 相 同 段 中 被 链 接<br />

程 序 覆 盖 。 如 果 有 任 何 段 不 同 , 则 链 接 程 序 产 生 一 个 警<br />

告 , 并 且 不 覆 盖 这 些 段 。 请 参 阅 <strong>RealView</strong> 编 译 工 具 2.0 版<br />

链 接 程 序 和 实 用 程 序 指 南 中 的 链 接 程 序 一 章 。<br />

COMMON 是 公 共 数 据 段 。 不 能 在 其 中 定 义 任 何 代 码 或 数 据 。 其 由<br />

链 接 程 序 初 始 化 为 零 。 拥 有 相 同 名 称 的 所 有 公 共 段 在 存<br />

储 器 的 相 同 段 中 被 链 接 程 序 覆 盖 。 它 们 并 不 都 需 要 具 有<br />

相 同 的 大 小 。 链 接 程 序 按 每 个 名 称 的 最 大 公 共 段 的 需 要<br />

分 配 空 间 。<br />

DATA 包 含 数 据 但 不 含 指 令 。 READWRITE 是 默 认 值 。<br />

NOALLOC 表 示 在 目 标 系 统 上 没 有 为 此 AREA 分 配 存 储 器 。<br />

NOINIT 表 示 数 据 段 是 未 初 始 化 的 或 初 始 化 为 零 。 其 只 包 含 零 初<br />

始 化 的 空 间 保 留 命 令 SPACE 或 DCB、DCD、DCDU、DCQ、DCQU、<br />

DCW 或 DCWU。 可 以 决 定 在 链 接 时 AREA 是 未 初 始 化 的 还 是 零<br />

初 始 化 的 ( 请 参 阅 <strong>RealView</strong> 编 译 工 具 2.0 版 链 接 程 序 和<br />

实 用 程 序 指 南 中 的 链 接 程 序 一 章 )。<br />

READONLY 表 示 不 能 写 到 此 段 中 。 这 是 代 码 区 域 的 默 认 情 况 。<br />

READWRITE 表 示 可 以 读 和 写 此 段 。 这 是 数 据 区 域 的 默 认 情 况 。<br />

用 法<br />

使 用 AREA 命 令 来 将 源 文 件 细 分 为 ELF 段 。 可 以 在 多 个 AREA 命 令 中 使 用 相 同 的 名<br />

称 。 拥 有 相 同 名 称 的 所 有 区 域 被 放 置 在 相 同 的 ELF 段 中 。 只 有 第 一 个 AREA 命<br />

令 指 定 名 字 的 块 属 性 才 会 被 应 用 。<br />

通 常 应 为 代 码 和 数 据 使 用 独 立 的 ELF 段 。 大 型 程 序 通 常 可 方 便 地 划 分 为 几 个 代<br />

码 段 。 大 量 独 立 的 数 据 集 通 常 也 最 好 放 在 独 立 段 中 。<br />

局 部 标 号 的 作 用 范 围 是 由 AREA 命 令 定 义 的 , 并 可 选 择 用 ROUT 命 令 细 分 ( 请 参 阅<br />

第 3-16 页 的 局 部 标 号 和 第 7-71 页 的 ROUT)。<br />

一 组 汇 编 代 码 必 须 至 少 有 一 个 AREA 命 令 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-55


命 令 参 考<br />

示 例<br />

下 例 定 义 名 为 Example 的 只 读 代 码 段 。<br />

AREA Example,CODE,READONLY ; An example code section.<br />

; code<br />

7-56 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.7.3 CODE16 和 CODE32<br />

CODE16 命 令 指 示 汇 编 程 序 将 随 后 的 指 令 解 释 为 16 位 Thumb 指 令 。 必 要 时 , 该 命<br />

令 也 插 入 一 个 填 充 字 节 , 以 对 齐 到 下 一 个 半 字 边 界 。<br />

CODE32 命 令 指 示 汇 编 程 序 将 随 后 的 指 令 解 释 为 32 位 <strong>ARM</strong> 指 令 。 必 要 时 , 该 命<br />

令 也 插 入 三 个 填 充 字 节 , 以 对 齐 到 下 一 个 字 边 界 。<br />

语 法<br />

CODE16<br />

CODE32<br />

用 法<br />

在 包 含 <strong>ARM</strong> 和 Thumb 混 合 代 码 的 文 件 中 :<br />

• 当 从 <strong>ARM</strong> 状 态 转 换 到 Thumb 状 态 时 , 使 用 CODE16。 CODE16 必 须 位 于 任 何<br />

Thumb 代 码 之 前 。<br />

• 当 从 Thumb 状 态 转 换 到 <strong>ARM</strong> 状 态 时 , 使 用 CODE32。 CODE32 必 须 位 于 任 何<br />

<strong>ARM</strong> 代 码 之 前 。<br />

CODE16 和 CODE32 不 汇 编 到 转 换 状 态 的 指 令 。 它 们 仅 指 示 汇 编 程 序 适 当 地 汇 编<br />

Thumb 或 <strong>ARM</strong> 指 令 , 必 要 时 插 入 填 充 字 节 。<br />

示 例<br />

此 例 说 明 CODE16 如 何 能 用 于 从 <strong>ARM</strong> 指 令 跳 转 到 Thumb 指 令 。<br />

AREA<br />

CODE32<br />

ChangeState, CODE, READONLY<br />

; This section starts in <strong>ARM</strong> state<br />

LDR r0,=start+1 ; Load the address and set the<br />

; least significant bit<br />

BX r0 ; Branch and exchange instruction sets<br />

; Not necessarily in same section<br />

CODE16<br />

; Following instructions are Thumb<br />

start MOV r1,#10 ; Thumb instructions<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-57


命 令 参 考<br />

7.7.4 END<br />

END 命 令 指 示 汇 编 程 序 , 其 已 到 达 一 个 源 文 件 的 末 尾 。<br />

语 法<br />

END<br />

用 法<br />

每 个 汇 编 语 言 源 文 件 必 须 以 一 行 单 独 的 END 结 束 。<br />

如 果 源 文 件 已 被 一 个 GET 命 令 包 括 在 一 个 父 文 件 中 , 那 么 汇 编 程 序 返 回 到 父 文<br />

件 , 并 在 GET 命 令 后 的 第 一 行 继 续 汇 编 。 有 关 详 细 信 息 请 参 阅 第 7-64 页 的 GET<br />

或 INCLUDE。<br />

如 果 在 第 一 轮 汇 编 时 到 达 最 上 层 源 文 件 的 END 命 令 而 没 有 出 现 任 何 错 误 , 则 开 始<br />

第 二 轮 汇 编 。<br />

如 果 在 第 二 轮 汇 编 时 到 达 最 上 层 源 文 件 的 END 命 令 , 则 汇 编 程 序 完 成 汇 编 , 并 写<br />

适 当 的 输 出 。<br />

7-58 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.7.5 ENTRY<br />

ENTRY 命 令 声 明 一 个 程 序 的 入 口 点 。<br />

语 法<br />

ENTRY<br />

用 法<br />

必 须 为 一 个 程 序 指 定 至 少 一 个 ENTRY 点 。 如 果 没 有 ENTRY 存 在 , 则 链 接 时 产 生 一<br />

个 警 告 。<br />

在 一 个 源 文 件 内 不 能 使 用 多 个 ENTRY 命 令 。 并 非 每 个 源 文 件 都 必 须 包 含 一 个<br />

ENTRY 命 令 。 如 果 在 一 个 源 文 件 内 有 多 个 ENTRY 命 令 , 则 汇 编 时 会 产 生 出 错 信 息 。<br />

示 例<br />

AREA<br />

ENTRY<br />

<strong>ARM</strong>ex, CODE, READONLY<br />

; Entry point for the application<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-59


命 令 参 考<br />

7.7.6 EQU<br />

EQU 命 令 为 一 个 数 值 常 数 、 相 对 寄 存 器 的 值 或 相 对 程 序 的 值 给 定 一 个 符 号 名 。<br />

* 是 EQU 的 一 个 同 义 词 。<br />

语 法<br />

name EQU expr{, type}<br />

其 中 :<br />

name 是 要 为 值 指 定 的 符 号 名 称 。<br />

expr<br />

是 一 个 相 对 寄 存 器 的 地 址 、 相 对 程 序 的 地 址 、 绝 对 地 址 或 32 位 整<br />

型 常 数 。<br />

type 是 可 选 的 。 type 可 以 是 下 列 值 之 一 :<br />

• CODE16<br />

• CODE32<br />

• DATA<br />

只 有 当 expr 是 一 个 绝 对 地 址 时 , 才 能 使 用 type。 如 果 导 出 name, 那<br />

么 根 据 type 的 值 , 目 标 文 件 的 符 号 表 中 的 name 条 目 将 被 标 记 为<br />

CODE16、 CODE32 或 DATA。 这 些 信 息 可 由 链 接 程 序 使 用 。<br />

用 法<br />

使 用 EQU 定 义 常 数 。 这 类 似 于 在 C 中 使 用 #define 定 义 常 数 。<br />

有 关 导 出 符 号 的 信 息 , 请 参 阅 第 7-67 页 的 KEEP 和 第 7-61 页 的 EXPORT 或<br />

GLOBAL。<br />

示 例<br />

abc EQU 2<br />

xyz EQU label+8<br />

fiq EQU 0x1C, CODE32<br />

; assigns the value 2 to the symbol abc.<br />

; assigns the address (label+8) to the<br />

; symbol xyz.<br />

; assigns the absolute address 0x1C to<br />

; the symbol fiq, and marks it as code<br />

7-60 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.7.7 EXPORT 或 GLOBAL<br />

EXPORT 命 令 声 明 一 个 符 号 , 可 由 链 接 程 序 用 于 解 决 各 个 目 标 和 库 文 件 中 的 符 号 引<br />

用 。 GLOBAL 是 EXPORT 的 一 个 同 义 词 。<br />

语 法<br />

EXPORT {symbol}{[WEAK]}<br />

其 中 :<br />

symbol<br />

[WEAK]<br />

是 要 导 出 的 符 号 名 。 符 号 名 是 区 分 大 小 写 的 。 如 果 省 略 了 symbol,<br />

则 导 出 所 有 符 号 。<br />

表 示 只 有 当 没 有 其 它 源 导 出 另 一 个 实 例 时 , 才 应 将 此 符 号 实 例 导 入<br />

其 它 源 中 。 如 果 使 用 了 不 带 symbol 的 [WEAK], 那 么 所 有 导 出 的 符 号<br />

是 处 于 次 要 地 位 的 。<br />

用 法<br />

使 用 EXPORT 来 使 其 它 文 件 中 的 代 码 能 访 问 当 前 文 件 中 的 符 号 。<br />

使 用 [WEAK] 属 性 来 指 示 链 接 程 序 , 如 果 可 以 使 用 其 它 源 中 的 一 个 不 同 的 symbol<br />

实 例 , 则 其 它 不 同 实 例 将 优 先 于 此 实 例 。<br />

另 请 参 阅 第 7-65 页 的 IMPORT。<br />

示 例<br />

AREA Example,CODE,READONLY<br />

EXPORT DoAdd<br />

; Export the function name<br />

; to be used by external<br />

; modules.<br />

DoAdd ADD r0,r0,r1<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-61


命 令 参 考<br />

7.7.8 EXPORTAS<br />

EXPORTAS 命 令 允 许 将 一 个 符 号 导 出 到 目 标 文 件 中 , 与 源 文 件 中 不 同 的 符 号 相 对 应 。<br />

语 法<br />

EXPORTAS symbol1, symbol2<br />

其 中 :<br />

symbol1<br />

是 源 文 件 中 的 符 号 名 。symbol1 必 须 已 定 义 。 其 可 以 是 任 何 符 号 , 包<br />

括 一 个 区 域 名 、 一 个 标 号 或 一 个 常 数 。<br />

symbol2 是 将 要 出 现 在 目 标 文 件 中 的 符 号 名 。<br />

符 号 名 称 区 分 大 小 写 。<br />

用 法<br />

使 用 EXPORTAS 来 改 变 目 标 文 件 中 的 一 个 符 号 , 而 不 必 改 变 源 文 件 中 的 每 个 实 例 。<br />

另 请 参 阅 第 7-61 页 的 EXPORT 或 GLOBAL。<br />

示 例<br />

AREA data1, DATA ;; starts a new area data1<br />

AREA data2, DATA ;; starts a new area data2<br />

EXPORTAS data2, data1 ;; the section symbol referred to as data2 will<br />

;; appear in the object file string table as data1.<br />

one EQU 2<br />

EXPORTAS one, two<br />

EXPORT one<br />

;; the symbol 'two' will appear in the object<br />

;; file's symbol table with the value 2.<br />

7-62 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.7.9 EXTERN<br />

EXTERN 命 令 为 汇 编 程 序 提 供 一 个 未 在 当 前 汇 编 代 码 中 定 义 的 名 称 。<br />

EXTERN 与 IMPORT 非 常 类 似 , 只 是 如 果 在 当 前 汇 编 代 码 中 未 找 到 其 引 用 , 则 不 导 入<br />

该 名 称 ( 请 参 阅 第 7-65 页 的 IMPORT 和 第 7-61 页 的 EXPORT 或 GLOBAL)。<br />

语 法<br />

EXTERN symbol{[WEAK]}<br />

其 中 :<br />

symbol 是 在 一 个 单 独 汇 编 的 源 文 件 、 目 标 文 件 或 库 中 定 义 的 一 个 符 号 名 。<br />

符 号 名 是 区 分 大 小 写 的 。<br />

[WEAK]<br />

用 法<br />

如 果 符 号 未 在 其 它 文 件 中 定 义 , 防 止 链 接 程 序 产 生 错 误 信 息 。 也 防<br />

止 链 接 程 序 搜 索 还 未 包 括 的 库 。<br />

在 链 接 时 , 将 名 称 确 定 为 在 一 个 单 独 的 目 标 文 件 中 定 义 的 符 号 。 该 符 号 被 当 作 一<br />

个 程 序 地 址 。 如 果 未 指 定 [WEAK], 那 么 如 果 在 链 接 时 没 有 找 到 相 应 的 符 号 , 则 链<br />

接 程 序 产 生 一 个 错 误 。<br />

如 果 指 定 了 [WEAK] 且 在 链 接 时 没 有 找 到 相 应 的 符 号 :<br />

• 如 果 该 引 用 是 一 个 B 或 BL 指 令 的 目 标 , 则 将 下 一 指 令 的 地 址 作 为 该 符 号 的<br />

值 。 这 样 就 有 效 地 使 B 或 BL 指 令 变 成 一 个 NOP。<br />

• 否 则 , 该 符 号 的 值 取 为 零 。<br />

示 例<br />

此 例 测 试 检 查 是 否 已 链 接 C++ 库 , 并 根 据 结 果 执 行 条 件 跳 转 。<br />

AREA Example, CODE, READONLY<br />

EXTERN __CPP_INITIALIZE[WEAK] ; If C++ library linked, gets the address of<br />

; __CPP_INITIALIZE function.<br />

LDR r0,=__CPP_INITIALIZE ; If not linked, address is zeroed.<br />

CMP r0,#0 ; Test if zero.<br />

BEQ nocplusplus ; Branch on the result.<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-63


命 令 参 考<br />

7.7.10 GET 或 INCLUDE<br />

GET 命 令 在 被 汇 编 的 文 件 内 包 含 一 个 文 件 。 所 包 含 的 文 件 在 GET 命 令 的 位 置 处 汇<br />

编 。 INCLUDE 是 GET 的 一 个 同 义 词 。<br />

语 法<br />

GET filename<br />

其 中 :<br />

filename<br />

是 在 汇 编 代 码 中 要 包 含 的 文 件 名 称 。 汇 编 程 序 可 接 受 UNIX 或<br />

MS-DOS 格 式 的 路 径 名 。<br />

用 法<br />

GET 对 在 汇 编 代 码 中 包 含 宏 定 义 、EQU 命 令 和 存 储 器 映 射 很 有 用 。 当 完 成 所 包 含 的<br />

文 件 的 汇 编 后 , 将 在 GET 命 令 后 的 下 一 行 继 续 汇 编 。<br />

默 认 情 况 下 , 汇 编 程 序 在 当 前 位 置 搜 索 所 包 含 的 文 件 。 当 前 位 置 即 是 调 用 文 件 所<br />

在 的 目 录 。 使 用 -i 汇 编 程 序 命 令 行 选 项 可 将 目 录 添 加 到 搜 索 路 径 中 。 包 含 空 格<br />

的 文 件 名 和 目 录 名 不 能 括 在 双 引 号 ( " " ) 内 。<br />

所 包 含 的 文 件 可 包 含 其 它 的 GET 命 令 以 包 含 其 它 文 件 ( 请 参 阅 第 7-26 页 的 嵌 套<br />

命 令 )。<br />

如 果 所 包 含 的 文 件 位 于 与 当 前 位 置 不 同 的 目 录 中 , 那 么 在 包 含 的 文 件 结 束 之 前 ,<br />

该 目 录 就 成 为 当 前 位 置 。 然 后 恢 复 前 一 个 当 前 位 置 。<br />

GET 不 能 用 于 包 含 目 标 文 件 ( 请 参 阅 第 7-66 页 的 INCBIN)。<br />

示 例<br />

AREA Example, CODE, READONLY<br />

GET file1.s ; includes file1 if it exists<br />

; in the current place.<br />

GET c:\project\file2.s ; includes file2<br />

GET c:\Program files\file3.s ; space is allowed<br />

7-64 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.7.11 GLOBAL<br />

请 参 阅 第 7-61 页 的 EXPORT 或 GLOBAL。<br />

7.7.12 IMPORT<br />

IMPORT 命 令 为 汇 编 程 序 提 供 一 个 未 在 当 前 汇 编 代 码 中 定 义 的 名 称 。<br />

IMPORT 与 EXTERN 非 常 类 似 , 只 是 不 管 其 在 当 前 汇 编 代 码 中 是 否 被 引 用 , 都 将 导 入<br />

该 名 称 ( 请 参 阅 第 7-63 页 的 EXTERN 和 第 7-61 页 的 EXPORT 或 GLOBAL)。<br />

语 法<br />

IMPORT symbol{[WEAK]}<br />

其 中 :<br />

symbol 是 在 一 个 单 独 汇 编 的 源 文 件 、 目 标 文 件 或 库 中 定 义 的 一 个 符 号 名 。<br />

符 号 名 是 区 分 大 小 写 的 。<br />

WEAK<br />

用 法<br />

如 果 符 号 未 在 其 它 文 件 中 定 义 , 该 选 项 防 止 链 接 程 序 产 生 错 误 信<br />

息 。 也 防 止 链 接 程 序 搜 索 还 未 包 括 的 库 。<br />

在 链 接 时 , 将 名 称 解 析 为 在 一 个 独 立 的 目 标 文 件 中 定 义 的 符 号 。 该 符 号 被 当 作 一<br />

个 程 序 地 址 。 如 果 未 指 定 [WEAK], 那 么 如 果 在 链 接 时 没 有 找 到 相 应 的 符 号 , 则 链<br />

接 程 序 产 生 一 个 错 误 。<br />

如 果 指 定 了 [WEAK] 且 在 链 接 时 没 有 找 到 相 应 的 符 号 :<br />

• 如 果 该 引 用 是 一 个 B 或 BL 指 令 的 目 标 , 则 将 下 一 指 令 的 地 址 作 为 该 符 号 的<br />

值 。 这 样 就 有 效 地 使 B 或 BL 指 令 变 成 一 个 NOP。<br />

• 否 则 , 该 符 号 的 值 取 为 零 。<br />

为 了 避 免 试 图 访 问 链 接 时 未 找 到 的 符 号 , 请 使 用 类 似 第 7-63 页 的 EXTERN 中 的<br />

示 例 代 码 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-65


命 令 参 考<br />

7.7.13 INCBIN<br />

INCBIN 命 令 在 被 汇 编 的 文 件 内 包 含 一 个 文 件 。 该 文 件 按 原 样 包 含 的 , 没 有 进 行<br />

汇 编 。<br />

语 法<br />

INCBIN filename<br />

其 中 :<br />

filename<br />

是 要 在 汇 编 代 码 中 包 含 的 文 件 名 称 。 汇 编 程 序 可 接 受 UNIX 或<br />

MS-DOS 格 式 的 路 径 名 。<br />

用 法<br />

可 以 使 用 INCBIN 来 包 含 可 执 行 文 件 、 文 字 或 其 它 任 意 数 据 。 文 件 的 内 容 将 按 字<br />

节 逐 一 添 加 到 当 前 ELF 段 中 , 而 不 进 行 任 何 方 式 的 解 释 。 汇 编 在 INCBIN 命 令 的<br />

下 一 行 继 续 执 行 。<br />

默 认 情 况 下 , 汇 编 程 序 在 当 前 位 置 搜 索 所 包 含 的 文 件 。 当 前 位 置 即 是 调 用 文 件 所<br />

在 的 目 录 。 使 用 -i 汇 编 程 序 命 令 行 选 项 可 将 目 录 添 加 到 搜 索 路 径 中 。 包 含 空 格<br />

的 文 件 名 和 目 录 名 不 能 括 在 双 引 号 ( " " ) 内 。<br />

示 例<br />

AREA Example, CODE, READONLY<br />

INCBIN file1.dat<br />

INCBIN c:\project\file2.txt<br />

; includes file1 if it<br />

; exists in the<br />

; current place.<br />

; includes file2<br />

7.7.14 INCLUDE<br />

请 参 阅 第 7-64 页 的 GET 或 INCLUDE<br />

7-66 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.7.15 KEEP<br />

KEEP 命 令 指 示 汇 编 程 序 在 目 标 文 件 的 符 号 表 中 保 留 局 部 符 号 。<br />

语 法<br />

KEEP {symbol}<br />

其 中 :<br />

symbol<br />

是 要 保 留 的 局 部 符 号 的 名 称 。 如 果 未 指 定 symbol, 则 保 留 除 相 对 寄<br />

存 器 的 符 号 外 的 所 有 局 部 符 号 。<br />

用 法<br />

默 认 情 况 下 , 汇 编 程 序 在 其 输 出 目 标 文 件 中 描 述 的 符 号 仅 仅 是 :<br />

• 导 出 的 符 号 ;<br />

• 反 向 重 新 定 位 的 符 号 。<br />

使 用 KEEP 来 保 留 可 有 助 于 调 试 的 局 部 符 号 。 所 保 留 的 符 号 出 现 在 <strong>ARM</strong> 调 试 程 序<br />

和 链 接 程 序 映 射 文 件 中 。<br />

KEEP 不 能 保 留 相 对 寄 存 器 的 符 号 ( 请 参 阅 第 7-15 页 的 MAP)。<br />

示 例<br />

label ADC r2,r3,r4<br />

KEEP label ; makes label available to debuggers<br />

ADD r2,r2,r5<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-67


命 令 参 考<br />

7.7.16 NOFP<br />

NOFP 命 令 不 允 许 在 汇 编 语 言 源 文 件 中 使 用 浮 点 指 令 。<br />

语 法<br />

NOFP<br />

用 法<br />

在 软 件 或 目 标 硬 件 不 支 持 浮 点 指 令 的 情 况 下 , 使 用 NOFP 以 确 保 没 有 使 用 任 何 浮<br />

点 指 令 。<br />

如 果 在 NOFP 命 令 后 出 现 一 个 浮 点 指 令 , 则 产 生 一 个 [Unknown opcode] 错 误 , 并 且<br />

汇 编 失 败 。<br />

如 果 NOFP 命 令 出 现 在 一 个 浮 点 指 令 之 后 , 则 汇 编 程 序 产 生 错 误 :<br />

[Too late to ban floating point instructions]<br />

并 且 汇 编 失 败 。<br />

7.7.17 REQUIRE<br />

REQUIRE 命 令 指 定 各 段 之 间 的 相 关 性 。<br />

语 法<br />

REQUIRE label<br />

其 中 :<br />

label 是 所 要 求 的 标 号 的 名 称 。<br />

用 法<br />

使 用 REQUIRE 以 确 保 包 含 了 一 个 相 关 的 段 ( 即 使 其 未 被 直 接 调 用 )。 如 果 链 接 时<br />

包 括 了 含 有 REQUIRE 命 令 的 段 , 链 接 程 序 也 将 包 括 含 有 指 定 标 号 定 义 的 段 。<br />

7-68 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.7.18 REQUIRE8 和 PRESERVE8<br />

REQUIRE8 命 令 指 定 当 前 文 件 要 求 栈 的 八 字 节 对 齐 。<br />

PRESERVE8 命 令 指 定 当 前 文 件 保 持 栈 的 八 字 节 对 齐 。<br />

语 法<br />

REQUIRE8<br />

PRESERVE8<br />

用 法<br />

只 有 当 所 访 问 的 是 八 字 节 对 齐 地 址 时 , LDRD 和 STRD 指 令 ( 双 字 传 送 ) 才 能 正 确<br />

工 作 。<br />

如 果 代 码 中 包 含 与 堆 栈 之 间 的 LDRD 或 STRD 传 送 , 可 使 用 REQUIRE8 来 指 示 链 接 程<br />

序 , 以 确 保 仅 仅 从 保 持 八 字 节 栈 对 齐 的 目 标 中 调 用 该 代 码 。<br />

如 果 代 码 保 持 栈 的 八 字 节 对 齐 , 可 使 用 PRESERVE8 来 通 知 链 接 程 序 。<br />

链 接 程 序 确 保 要 求 栈 的 八 字 节 对 齐 的 任 何 代 码 , 仅 仅 由 保 持 栈 的 八 字 节 对 齐 的<br />

代 码 直 接 或 间 接 地 调 用 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-69


命 令 参 考<br />

7.7.19 RN<br />

RN 命 令 为 一 个 指 定 的 寄 存 器 定 义 寄 存 器 名 称 。<br />

语 法<br />

name RN expr<br />

其 中 :<br />

name<br />

是 要 为 寄 存 器 指 定 的 名 称 。 name 不 能 与 第 3-9 页 的 预 定 义 的 寄 存 器<br />

和 协 处 理 器 名 称 中 列 出 的 任 何 预 定 义 名 称 相 同 。<br />

expr 取 值 为 0 到 15 之 间 的 一 个 寄 存 器 编 号 。<br />

用 法<br />

使 用 RN 为 寄 存 器 分 配 便 于 记 忆 的 名 称 , 以 帮 助 记 忆 所 使 用 的 每 个 寄 存 器 。 要 小<br />

心 避 免 用 不 同 的 名 称 使 用 同 一 寄 存 器 而 造 成 冲 突 。<br />

示 例<br />

regname RN 11 ; defines regname for register 11<br />

sqr4 RN r6 ; defines sqr4 for register 6<br />

7-70 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


命 令 参 考<br />

7.7.20 ROUT<br />

ROUT 命 令 标 记 局 部 标 号 的 作 用 范 围 ( 请 参 阅 第 3-16 页 的 局 部 标 号 )。<br />

语 法<br />

{name} ROUT<br />

其 中 :<br />

name 是 要 分 配 给 作 用 范 围 的 名 称 。<br />

用 法<br />

使 用 ROUT 命 令 来 限 制 局 部 标 号 的 作 用 范 围 。 这 样 就 更 容 易 避 免 意 外 引 用 错 误 的<br />

标 号 。 如 果 其 中 没 有 ROUT 命 令 , 则 局 部 标 号 的 作 用 范 围 是 整 个 区 域 ( 请 参 阅 第<br />

7-54 页 的 AREA)。<br />

使 用 name 选 项 来 确 保 每 个 引 用 是 针 对 正 确 的 局 部 标 号 的 。 如 果 标 号 的 名 称 或 对<br />

标 号 的 引 用 与 前 面 的 ROUT 命 令 不 匹 配 , 则 汇 编 程 序 产 生 一 个 错 误 信 息 , 并 且 汇<br />

编 失 败 。<br />

示 例<br />

; code<br />

routineA ROUT ; ROUT is not necessarily a routine<br />

; code<br />

3routineA ; code ; this label is checked<br />

; code<br />

BEQ %4routineA ; this reference is checked<br />

; code<br />

BGE %3 ; refers to 3 above, but not checked<br />

; code<br />

4routineA ; code ; this label is checked<br />

; code<br />

otherstuff ROUT<br />

; start of next scope<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 7-71


命 令 参 考<br />

7-72 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


词 汇 表<br />

Angel <br />

Angel 是 一 个 在 目 标 系 统 上 运 行 的 调 试 监 控 程 序 , 使 您 能 开 发 和 调 试 在 基 于<br />

<strong>ARM</strong> 的 硬 件 上 运 行 的 应 用 程 序 。 Angel 可 调 试 运 行 在 <strong>ARM</strong> 状 态 或 Thumb 状 态<br />

下 的 应 用 程 序 。<br />

ANSI 请 参 阅 美 国 国 家 标 准 协 会 。<br />

<strong>ARM</strong>-Thumb 程 序 调 用 标 准 (ATPCS)<br />

<strong>ARM</strong>-Thumb 程 序 调 用 标 准 定 义 在 子 程 序 调 用 过 程 当 中 如 何 使 用 寄 存 器 和 堆 栈 。<br />

ATPCS 请 参 阅 <strong>ARM</strong>-Thumb 程 序 调 用 标 准 。<br />

半 主 机<br />

(semihosting)<br />

一 种 通 信 机 制 , 目 标 将 应 用 程 序 请 求 的 I/O 操 作 传 送 给 主 机 系 统 处 理 , 而 不 是 试<br />

图 自 身 支 持 I/O。<br />

半 字 (half-word) 一 个 16 位 的 信 息 单 元 。 除 非 另 外 声 明 , 否 则 将 内 容 当 作 无 符 号 整 数 。<br />

保 存 的 处 理 器 状 态 寄 存 器 (SPSR)<br />

SPSR 是 一 个 寄 存 器 , 保 存 异 常 发 生 之 前 的 处 理 器 状 态 寄 存 器 中 的 最 新 信 息 的 副<br />

本 。 每 个 异 常 模 式 都 有 其 自 身 的 SPSR。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 词 汇 表 - 1


词 汇 表<br />

CFA 请 参 阅 规 范 框 架 地 址 。<br />

CPSR 请 参 阅 当 前 处 理 器 状 态 寄 存 器 。<br />

处 理 器 状 态 寄 存 器 (PSR)<br />

包 含 各 种 处 理 器 控 制 位 和 标 志 的 一 个 寄 存 器 。<br />

另 请 参 阅 当 前 处 理 器 状 态 寄 存 器 。<br />

另 请 参 阅 保 存 的 处 理 器 状 态 寄 存 器 。<br />

DWARF 一 种 特 殊 的 调 试 格 式 。<br />

大 端 (Big-endian) 将 一 个 字 的 最 低 位 字 节 存 储 在 比 最 高 位 字 节 更 高 的 地 址 上 的 存 储 结 构 。<br />

当 前 处 理 器 状 态 寄 存 器 (CPSR)<br />

包 含 控 制 位 和 标 志 等 当 前 处 理 器 状 态 信 息 的 寄 存 器 。<br />

当 前 位 置 (Current place)<br />

另 请 参 阅 保 存 的 处 理 器 状 态 寄 存 器 。<br />

在 编 译 术 语 中 , 指 在 编 译 过 程 中 存 储 包 含 文 件 的 目 录 。<br />

读 写 位 置 无 关 (RWPI) 读 / 写 数 据 地 址 可 在 运 行 时 动 态 改 变 。<br />

段 映 像 中 的 一 段 代 码 或 数 据 。<br />

堆 栈 (Stack)<br />

计 算 机 存 储 器 的 一 部 分 , 用 于 记 录 调 用 子 程 序 的 代 码 的 地 址 。 堆 栈 也 可 用 于 保 存<br />

参 数 和 临 时 变 量 。<br />

ELF 一 种 可 执 行 、 可 链 接 的 格 式 。<br />

规 范 框 架 地 址 (CFA) 在 DWARF 2 中 , 是 指 堆 栈 中 的 一 个 地 址 , 指 定 被 中 断 函 数 的 调 用 框 架 的 位 置 。<br />

胶 合 代 码 (Veneer)<br />

是 指 当 跳 转 目 的 在 处 理 器 所 能 到 达 的 范 围 之 外 时 , 与 程 序 调 用 或 跳 转 配 合 使 用<br />

的 一 小 块 代 码 。<br />

交 互 操 作 (Interworking)<br />

产 生 使 用 <strong>ARM</strong> 和 Thumb 两 种 指 令 的 应 用 程 序 。<br />

局 部 变 量 (Local variables)<br />

只 能 由 创 建 它 的 子 程 序 访 问 的 变 量 。<br />

另 请 参 阅 全 局 变 量 。<br />

词 汇 表 - 2 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


词 汇 表<br />

库 由 汇 编 器 或 编 译 器 输 产 生 的 目 标 对 象 组 合 形 成 的 一 种 集 合 。<br />

链 接 器 (Linker) 由 一 个 或 多 个 源 代 码 汇 编 器 或 编 译 器 产 生 的 对 象 生 成 一 个 映 像 的 软 件 。<br />

零 初 始 化 (Zero Initialized)<br />

美 国 国 家 标 准 协 会 (ANSI)<br />

用 于 存 储 没 有 初 值 的 变 量 的 可 读 写 存 储 器 。 该 存 储 器 通 常 在 复 位 时 清 为 零 。<br />

制 定 计 算 机 软 件 和 其 它 行 业 标 准 的 一 个 组 织 。<br />

目 标 (Target) 正 在 运 行 目 标 应 用 程 序 的 实 际 目 标 处 理 器 ( 真 实 的 或 模 拟 的 )。<br />

PIC 与 位 置 无 关 的 代 码 。<br />

任 何 调 试 会 话 中 的 基 本 对 象 , 是 调 试 系 统 的 基 础 和 目 标 软 件 的 运 行 环 境 。 本 质 上<br />

是 真 实 或 模 拟 处 理 器 的 一 个 集 合 。<br />

另 请 参 阅 ROPI。<br />

PID 位 置 无 关 的 数 据 或 <strong>ARM</strong> 平 台 无 关 的 开 发 卡 。<br />

另 请 参 阅 RWPI。<br />

PSR 请 参 阅 处 理 器 状 态 寄 存 器 。<br />

全 局 变 量 (Global variables)<br />

可 由 应 用 程 序 中 的 所 有 代 码 访 问 的 变 量 。<br />

另 请 参 阅 局 部 变 量 。<br />

<strong>RealView</strong> 编 译 工 具 (RVCT)<br />

<strong>RealView</strong> 编 译 工 具 是 一 整 套 工 具 以 及 支 持 文 档 和 范 例 , 使 用 户 能 编 写 和 编 译 用<br />

于 <strong>ARM</strong> 系 列 RISC 处 理 器 的 应 用 程 序 。<br />

ROPI 另 请 参 阅 只 读 位 置 无 关 。<br />

RVCT 请 参 阅 <strong>RealView</strong> 编 译 工 具 。<br />

RWPI 请 参 阅 读 写 位 置 无 关 。<br />

软 件 中 断 (SWI) 使 处 理 器 调 用 程 序 员 指 定 的 子 程 序 的 一 个 指 令 。 <strong>ARM</strong> 在 处 理 半 主 机 时 候 用 到 。<br />

SPSR 请 参 阅 保 存 的 处 理 器 状 态 寄 存 器 。<br />

SWI 请 参 阅 软 件 中 断 。<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 词 汇 表 - 3


词 汇 表<br />

双 字 (Double-word) 一 个 64 位 的 信 息 单 元 。 除 非 另 外 声 明 , 否 则 将 内 容 当 作 无 符 号 整 数 。<br />

体 系 结 构 (Architecture)<br />

调 试 器 (Debugger)<br />

VFP 请 参 阅 向 量 浮 点 。<br />

用 于 描 述 具 有 一 组 相 近 特 征 的 处 理 器 的 术 语 。<br />

监 视 和 控 制 其 它 应 用 程 序 执 行 的 一 个 应 用 程 序 。 通 常 用 于 查 找 应 用 程 序 流 中 的<br />

错 误 。<br />

向 量 浮 点 (VFP) 浮 点 协 处 理 器 的 一 个 标 准 , 单 个 指 令 可 以 处 理 几 个 数 据 值 。<br />

小 端 (Little-endian) 将 一 个 字 的 最 低 位 字 节 存 储 在 比 最 高 位 字 节 低 的 地 址 上 的 存 储 结 构 。<br />

协 处 理 器 (Coprocessor)<br />

用 于 特 定 运 算 的 附 加 处 理 器 。 通 常 用 于 浮 点 数 学 计 算 、 信 号 处 理 或 存 储 器 管 理 。<br />

映 像 (Image) 已 加 载 到 处 理 器 上 可 以 运 行 的 可 执 行 文 件 。<br />

有 效 范 围 (Scope)<br />

ZI 请 参 阅 零 初 始 化 。<br />

加 载 到 处 理 器 上 并 拥 有 了 执 行 线 程 的 二 进 制 执 行 文 件 。 一 个 映 像 可 拥 有 多 个 线<br />

程 。 一 个 映 像 与 运 行 其 默 认 线 程 的 处 理 器 相 关 。<br />

在 应 用 程 序 代 码 的 某 处 函 数 和 变 量 的 可 访 性 。 拥 有 全 局 范 围 的 符 号 总 是 可 访 问<br />

的 。 拥 有 局 部 或 私 有 范 围 的 符 号 只 能 由 同 一 子 程 序 或 对 象 中 的 代 码 来 访 问 。<br />

只 读 位 置 无 关 (ROPI) 代 码 和 只 读 数 据 地 址 可 在 运 行 时 动 态 改 变 。<br />

中 断 (Interrupt)<br />

一 个 应 用 程 序 在 正 常 处 理 过 程 中 被 某 种 因 素 触 发 的 变 化 , 例 如 , 由 一 个 外 部 信 号<br />

引 起 的 变 化 。<br />

字 (Word) 一 个 32 位 的 信 息 单 元 。 除 非 另 外 声 明 , 否 则 将 内 容 当 作 无 符 号 整 数 。<br />

字 节 (Byte) 由 八 位 组 成 的 存 储 器 存 储 单 位 。<br />

词 汇 表 - 4 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


索 引<br />

本 索 引 中 的 条 目 按 字 母 顺 序 列 出 , 符 号 和 数 字 显 示 在 末 尾 。 所 给 出 的 参 考 是 按 页 码 提 供 的 。<br />

A<br />

ADD 指 令 2-60<br />

ADR<br />

<strong>ARM</strong> 伪 指 令 4-123<br />

Thumb 伪 指 令 5-47<br />

ADR Thumb 伪 指 令 2-32<br />

ADR 伪 指 令 2-32, 2-60<br />

ADRL 伪 指 令 2-32, 2-60<br />

ALIGN 命 令 2-58, 7-52<br />

ALU 状 态 标 志 2-22<br />

:AND: 运 算 符 2-58<br />

AREA 命 令 2-14, 2-16, 7-54<br />

AREA 命 令 ( 文 字 池 ) 2-30<br />

armasm<br />

命 令 语 法 3-2<br />

ASSERT 命 令 2-57, 2-67, 7-46<br />

B<br />

B 指 令 , Thumb 2-22<br />

:BASE: 运 算 符 2-60, 3-26<br />

BL 指 令 2-18<br />

BL 指 令 , Thumb 2-22<br />

BX 指 令 2-20<br />

半 字<br />

在 装 载 和 存 储 指 令 中 2-7<br />

变 量 , 汇 编 3-13<br />

局 部 7-6, 7-7<br />

内 置 3-10<br />

全 局 7-4, 7-7<br />

替 换 3-14<br />

标 号 , 汇 编 3-15<br />

标 号 , 汇 编 语 言 2-14<br />

标 号 , 局 部 , 汇 编 3-16<br />

布 尔 常 数 , 汇 编 语 言 2-15<br />

C<br />

:CHR: 运 算 符 3-26<br />

CN 命 令 7-9<br />

CODE16 命 令 2-20, 3-2, 7-57<br />

CODE32 命 令 2-20, 7-57<br />

CP 命 令 7-10<br />

CPSR 2-5, 2-22<br />

参 数 , 汇 编 宏 2-50<br />

常 数 , 汇 编 2-15<br />

乘 法 运 算 符 , 汇 编 3-28<br />

程 序 计 数 器 , 汇 编 3-11, 3-15, 3-23<br />

程 序 计 数 器 , 汇 编 语 言 2-5<br />

程 序 计 数 器 , Thumb 2-12<br />

处 理 器 模 式 2-4<br />

D<br />

DATA 命 令 7-25<br />

DCB 命 令 7-18<br />

DCDO 命 令 7-20<br />

DCD、 DCDU 命 令 7-19<br />

DCFD、 DCFDU 命 令 7-21<br />

DCFS、 DCFSU 命 令 7-22<br />

DCI 命 令 7-23<br />

DCQ、 DCQU 命 令 7-24<br />

DCW、 DCWU 命 令 7-25<br />

DN 命 令 7-11<br />

大 小 写 规 则 , 汇 编 语 言 2-13<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 索 引 - 1


索 引<br />

代 码 大 小 2-24, 2-63<br />

当 前 程 序 状 态 寄 存 器 2-5<br />

地 址<br />

装 载 到 寄 存 器 中 2-32<br />

对 齐 2-58<br />

多 个 寄 存 器 传 送 2-41<br />

E<br />

ELIF 命 令 7-30<br />

ELSE 命 令 7-30<br />

END 命 令 2-17, 7-58<br />

END 命 令 ( 文 字 池 ) 2-30<br />

ENDFUNC 命 令 7-45<br />

ENDIF 命 令 7-30<br />

ENDP 命 令 7-45<br />

ENTRY 命 令 2-17, 7-59<br />

EQU 命 令 3-13, 7-60<br />

EXPORT 命 令 7-61<br />

EXPORTAS 命 令 7-62<br />

EXTERN 命 令 7-63<br />

二 元 运 算 符 , 汇 编 3-28<br />

F<br />

FIELD 命 令 7-16<br />

FN 命 令 7-12<br />

FRAME ADDRESS 命 令 7-35<br />

FRAME POP 命 令 7-36<br />

FRAME PUSH 命 令 7-37<br />

FRAME REGISTER 命 令 7-38<br />

FRAME RESTORE 命 令 7-39<br />

FRAME RETURN ADDRESS 命 令<br />

7-40<br />

FRAME SAVE 命 令 7-41<br />

FRAME STATE REMEMBER 命 令<br />

7-42<br />

FRAME STATE RESTORE 命 令<br />

7-43<br />

FUNCTION 命 令 7-44<br />

范 围 , 汇 编 语 言 2-14<br />

浮 点 文 本 , 汇 编 3-22<br />

符 号<br />

汇 编 语 言 3-12<br />

汇 编 语 言 , 命 名 规 则 3-12<br />

符 号 , 基 于 寄 存 器 的 2-60<br />

G<br />

GBLA 命 令 3-6, 3-13, 7-4, 7-48<br />

GBLL 命 令 3-6, 3-13, 7-4, 7-48<br />

GBLS 命 令 3-6, 3-13, 7-4, 7-48<br />

GET 命 令 3-5, 7-64<br />

GLOBAL 命 令 7-61<br />

关 系 运 算 符 , 汇 编 3-30<br />

滚 筒 式 移 位 器 2-9, 2-22<br />

滚 筒 式 移 位 器 , Thumb 2-11<br />

H<br />

汇 编 语 言<br />

变 量 3-13<br />

局 部 7-6, 7-7<br />

内 置 3-10<br />

全 局 7-4, 7-7<br />

变 量 替 换 3-14<br />

标 号 2-14, 3-15<br />

布 尔 常 数 2-15<br />

常 数 2-15<br />

乘 法 运 算 符 3-28<br />

程 序 计 数 器 2-5, 3-11, 3-15, 3-23<br />

大 小 写 规 则 2-13<br />

代 码 大 小 2-63<br />

定 义 宏 7-27<br />

对 齐 2-58<br />

多 个 寄 存 器 传 送 2-41<br />

ELF 段 2-16<br />

二 元 运 算 符 3-28<br />

浮 点 文 本 3-22<br />

符 号 2-60, 3-12<br />

符 号 命 名 规 则 3-12<br />

关 系 运 算 符 3-30<br />

宏 2-50<br />

寄 存 器 名 称 3-9<br />

基 于 寄 存 器 的<br />

映 射 2-55<br />

基 址 寄 存 器 2-54<br />

局 部 标 号 2-14, 3-16<br />

绝 对 地 址 3-15<br />

块 复 制 2-46<br />

立 即 数 , <strong>ARM</strong> 2-28<br />

逻 辑<br />

变 量 3-13<br />

表 达 式 3-23<br />

逻 辑 文 本 3-23<br />

内 置 变 量 3-10<br />

pc 2-5, 2-42, 2-45, 2-48, 3-11, 3-15,<br />

3-23<br />

嵌 套 子 程 序 2-45<br />

全 局 变 量 7-4, 7-7<br />

入 口 点 2-17, 7-59<br />

示 例 2-2, 2-16, 2-18, 2-24, 2-30,<br />

2-33, 2-37, 2-39, 2-46, 2-63, 2-65<br />

示 例 , Thumb 2-20, 2-26, 2-40,<br />

2-48<br />

数 据 结 构 2-53<br />

数 字 变 量 3-13<br />

数 字 表 达 式 3-20<br />

数 字 常 数 2-15, 3-13<br />

数 字 文 本 3-21<br />

速 度 2-63<br />

Thumb 块 复 制 2-48<br />

填 充 2-58<br />

条 件 代 码 后 缀 2-23<br />

条 件 执 行 2-22<br />

VFP 命 令 和 记 号 6-38<br />

维 护 2-58<br />

文 字 池 2-30<br />

相 对 程 序 的 2-14<br />

表 达 式 3-23<br />

相 对 寄 存 器 的<br />

表 达 式 3-23<br />

标 号 3-15<br />

相 对 寄 存 器 的 地 址 2-14<br />

相 对 映 射 2-54<br />

相 对 于 程 序 的 映 射 2-56<br />

协 处 理 器 名 称 3-9<br />

行 格 式 2-13<br />

移 位 运 算 符 3-29<br />

一 元 运 算 符 3-26<br />

映 射 2-53<br />

与 程 序 相 关 的 标 号 3-15<br />

语 句 行 长 度 2-13<br />

源 语 句 行 格 式 3-8<br />

运 算 符 优 先 级 3-24, 3-25<br />

栈 2-44<br />

执 行 速 度 2-63<br />

注 释 2-14<br />

装 载 常 数 2-27<br />

装 载 地 址 2-32<br />

子 程 序 2-18<br />

字 符 常 数 2-15<br />

字 符 串<br />

变 量 3-13<br />

表 达 式 3-19<br />

索 引 - 2 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


索 引<br />

操 作 3-28<br />

字 符 串 常 数 2-15<br />

字 符 串 文 本 3-19<br />

汇 编 语 言 跳 转 表 2-34<br />

J<br />

寄 存 器 2-4<br />

名 称 , 汇 编 3-9<br />

寄 存 器 访 问 , Thumb 2-10<br />

寄 存 器 组 2-4<br />

IF 命 令 7-29, 7-30, 7-33<br />

IMPORT 目 录 7-65<br />

INCBIN 目 录 7-66<br />

INCLUDE 命 令 3-5, 7-64<br />

:INDEX: 运 算 符 2-60, 3-26<br />

INFO 命 令 7-47<br />

基 于 寄 存 器 的<br />

符 号 2-60<br />

基 于 寄 存 器 的 映 射 2-55<br />

基 址 寄 存 器 2-54<br />

局 部<br />

变 量 , 汇 编 7-6, 7-7<br />

标 号 , 汇 编 3-16<br />

局 部 标 号 , 汇 编 语 言 2-14<br />

绝 对 地 址 3-15<br />

K<br />

KEEP 命 令 7-67<br />

块 复 制 , 汇 编 语 言 2-46<br />

块 复 制 , Thumb 2-48<br />

L<br />

LCLA 命 令 3-13, 7-6, 7-48<br />

LCLL 命 令 3-13, 7-48<br />

LCLS 命 令 3-13, 7-48<br />

LDFD 伪 指 令 6-36, 7-14<br />

LDFS 伪 指 令 7-14<br />

LDM<br />

指 令 4-20<br />

LDM 指 令 2-41, 2-56, 3-3, 7-8<br />

Thumb 2-48<br />

LDR<br />

Thumb 伪 指 令 5-48<br />

伪 指 令 2-27, 2-29, 2-37, 4-126<br />

相 对 映 射 2-54<br />

指 令 4-9, 4-14, 4-17<br />

LDR 伪 指 令 7-14<br />

文 字 池 2-30<br />

装 载 常 数 2-29, 2-37<br />

字 符 串 复 制 2-39<br />

:LEFT: 运 算 符 3-28<br />

:LEN: 运 算 符 3-26<br />

LTORG 命 令 7-14<br />

立 即 数 , <strong>ARM</strong> 2-28<br />

链 接<br />

汇 编 语 言 标 号 2-14<br />

链 接 寄 存 器 2-5, 2-18<br />

逻 辑<br />

变 量 , 汇 编 3-13<br />

表 达 式 , 汇 编 语 言 3-23<br />

逻 辑 文 本 , 汇 编 3-23<br />

M<br />

MACRO 命 令 2-50, 7-27<br />

MAP 命 令 2-53, 7-15<br />

MEND 命 令 7-27, 7-48<br />

MEXIT 命 令 7-29<br />

MOV 指 令 2-27, 2-28, 2-54<br />

MRS 指 令 2-9<br />

MSR 指 令 2-9<br />

MVN 指 令 2-27, 2-28<br />

命 令 语 法<br />

armasm 3-2<br />

命 令 , 汇 编 语 言<br />

ALIGN 2-58, 7-52<br />

AREA 2-14, 2-16, 7-54<br />

AREA ( 文 字 池 ) 2-30<br />

ASSERT 2-57, 2-67, 7-46<br />

CN 7-9<br />

CODE16 2-20, 3-2, 7-57<br />

CODE32 2-20, 7-57<br />

CP 7-10<br />

DATA 7-25<br />

DCB 7-18<br />

DCDO 7-20<br />

DCD、 DCDU 7-19<br />

DCFD、 DCFDU 7-21<br />

DCFS、 DCFSU 7-22<br />

DCI 7-23<br />

DCQ、 DCQU 7-24<br />

DCW、 DCWU 7-25<br />

DN 7-11<br />

ELIF 7-30<br />

ELSE 7-30<br />

END 2-17, 7-58<br />

ENDFUNC 7-45<br />

ENDIF 7-30<br />

ENDP 7-45<br />

END ( 文 字 池 ) 2-30<br />

ENTRY 2-17, 7-59<br />

EQU 3-13, 7-60<br />

EXPORT 7-61<br />

EXPORTAS 7-62<br />

EXTERN 7-63<br />

FIELD 7-16<br />

FN 7-12<br />

FRAME ADDRESS 7-35<br />

FRAME POP 7-36<br />

FRAME PUSH 7-37<br />

FRAME REGISTER 7-38<br />

FRAME RESTORE 7-39<br />

FRAME RETURN ADDRESS<br />

7-40<br />

FRAME SAVE 7-41<br />

FRAME STATE REMEMBER<br />

7-42<br />

FRAME STATE RESTORE 7-43<br />

FUNCTION 7-44<br />

GBLA 3-6, 3-13, 7-4, 7-48<br />

GBLL 3-6, 3-13, 7-4, 7-48<br />

GBLS 3-6, 3-13, 7-4, 7-48<br />

GET 3-5, 7-64<br />

GLOBAL 7-61<br />

IF 7-29, 7-30, 7-33<br />

IMPORT 7-65<br />

INCBIN 7-66<br />

INCLUDE 3-5, 7-64<br />

INFO 7-47<br />

KEEP 7-67<br />

LCLA 3-13, 7-6, 7-48<br />

LCLL 3-13, 7-48<br />

LCLS 3-13, 7-48<br />

LTORG 7-14<br />

MACRO 2-50, 7-27<br />

MAP 2-53, 7-15<br />

MEND 7-27, 7-48<br />

MEXIT 7-29<br />

NOFP 7-68<br />

OPT 3-11, 7-48<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 索 引 - 3


索 引<br />

N<br />

PRESERVE8 7-69<br />

PROC 7-44<br />

嵌 套 7-26<br />

REQUIRE 7-68<br />

REQUIRE8 7-69<br />

RLIST 3-3, 7-7<br />

RN 7-70<br />

ROUT 2-14, 3-16, 3-17, 7-71<br />

SETA 3-6, 3-11, 3-13, 7-7, 7-48<br />

SETL 3-6, 3-11, 3-13, 7-7, 7-48<br />

SETS 3-6, 3-11, 3-13, 7-7, 7-48<br />

SN 7-11<br />

SPACE 7-17<br />

SUBT 7-50<br />

TTL 7-50<br />

WEND 7-33<br />

VFPASSERT SCALAR 6-39<br />

VFPASSERT VECTOR 6-40<br />

WHILE 7-29, 7-33<br />

! 7-47<br />

# 7-16<br />

% 7-17<br />

& 7-19<br />

* 7-60<br />

= 7-18<br />

[ 7-30<br />

] 7-30<br />

^ 7-15<br />

| 7-30<br />

NOFP 命 令 7-68<br />

NOP Thumb 伪 指 令 5-50<br />

NOP 伪 指 令 4-122, 4-129<br />

O<br />

OPT 命 令 3-11, 7-48<br />

P<br />

pc, 汇 编 语 言 2-5, 2-42, 2-45, 2-48<br />

PLD<br />

指 令 4-22<br />

POP 指 令 , Thumb 2-48<br />

PRESERVE8 命 令 7-69<br />

PROC 命 令 7-44<br />

PUSH 指 令 , Thumb 2-48<br />

Q<br />

嵌 套 命 令 7-26<br />

嵌 套 子 程 序 , 汇 编 语 言 2-45<br />

R<br />

REQUIRE 命 令 7-68<br />

REQUIRE8 命 令 7-69<br />

:RIGHT: 运 算 符 3-28<br />

RLIST 7-7<br />

RLIST 命 令 7-7<br />

RLIST 指 令 3-3<br />

RN 命 令 7-70<br />

ROUT 命 令 2-14, 3-16, 3-17, 7-71<br />

入 口 点<br />

汇 编 7-59<br />

入 口 点 , 汇 编 2-17<br />

S<br />

SETA 命 令 3-6, 3-11, 3-13, 7-7, 7-48<br />

SETL 命 令 3-6, 3-11, 3-13, 7-7, 7-48<br />

SETS 命 令 3-6, 3-11, 3-13, 7-7, 7-48<br />

SEXT 伪 指 令 4-128<br />

SN 命 令 7-11<br />

SPACE 命 令 7-17<br />

STM<br />

指 令 4-20<br />

STM 指 令 2-41, 2-56, 3-3, 7-8<br />

Thumb 2-48<br />

STR<br />

指 令 4-9, 4-14, 4-17<br />

:STR: 运 算 符 3-26<br />

SUBT 命 令 7-50<br />

SWP<br />

指 令 4-31<br />

使 用 此 命 令 调 用 3-2<br />

数 据 处 理 指 令 2-7<br />

数 据 处 理 指 令 , Thumb 2-11<br />

数 据 结 构 , 汇 编 2-53<br />

数 据 映 射 , 汇 编 2-53<br />

数 字 变 量 , 汇 编 3-13<br />

数 字 表 达 式 , 汇 编 3-20<br />

数 字 常 数 , 汇 编 3-13<br />

数 字 常 数 , 汇 编 语 言 2-15<br />

数 字 文 本 , 汇 编 3-21<br />

T<br />

Thumb<br />

BX 指 令 2-20<br />

弹 出 pc 2-45<br />

LDM 和 STM 指 令 2-48<br />

示 例 汇 编 语 言 2-20<br />

条 件 执 行 2-22<br />

直 接 装 载 2-29<br />

指 令 集 2-10<br />

TTL 命 令 7-50<br />

填 充 2-58<br />

条 件 代 码 后 缀 2-23<br />

条 件 执 行 , 汇 编 2-22, 2-24<br />

条 件 执 行 , Thumb 2-10, 2-11<br />

跳 转 表 , 汇 编 语 言 2-34<br />

跳 转 指 令 2-7<br />

跳 转 指 令 , Thumb 2-11<br />

W<br />

WEAK 符 号 7-63, 7-65<br />

WEND 命 令 7-33<br />

UEXT 伪 指 令 4-128<br />

VFP 命 令 和 记 号 6-38<br />

VFPASSERT SCALAR 指 令 6-39<br />

VFPASSERT VECTOR 命 令 6-40<br />

WHILE 命 令 7-29, 7-33<br />

伪 指 令 , 汇 编 语 言<br />

ADR 2-32, 2-60, 4-123<br />

ADR (Thumb) 2-32, 5-47<br />

ADRL 2-32, 2-60<br />

LDFD 6-36, 7-14<br />

LDFS 7-14<br />

LDR 2-27, 2-29, 2-37, 4-126, 7-14<br />

LDR (Thumb) 5-48<br />

LDR ( 文 字 池 ) 2-30<br />

LDR ( 装 载 常 数 ) 2-29<br />

LDR ( 装 载 地 址 ) 2-37<br />

NOP 4-122, 4-129<br />

NOP (Thumb) 5-50<br />

索 引 - 4 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC


索 引<br />

SEXT 4-128<br />

UEXT 4-128<br />

文 字 池 , 汇 编 语 言 2-30<br />

X<br />

相 对 程 序 的<br />

表 达 式 3-23<br />

标 号 3-15<br />

相 对 程 序 的 地 址 2-14<br />

相 对 寄 存 器 的<br />

表 达 式 3-23<br />

相 对 寄 存 器 的 标 号 3-15<br />

相 对 寄 存 器 的 地 址 2-14<br />

相 对 映 射 2-54<br />

相 对 于 程 序 的 映 射 2-56<br />

协 处 理 器 名 称 , 汇 编 3-9<br />

行 长 度 , 汇 编 语 言 2-13<br />

行 格 式 , 汇 编 语 言 2-13<br />

Y<br />

移 位 运 算 符 , 汇 编 3-29<br />

一 元 运 算 符 , 汇 编 3-26<br />

映 射 , 汇 编 语 言<br />

基 于 寄 存 器 的 2-55<br />

相 对 程 序 的 2-56<br />

相 对 的 2-54<br />

原 型 语 句 2-50<br />

运 算 符 优 先 级 , 汇 编 3-24, 3-25<br />

运 算 符 , 汇 编 语 言<br />

:AND: 2-58<br />

:BASE: 2-60<br />

:INDEX: 2-60<br />

Z<br />

栈 指 针 2-4<br />

栈 , 汇 编 语 言 2-44<br />

指 令 集<br />

<strong>ARM</strong> 2-7<br />

Thumb 2-10<br />

指 令 , 汇 编 语 言<br />

ADD 2-60<br />

BL 2-18<br />

BX 2-20<br />

LDM 2-41, 2-56, 3-3, 4-20, 7-8<br />

LDR 4-9, 4-14, 4-17<br />

LDR, Thumb 2-48<br />

MOV 2-27, 2-28, 2-54<br />

MRS 2-9<br />

MSR 2-9<br />

MVN 2-27, 2-28<br />

PLD 4-22<br />

POP, Thumb 2-48<br />

PUSH, Thumb 2-48<br />

STM 2-41, 2-56, 3-3, 4-20, 7-8<br />

STM, Thumb 2-48<br />

STR 4-9, 4-14, 4-17<br />

SWP 4-31<br />

执 行 速 度 2-24, 2-63<br />

注 释<br />

汇 编 语 言 2-14<br />

状 态 标 志 2-22<br />

装 载 常 数 , 汇 编 语 言 2-27<br />

子 程 序 , 汇 编 语 言 2-18<br />

字 符 常 数 , 汇 编 语 言 2-15<br />

字 符 串<br />

变 量 , 汇 编 3-13<br />

表 达 式 , 汇 编 语 言 3-19<br />

操 作 , 汇 编 3-28<br />

字 符 串 常 数 , 汇 编 语 言 2-15<br />

字 符 串 文 本 , 汇 编 3-19<br />

符 号<br />

! 命 令 7-47<br />

# 命 令 7-16<br />

& 命 令 7-19<br />

* 命 令 7-60<br />

[ 命 令 7-30<br />

] 命 令 7-30<br />

^ 命 令 7-15<br />

| 命 令 7-30<br />

% 命 令 7-17<br />

= 命 令 7-18<br />

<strong>ARM</strong> DUI 0204BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 索 引 - 5


索 引<br />

索 引 - 6 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0204BSC

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

Saved successfully!

Ooh no, something went wrong!