MPLAB® C30 C 编译器用户指南

MPLAB® C30 C 编译器用户指南 MPLAB® C30 C 编译器用户指南

ie.ksu.edu.tw
from ie.ksu.edu.tw More from this publisher
10.07.2015 Views

MPLAB ® C30 用 户 指 南例 8-1:C 和 汇 编 混 合 编 程/*** file: ex1.c*/extern unsigned int asmVariable;extern void asmFunction(void);unsigned int cVariable;void foo(void){asmFunction();asmVariable = 0x1234;}文 件 ex2.s 定 义 了 链 接 应 用 程 序 需 要 使 用 的 asmFunction 和 asmVariable。 汇 编文 件 还 说 明 了 如 何 调 用 C 函 数 foo, 以 及 如 何 访 问 C 定 义 的 变 量 cVariable。;; file: ex2.s;.text.global _asmFunction_asmFunction:mov #0,w0mov w0,_cVariablereturn.global _begin_main:call _fooreturn.bss.global _asmVariable.align 2_asmVariable: .space 2.end在 C 文 件 ex1.c 中 , 使 用 了 标 准 的 extern 关 键 字 声 明 了 对 汇 编 文 件 中 定 义 的 符 号的 外 部 引 用 ; 注 意 汇 编 源 文 件 中 的 asmFunction 或 _asmFunction 是 一 个 void 函数 , 进 行 了 相 应 声 明 。在 汇 编 文 件 ex1.s 中 , 通 过 使 用 .global 汇 编 伪 指 令 , 使 符 号 _asmFunction、_main 和 _asmVariable 全 局 可 见 , 并 可 被 任 何 其 他 源 文 件 访 问 。 仅 引 用 了 符 号_main, 未 进 行 声 明 ; 因 此 , 汇 编 器 将 其 视 为 外 部 引 用 。下 面 的 MPLAB C30 示 例 展 示 了 如 何 调 用 带 两 个 参 数 的 汇 编 函 数 。 call1.c 中 的 C 函数 main 调 用 call2.s 中 带 两 个 参 数 的 asmFunction。DS51284C_CN 第 96 页© 2005 Microchip Technology Inc.

汇 编 语 言 和 C 模 块 混 合 编 程8.4 使 用 行 内 汇 编例 8-2:在 C 中 调 用 汇 编 函 数/*** file: call1.c*/extern int asmFunction(int, int);int x;voidmain(void){x = asmFunction(0x100, 0x200);}汇 编 函 数 将 两 个 参 数 相 加 , 并 返 回 结 果 。;; file: call2.s;.global _asmFunction_asmFunction:add w0,w1,w0return.end关 于 C 中 参 数 传 递 的 详 细 描 述 , 请 参 阅 第 4.12.2 节 “ 返 回 值 ”。 在 前 面 的 例 子 中 , 两个 整 型 参 数 通 过 W0 和 W1 寄 存 器 传 递 。 整 型 返 回 结 果 通 过 寄 存 器 W0 传 递 。 对 于 更为 复 杂 的 参 数 列 表 , 可 能 需 要 更 多 不 同 的 寄 存 器 , 且 要 注 意 在 编 写 汇 编 程 序 时 要 遵 循指 导 原 则 。在 C 函 数 中 , 可 使 用 asm 语 句 将 一 行 汇 编 代 码 插 入 到 编 译 器 生 成 的 汇 编 语 句 中 。 行 内汇 编 有 两 种 形 式 : 简 单 的 和 扩 展 的 。在 简 单 形 式 中 , 使 用 下 面 的 语 法 写 汇 编 指 令 :asm ("instruction");其 中 instruction 是 一 个 有 效 的 汇 编 语 言 语 法 结 构 。 如 果 在 ANSI C 程 序 中 写 行 内 汇 编 ,使 用 __asm__ , 而 不 是 asm。注 : 只 能 传 递 一 个 字 符 串 到 简 单 形 式 的 行 内 汇 编 。在 使 用 asm 的 扩 展 汇 编 指 令 中 , 使 用 C 表 达 式 指 定 指 令 的 操 作 数 。 扩 展 行 内 汇 编 的 语法 如 下 :asm("template" [ : [ "constraint"(output-operand) [ , ... ] ][ : [ "constraint"(input-operand) [ , ... ] ][ "clobber" [ , ... ] ]]]);必 须 指 定 汇 编 指 令 template, 并 为 每 个 操 作 数 指 定 操 作 数 constraint 字 符 串 。template 指 定 指 令 助 记 符 , 以 及 操 作 数 的 占 位 符 ( 可 选 )。 constraint 字 符 串 指定 操 作 数 约 束 , 例 如 , 指 定 一 个 操 作 数 必 须 位 于 寄 存 器 中 ( 通 常 是 这 样 的 ), 或 者 操作 数 必 须 为 立 即 值 。MPLAB C30 支 持 如 下 约 束 字 母 。© 2005 Microchip Technology Inc. DS51284C_CN 第 97 页

