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 编 译 器 运 行 时 环 境下 面 这 个 示 例 说 明 如 何 传 递 结 构 给 函 数 。 如 果 整 个 结 构 都 可 以 存 放 在 可 用 的 寄 存 器 中 ,那 么 通 过 寄 存 器 来 传 递 结 构 ; 否 则 结 构 参 数 将 存 放 在 堆 栈 中 。例 4-2:typedef struct bar {int i;double d;} bar;voidparams1(int i, bar b) {/*** W0 i** W1 b.i** W5:W2 b.d*/函 数 调 用 模 型 , 传 递 结 构}与 长 度 可 变 参 数 列 表 中 的 省 略 号 (...) 对 应 的 参 数 不 分 配 到 寄 存 器 中 。 任 何 不 分 配 到寄 存 器 的 参 数 都 以 自 右 向 左 的 顺 序 压 入 堆 栈 。下 面 的 示 例 中 , 由 于 结 构 参 数 太 大 而 不 能 存 放 到 寄 存 器 中 。 但 是 , 这 并 不 会 禁 止 使 用寄 存 器 来 存 放 下 一 个 参 数 。例 4-3:函 数 调 用 模 型 , 基 于 堆 栈 的 参 数typedef struct bar {double d,e;} bar;voidparams2(int i, bar b, int j) {/*** W0 i** stack b** W1 j*/}对 存 放 到 堆 栈 的 参 数 的 访 问 与 是 否 创 建 了 帧 指 针 有 关 。 编 译 器 一 般 情 况 下 都 创 建 帧 指针 ( 除 非 已 另 外 指 示 编 译 器 不 要 这 样 做 ), 将 通 过 帧 指 针 寄 存 器 (W14) 访 问 基 于 堆栈 的 参 数 。 在 上 面 的 示 例 中 , 通 过 W14-22 访 问 b。 已 通 过 减 去 上 一 个 FP 的 2 个 字节 , 返 回 地 址 的 4 个 字 节 , 和 b 的 16 个 字 节 , 计 算 出 相 对 于 帧 指 针 的 偏 移 量 为 -22( 参 见 图 4-6)。不 使 用 帧 指 针 时 , 汇 编 编 程 人 员 必 须 知 晓 自 过 程 的 入 口 开 始 使 用 了 多 少 堆 栈 空 间 。 如果 没 有 额 外 使 用 堆 栈 空 间 , 计 算 与 上 面 类 似 。 将 通 过 W15-20 访 问 b:4 个 字 节 用 于 返回 地 址 , 16 个 字 节 用 于 访 问 b 的 首 地 址 。© 2005 Microchip Technology Inc. DS51284C_CN 第 73 页

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

Saved successfully!

Ooh no, something went wrong!