23.10.2014 Views

RealView - ARM Information Center

RealView - ARM Information Center

RealView - ARM Information Center

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

编 写 <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

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

Saved successfully!

Ooh no, something went wrong!