汇 编 语 言 和 C 模 块 混 合 编 程8.4 使 用 行 内 汇 编例 8-2:在 C 中 调 用 汇 编 函 数/*** file: call1.c*/extern int asmFunction(int, int);int x;voidmain(void){x = asmFunction(0x100, 0x200);}汇 编 函 数 将 两 个 参 数 相 加 , 并 返 回 结 果 。;; file: call2.s;.global _asmFunction_asmFunction:add w0,w1,w0return.end关 于 C 中 参 数 传 递 的 详 细 描 述 , 请 参 阅 第 4.12.2 节 “ 返 回 值 ”。 在 前 面 的 例 子 中 , 两个 整 型 参 数 通 过 W0 和 W1 寄 存 器 传 递 。 整 型 返 回 结 果 通 过 寄 存 器 W0 传 递 。 对 于 更为 复 杂 的 参 数 列 表 , 可 能 需 要 更 多 不 同 的 寄 存 器 , 且 要 注 意 在 编 写 汇 编 程 序 时 要 遵 循指 导 原 则 。在 C 函 数 中 , 可 使 用 asm 语 句 将 一 行 汇 编 代 码 插 入 到 编 译 器 生 成 的 汇 编 语 句 中 。 行 内汇 编 有 两 种 形 式 : 简 单 的 和 扩 展 的 。在 简 单 形 式 中 , 使 用 下 面 的 语 法 写 汇 编 指 令 :asm ("instruction");其 中 instruction 是 一 个 有 效 的 汇 编 语 言 语 法 结 构 。 如 果 在 ANSI C 程 序 中 写 行 内 汇 编 ,使 用 __asm__ , 而 不 是 asm。注 : 只 能 传 递 一 个 字 符 串 到 简 单 形 式 的 行 内 汇 编 。在 使 用 asm 的 扩 展 汇 编 指 令 中 , 使 用 C 表 达 式 指 定 指 令 的 操 作 数 。 扩 展 行 内 汇 编 的 语法 如 下 :asm("template" [ : [ "constraint"(output-operand) [ , ... ] ][ : [ "constraint"(input-operand) [ , ... ] ][ "clobber" [ , ... ] ]]]);必 须 指 定 汇 编 指 令 template, 并 为 每 个 操 作 数 指 定 操 作 数 constraint 字 符 串 。template 指 定 指 令 助 记 符 , 以 及 操 作 数 的 占 位 符 ( 可 选 )。 constraint 字 符 串 指定 操 作 数 约 束 , 例 如 , 指 定 一 个 操 作 数 必 须 位 于 寄 存 器 中 ( 通 常 是 这 样 的 ), 或 者 操作 数 必 须 为 立 即 值 。MPLAB <strong>C30</strong> 支 持 如 下 约 束 字 母 。© 2005 Microchip Technology Inc. DS51284C_CN 第 97 页

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

Saved successfully!

Ooh no, something went wrong!