MPLAB® C30 C ç¼è¯å¨ç¨æ·æå
MPLAB® C30 C ç¼è¯å¨ç¨æ·æå MPLAB® C30 C ç¼è¯å¨ç¨æ·æå
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 页
- Page 51 and 52: 使 用 MPLAB C30 C 编 译 器表
- Page 53 and 54: 使 用 MPLAB C30 C 编 译 器表
- Page 55 and 56: 使 用 MPLAB C30 C 编 译 器表
- Page 57 and 58: 使 用 MPLAB C30 C 编 译 器3.5.
- Page 59 and 60: 使 用 MPLAB C30 C 编 译 器3.5.
- Page 61 and 62: 使 用 MPLAB C30 C 编 译 器3.6
- Page 63 and 64: 使 用 MPLAB C30 C 编 译 器下
- Page 65 and 66: 第 4 章 MPLAB C30 C 编 译 器
- Page 67 and 68: MPLAB C30 C 编 译 器 运 行 时
- Page 69 and 70: MPLAB C30 C 编 译 器 运 行 时
- Page 71 and 72: MPLAB C30 C 编 译 器 运 行 时
- Page 73 and 74: MPLAB C30 C 编 译 器 运 行 时
- Page 75 and 76: MPLAB C30 C 编 译 器 运 行 时
- Page 77 and 78: MPLAB C30 C 编 译 器 运 行 时
- Page 79 and 80: MPLAB C30 C 编 译 器 运 行 时
- Page 81 and 82: MPLAB C30 C 编 译 器 运 行 时
- Page 83 and 84: MPLAB ® C30用 户 指 南第 5
- Page 85 and 86: MPLAB ® C30用 户 指 南第 6
- Page 87 and 88: 器 件 支 持 文 件6.5 使 用
- Page 89 and 90: 器 件 支 持 文 件6.6 使 用
- Page 91 and 92: 器 件 支 持 文 件6.7.2 使
- Page 93 and 94: MPLAB ® C30用 户 指 南第 7
- Page 95 and 96: 中 断7.3.3 为 中 断 服 务
- Page 97 and 98: 中 断表 7-1: 中 断 向 量 (
- Page 99 and 100: 中 断7.6 中 断 响 应 时 间7
- Page 101: 第 8 章 汇 编 语 言 和 C 模
- Page 105 and 106: 汇 编 语 言 和 C 模 块 混
- Page 107 and 108: MPLAB ® C30用 户 指 南附 录
- Page 109 and 110: 实 现 定 义 的 操 作A.4 标
- Page 111 and 112: 实 现 定 义 的 操 作下 表
- Page 113 and 114: 实 现 定 义 的 操 作A.14 预
- Page 115 and 116: 实 现 定 义 的 操 作A.16 信
- Page 117 and 118: 实 现 定 义 的 操 作A.23 GET
- Page 119 and 120: 附 录 B MPLAB C30 C 编 译 器
- Page 121 and 122: MPLAB C30 C 编 译 器 诊 断ambi
- Page 123 and 124: MPLAB C30 C 编 译 器 诊 断cast
- Page 125 and 126: MPLAB C30 C 编 译 器 诊 断F‘
- Page 127 and 128: MPLAB C30 C 编 译 器 诊 断init
- Page 129 and 130: MPLAB C30 C 编 译 器 诊 断inva
- Page 131 and 132: MPLAB C30 C 编 译 器 诊 断Nneg
- Page 133 and 134: MPLAB C30 C 编 译 器 诊 断Rred
- Page 135 and 136: MPLAB C30 C 编 译 器 诊 断symb
- Page 137 and 138: MPLAB C30 C 编 译 器 诊 断void
- Page 139 and 140: MPLAB C30 C 编 译 器 诊 断anon
- Page 141 and 142: MPLAB C30 C 编 译 器 诊 断comp
- Page 143 and 144: MPLAB C30 C 编 译 器 诊 断dupl
- Page 145 and 146: MPLAB C30 C 编 译 器 诊 断func
- Page 147 and 148: MPLAB C30 C 编 译 器 诊 断‘i
- Page 149 and 150: MPLAB C30 C 编 译 器 诊 断libr
- Page 151 and 152: MPLAB C30 C 编 译 器 诊 断Ppar
汇 编 语 言 和 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 页