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