c51 #pragma noaregs控制命令解析

上传人:第*** 文档编号:31321697 上传时间:2018-02-06 格式:DOC 页数:9 大小:81KB
返回 下载 相关 举报
c51 #pragma noaregs控制命令解析_第1页
第1页 / 共9页
c51 #pragma noaregs控制命令解析_第2页
第2页 / 共9页
c51 #pragma noaregs控制命令解析_第3页
第3页 / 共9页
c51 #pragma noaregs控制命令解析_第4页
第4页 / 共9页
c51 #pragma noaregs控制命令解析_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《c51 #pragma noaregs控制命令解析》由会员分享,可在线阅读,更多相关《c51 #pragma noaregs控制命令解析(9页珍藏版)》请在金锄头文库上搜索。

1、2010-12-11 16:39AREGS/NOAREGS说明:AREGS 控制使编译器对寄存器 R0 到 R7 用绝对寄存器地址。绝对地址提高了代码的效率。例如:PUSH 和 POP 指令只能用直接或绝对地址。用 AREGS 命令可以直接 PUSH 或 POP 寄存器。NOAREGS 命令对寄存器 R0 到 R7 不使能绝对寄存器地址。用 NOAREGS 编译的函数可以使用所有的 8051 寄存器组。命令可用在被别的函数用不同的寄存器组调用的函数中。例子:stmt level sourceextern char func ();char k;#pragma NOAREGS /noaregfu

2、nc C 语言程序noaregfunc () 1 k = func () + func ();#pragma AREGS /aregfunc C 语言程序aregfunc () k = func () + func (); FUNCTION noaregfunc (BEGIN) /noaregfunc 汇编语言程序LCALL funcMOV A,R7PUSH ACCLCALL funcPOP ACCADD A,R7MOV k,ARET; FUNCTION noaregfunc (END); FUNCTION aregfunc (BEGIN) /aregfunc 汇编语言程序LCALL func

3、PUSH AR7LCALL funcPOP ACCADD A,R7MOV k,ARET; FUNCTION aregfunc (END)以上摘自 jxlxh 翻译的 keil 公司发布的 C51.pdf可以看到,AREGS 与 NOAREGS 最大区别就是AREGS:PUSH AR7 /AR7 为 R7 的地址NOAREGS:MOV A,R7PUSH ACC所以 AREGS 的执行效率更高,而 NOAREGS 则不对 AR7 进行操作。#pragma百科名片在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma

4、指令对每个编译器给出了一个方法,在保持与 C 和 C+语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。目录一般格式 常用参数 应用实例一般格式 常用参数 应用实例展开编 辑 本 段 一 般 格 式其 格 式 一 般 为 : #Pragma Para。 其 中 Para 为 参 数 , 下 面 来 看 一 些 常 用的 参 数 编 辑 本 段 常 用 参 数#pragmamessage 参 数Message 参 数 能 够 在 编 译 信 息 输 出 窗 口 中 输 出 相 应 的 信 息 , 这 对 于 源代 码 信 息

5、 的 控 制 是 非 常 重 要 的 。 其 使 用 方 法 为 : #Pragma message(“消 息 文 本 ”) 当 编 译 器 遇 到 这 条 指 令 时 就 在 编 译 输 出 窗 口 中 将 消 息 文 本 打 印 出 来 。 当 我 们 在 程 序 中 定 义 了 许 多 宏 来 控 制 源 代 码 版 本 的 时 候 , 我 们 自 己 有 可能 都 会 忘 记 有 没 有 正 确 的 设 置 这 些 宏 , 此 时 我 们 可 以 用 这 条 指 令 在 编 译 的 时候 就 进 行 检 查 。 假 设 我 们 希 望 判 断 自 己 有 没 有 在 源 代 码 的 什

6、 么 地 方 定 义 了_X86 这 个 宏 可 以 用 下 面 的 方 法 #ifdef _X86 #Pragma message(“_X86 macro activated!”) #endif 当 我 们 定 义 了 _X86 这 个 宏 以 后 , 应 用 程 序 在 编 译 时 就 会 在 编 译 输 出 窗口 里 显 示 “_X86 macro activated!”。 我 们 就 不 会 因 为 不 记 得 自 己 定 义 的一 些 特 定 的 宏 而 抓 耳 挠 腮 了 。 code_seg 另 一 个 使 用 得 比 较 多 的 pragma 参 数 是 code_seg。 格

7、 式 如 : #pragma code_seg( section-name,section-class ) 它 能 够 设 置 程 序 中 函 数 代 码 存 放 的 代 码 段 , 当 我 们 开 发 驱 动 程 序 的 时 候就 会 使 用 到 它 。 #pragma once(比 较 常 用 ) 只 要 在 头 文 件 的 最 开 始 加 入 这 条 指 令 就 能 够 保 证 头 文 件 被 编 译 一 次 , 这条 指 令 实 际 上 在 VC6 中 就 已 经 有 了 , 但 是 考 虑 到 兼 容 性 并 没 有 太 多 的 使 用 它 。#pragma once 是 编 译 相

