10.07.2015 Views

MPLAB® C30 C 编译器用户指南

MPLAB® C30 C 编译器用户指南

MPLAB® C30 C 编译器用户指南

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

汇 编 语 言 和 C 模 块 混 合 编 程在 这 个 例 子 中 , 由 于 指 定 了 “U” 约 束 , 操 作 数 nvar 是 声 明 到 near 数 据 空 间 的 字 符变 量 。 如 果 汇 编 指 令 可 能 修 改 标 志 ( 条 件 代 码 ) 寄 存 器 , 添 加 “cc” 到 被 破 坏 寄 存 器的 列 表 。 如 果 汇 编 指 令 以 不 可 预 估 的 方 式 修 改 存 储 器 , 添 加 “memory” 到 被 破 坏 寄存 器 的 列 表 。 这 将 使 MPLAB <strong>C30</strong> 不 跨 汇 编 指 令 保 存 存 储 在 寄 存 器 中 的 存 储 器 值 。可 以 在 一 个 asm 模 板 中 放 多 条 汇 编 指 令 , 中 间 用 换 行 ( 写 \n) 分 隔 开 。 输 入 操 作 数和 输 出 操 作 数 的 地 址 保 证 不 会 使 用 任 何 被 破 坏 的 寄 存 器 , 所 以 可 以 任 意 多 次 读 和 写 被破 坏 的 寄 存 器 。 下 面 是 在 一 个 模 板 中 有 多 条 指 令 的 例 子 ; 它 假 定 子 程 序 _foo 接 受 寄存 器 W0 和 W1 中 的 参 数 :asm ("mov %0,w0\nmov %1,W1\ncall _foo": /* no outputs */: "g" (a), "g" (b): "W0", "W1");在 这 个 例 子 中 , 约 束 字 符 串 “g” 表 明 一 个 普 通 操 作 数 。 假 定 在 产 生 输 出 之 前 使 用 了输 入 , MPLAB <strong>C30</strong> 可 能 将 输 出 分 配 到 无 关 的 输 入 操 作 数 存 放 的 寄 存 器 , 除 非 输 出 操作 数 有 & 约 束 修 饰 符 。 如 果 汇 编 代 码 实 际 上 包 含 多 条 指 令 , 这 个 假 定 可 能 是 错 误 的 。在 这 种 情 况 下 , 对 每 个 输 出 操 作 数 使 用 & , 不 会 与 输 入 操 作 数 重 叠 。 例 如 , 考 虑 下 面的 函 数 :intexprbad(int a, int b){int c;__asm__("add %1,%2,%0\n sl %0,%1,%0": "=r"(c) : "r"(a), "r"(b));return(c);}这 个 函 数 的 目 的 是 计 算 值 (a + b)

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

Saved successfully!

Ooh no, something went wrong!