01.12.2014 Views

RealView Compilation Tools Developer Guide - ARM Information ...

RealView Compilation Tools Developer Guide - ARM Information ...

RealView Compilation Tools Developer Guide - ARM Information ...

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.

混 合 使 用 C、 C++ 和 汇 编 语 言<br />

5.1.4 用 法<br />

• 可 以 更 改 处 理 器 模 式 、 改 变 ATPCS 寄 存 器 fp、 sl 和 sb, 或 者 改 变 协 处 理<br />

器 状 态 , 但 编 译 程 序 不 会 意 识 到 所 做 的 更 改 。 如 果 更 改 处 理 器 模 式 , 则 直<br />

到 改 回 到 原 模 式 时 才 能 使 用 C 或 C++ 表 达 式 , 因 为 编 译 程 序 将 破 坏 用 于<br />

更 改 后 处 理 器 模 式 的 寄 存 器 。<br />

类 似 地 , 如 果 通 过 执 行 浮 点 指 令 更 改 了 浮 点 协 处 理 器 状 态 , 则 直 到 恢 复 原<br />

状 态 后 , 才 能 使 用 浮 点 表 达 式 。<br />

以 下 几 点 适 用 于 内 联 汇 编 语 言 :<br />

• 在 汇 编 语 言 中 , 逗 号 用 作 分 隔 符 , 因 此 使 用 逗 号 操 作 符 的 C 表 达 式 必 须 包<br />

含 在 括 号 中 以 区 分 它 们 :<br />

__asm {ADD x, y, (f(), z)}<br />

• 在 内 联 汇 编 程 序 中 , 寄 存 器 名 视 为 C 或 C++ 变 量 。 它 们 不 一 定 与 相 同 名<br />

称 的 物 理 寄 存 器 相 关 ( 请 参 阅 第 5-5 页 的 虚 拟 和 物 理 寄 存 器 )。 如 果 未 将<br />

寄 存 器 声 明 为 C 或 C++ 变 量 , 则 编 译 程 序 会 发 出 警 告 , 提 醒 您 将 它 声 明<br />

为 变 量 。<br />

• 在 内 联 汇 编 程 序 中 不 要 保 存 和 恢 复 寄 存 器 。 编 译 程 序 为 您 完 成 此 操 作 。 此<br />

外 , 内 联 汇 编 程 序 不 提 供 对 物 理 寄 存 器 的 直 接 访 问 ( 请 参 阅 第 5-5 页 的 虚<br />

拟 和 物 理 寄 存 器 )。 对 除 CPSR 和 SPSR 之 外 的 寄 存 器 , 如 果 在 读 取 其 之<br />

前 没 有 写 入 , 将 发 出 错 误 信 息 。 例 如 :<br />

int f(int x)<br />

{<br />

__asm<br />

{<br />

STMFD sp!, {r0}<br />

ADD r0, x, 1<br />

EOR x, r0, x<br />

LDMFD sp!, {r0}<br />

}<br />

return x;<br />

}<br />

该 函 数 必 须 写 为 下 列 形 式 :<br />

int f(int x)<br />

{<br />

int r0;<br />

__asm<br />

{<br />

ADD r0, x, 1<br />

// save r0 - illegal: read before write<br />

// restore r0 - not needed.<br />

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

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

Saved successfully!

Ooh no, something went wrong!