8、 关 , 就 是 说 这 个 编 译 系 统 上 能 用 , 但 在 其 他 编 译系 统 不 一 定 可 以 , 也 就 是 说 移 植 性 差 , 不 过 现 在 基 本 上 已 经 是 每 个 编 译 器 都有 这 个 定 义 了 。 #ifndef, #define, #endif 这 个 是 C+语 言 相 关 , 这 是 C+语 言 中 的宏 定 义 , 通 过 宏 定 义 避 免 文 件 多 次 编 译 。 所 以 在 所 有 支 持 C+语 言 的 编 译器 上 都 是 有 效 的 , 如 果 写 的 程 序 要 跨 平 台 , 最 好 使 用 这 种 方 式 #pragma

9、hdrstop#pragma hdrstop 表 示 预 编 译 头 文 件 到 此 为 止 , 后 面 的 头 文 件 不 进 行 预编 译 。 BCB 可 以 预 编 译 头 文 件 以 加 快 链 接 的 速 度 , 但 如 果 所 有 头 文 件 都 进 行预 编 译 又 可 能 占 太 多 磁 盘 空 间 , 所 以 使 用 这 个 选 项 排 除 一 些 头 文 件 。 有 时 单 元 之 间 有 依 赖 关 系 , 比 如 单 元 A 依 赖 单 元 B, 所 以 单 元 B 要 先于 单 元 A 编 译 。 你 可 以 用 #pragma startup 指 定 编 译 优 先

10、 级 , 如 果 使 用 了#pragma package(smart_init) , BCB 就 会 根 据 优 先 级 的 大 小 先 后 编 译 。 #pragma resource#pragma resource *.dfm表 示 把 *.dfm 文 件 中 的 资 源 加 入 工 程 。*.dfm 中 包 括 窗 体 外 观 的 定 义 。 #pragma warning#pragma warning( disable : 4507 34; once : 4385; error : 164 ) 等 价 于 : #pragma warning(disable:4507 34) / 不

11、显 示 4507 和 34 号 警 告 信息 #pragma warning(once:4385) / 4385 号 警 告 信 息 仅 报 告 一 次 #pragma warning(error:164) / 把 164 号 警 告 信 息 作 为 一 个 错 误 。 同 时 这 个 pragma warning 也 支 持 如 下 格 式 : #pragma warning( push ,n ) #pragma warning( pop ) 这 里 n 代 表 一 个 警 告 等 级 (1-4)。 #pragma warning( push )保 存 所 有 警 告 信 息 的 现 有 的

12、 警 告 状 态 。 #pragma warning( push, n)保 存 所 有 警 告 信 息 的 现 有 的 警 告 状 态 , 并且 把 全 局 警 告 等 级 设 定 为 n。 #pragma warning( pop )向 栈 中 弹 出 最 后 一 个 警 告 信 息 , 在 入 栈 和 出 栈 之 间 所 作 的 一 切 改 动 取 消 。 例 如 : #pragma warning( push ) #pragma warning( disable : 4705 ) #pragma warning( disable : 4706 ) #pragma warning( dis

13、able : 4707 ) /. #pragma warning( pop ) 在 这 段 代 码 的 最 后 , 重 新 保 存 所 有 的 警 告 信 息 (包 括 4705, 4706 和4707)。 pragma commentpragma comment(.) 该 指 令 将 一 个 注 释 记 录 放 入 一 个 对 象 文 件 或 可 执 行 文 件 中 。 常 用 的 lib 关 键 字 , 可 以 帮 我 们 连 入 一 个 库 文 件 。 每 个 编 译 程 序 可 以 用 #pragma 指 令 激 活 或 终 止 该 编 译 程 序 支 持 的 一 些 编译 功 能 。

14、 例 如 , 对 循 环 优 化 功 能 : #pragma loop_opt(on) / 激 活 #pragma loop_opt(off) / 终 止 有 时 , 程 序 中 会 有 些 函 数 会 使 编 译 器 发 出 你 熟 知 而 想 忽 略 的 警 告 , 如“Parameter xxx is never used in function xxx”, 可 以 这 样 : #pragma warn 100 / Turn off the warning message for warning #100 int insert_record(REC *r) /* function bod

15、y */ #pragma warn +100 / Turn the warning message for warning #100 back on 函 数 会 产 生 一 条 有 唯 一 特 征 码 100 的 警 告 信 息 , 如 此 可 暂 时 终 止 该 警告 。 每 个 编 译 器 对 #pragma 的 实 现 不 同 , 在 一 个 编 译 器 中 有 效 在 别 的 编 译 器中 几 乎 无 效 。 可 从 编 译 器 的 文 档 中 查 看 。 #pragma pack(n)和 #pragma pack() struct sample char a; double b; ;

16、 当 sample 结 构 没 有 加 #pragma pack(n)的 时 候 ,sample 按 最 大 的 成 员那 个 对 齐 ; ( 所 谓 的 对 齐 是 指 对 齐 数 为 n 时 ,对 每 个 成 员 进 行 对 齐 ,既 如 果 成 员 a的 大 小 小 于 n 则 将 a 扩 大 到 n 个 大 小 ; 如 果 a 的 大 小 大 于 n 则 使 用 a 的 大 小 ;) 所 以 上 面 那 个 结 构 的 大 小 为16 字 节 . 当 sample 结 构 加 #pragma pack(1)的 时 候 ,sizeof(sample)=9 字 节 ;无空 字 节 。 ( 另 注 : 当 n 大 于 sample 结 构 的 最 大 成 员 的 大 小 时 , n 取 最 大 成 员

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号