10.07.2015 Views

MPLAB® C30 C 编译器用户指南

MPLAB® C30 C 编译器用户指南

MPLAB® C30 C 编译器用户指南

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.

MPLAB ® <strong>C30</strong> 用 户 指 南当 汇 编 指 令 有 一 个 读 — 写 操 作 数 , 或 者 有 一 个 仅 某 些 位 将 被 修 改 的 操 作 数 时 , 必 须 在逻 辑 上 将 其 功 能 拆 分 为 两 个 独 立 的 操 作 数 : 一 个 是 输 入 操 作 数 , 一 个 是 只 写 输 出 操 作数 。 这 两 个 操 作 数 之 间 的 关 系 由 指 明 执 行 指 令 时 两 个 操 作 数 需 要 在 同 一 地 址 的 约 束 表明 。 可 对 两 个 操 作 数 使 用 相 同 的 或 不 同 的 C 表 达 式 。 例 如 , 下 面 的 add 指 令 中 , bar作 为 只 读 源 操 作 数 , foo 作 为 读 — 写 目 标 操 作 数 :asm ("add %2,%1,%0": "=r" (foo): "0" (foo), "r" (bar));操 作 数 1 的 约 束 “0” 表 明 该 操 作 数 必 须 与 操 作 数 0 占 用 相 同 的 地 址 。 仅 允 许 在 输 入操 作 数 的 约 束 中 使 用 数 字 , 并 且 必 须 指 向 输 出 操 作 数 。 约 束 中 只 有 数 字 可 保 证 一 个 操作 数 将 和 另 一 个 操 作 数 存 放 在 同 一 地 址 。 foo 是 两 个 操 作 数 的 值 并 不 足 以 保 证 两 个 操作 数 在 生 成 的 汇 编 代 码 中 位 于 相 同 的 地 址 。 下 面 的 代 码 可 以 做 到 这 一 点 :asm ("add %2,%1,%0": "=r" (foo): "r" (foo), "r" (bar));各 种 优 化 和 重 载 可 能 导 致 操 作 数 0 和 操 作 数 1 位 于 不 同 的 寄 存 器 中 。 例 如 , 编 译 器 可能 在 一 个 寄 存 器 中 找 到 foo 的 值 的 一 个 拷 贝 , 将 这 个 寄 存 器 用 于 操 作 数 1, 但 是 在 另一 个 寄 存 器 中 生 成 了 输 出 操 作 数 0 ( 将 其 拷 贝 到 foo 自 身 地 址 的 后 面 )。还 可 以 使 用 可 在 汇 编 代 码 模 板 内 引 用 的 符 号 名 来 指 定 输 入 和 输 出 操 作 数 。 这 些 符 号 名在 约 束 字 符 串 前 的 方 括 号 内 指 定 , 可 使 用 %[name] ( 而 不 是 百 分 号 加 操 作 数 编 号 ) 在汇 编 代 码 模 板 内 引 用 。 使 用 指 定 的 操 作 数 , 上 面 的 例 子 可 编 码 如 下 :asm ("add %[foo],%[bar],%[foo]": [foo] "=r" (foo): "0" (foo), [bar] "r" (bar));通 过 在 asm 后 写 关 键 字 volatile, 可 禁 止 asm 指 令 被 删 除 、 明 显 移 动 或 组 合 。 例如 :#define disi(n) \asm volatile ("disi #%0" \: /* no outputs */ \: "i" (n))在 这 个 例 子 中 , 约 束 字 母 “i” 表 示 disi 指 令 要 求 的 立 即 操 作 数 。DS51284C_CN 第 100 页© 2005 Microchip Technology Inc.

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

Saved successfully!

Ooh no, something went wrong!