Microsoft 专用

C 宏用于插入程序集代码提供了一种简便方式。源代码,但是,它们要求额外的问题,因为宏展开到一个逻辑行。 若要创建无困难宏,请遵循以下规则:

  • __asm 块括在大括号。

  • 将在每个程序集指令前面的 __asm 关键字。

  • 使用旧式 C 注释 ( /* comment */) 而不是程序集的注释 ( ; comment) 或单行注释 C ( // comment)。

若要声明,下面的示例定义一个简单的宏:

#define PORTIO __asm      \
/* Port output */         \
{                         \__asm mov al, 2        \__asm mov dx, 0xD007   \__asm out dx, al       \
}

乍看上去,最后三个 __asm 关键字是多余。 ,因为宏展开为单个行,,但它们是必需的:

__asm /* Port output */ { __asm mov al, 2  __asm mov dx, 0xD007 __asm out dx, al }

第三个和第四个 __asm 关键字需要为一个语句分隔符。 在 __asm 唯一识别的语句块分隔符是换行符和 __asm 关键字。 由于作为宏定义的块是一个逻辑行,必须使用 __asm的每个指令。

大括号非常重要。 如果省略它们,编译器可由有关同一行的 C 或 C++ 语句混淆在宏调用右侧。 不是右大括号,编译器无法告诉程序集代码位置停止,并且,它看到 C 或 C++ 语句,在 __asm 块作为程序集指令之后。

从分号的程序集样式注释 (;) 开始继续行尾。 这在宏始终会出现问题,因为编译器在注释后忽略所有内容,与逻辑行尾。 也是如此的单行 C 或 C++ 注释 ( // comment)。 若要防止错误,请使用旧式 C 注释 ( /* comment */) 在 __asm 块定义为宏。

,并且当 c++. 宏能够带参数, __asm 块写入。 不同于普通 C 宏,但是, __asm 宏不能返回值。 这样您就可以在 C 或 C++ 表达式不能使用这些宏。

注意不进行差异地调用此类型宏。 例如,如果调用函数中的程序集语言的宏声明与 __fastcall 约定可能导致意外的结果。

定义__asm块作为C宏相关推荐

  1. ACMNO.30 C语言-宏交换 定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。

    题目描述 定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参.输出已交换后的两个值. 输入 两个数,空格隔开 输出 交换后的两个数,空格隔开 样例输入 1 2 样例输出 2 ...

  2. c语言长度宏定义运算符,C语言在宏定义中使用语句表达式和预处理器运算符

    语句表达式的亮点在于定义复杂功能的宏.使用语句表达式来定义宏,不仅可以实现复杂的功能,而且还能避免宏定义带来的歧义和漏洞.下面以一个简单的最小值的宏为例子一步步说明. 1.灰常简单的么,使用条件运算符 ...

  3. 【C语言】宏定义(不带参数的宏定义和带参数的宏定义)

    目录 一.不带参数的宏定义 1.定义 2.#undef 指令取消宏定义 二.带参数的宏定义 1.定义 2.宏定义参数替换的注意事项 三.带参数的宏定义和带参函数的区别 一.不带参数的宏定义 1.定义 ...

  4. C/C++常用宏定义,注意事项,宏中#和##的用法

    总结下宏和函数的不同之处,以供大家写代码时使用,这段总结摘自<C和指针>一书. 当然宏定义非常重要的,它可以帮助我们防止出错,提高代码的可移植性和可读性等. 下面列举一些成熟软件中常用得宏 ...

  5. VS插件开发——格式化变量定义语句块

    插件介绍 代码地址:https://github.com/sun2043430/vs2008_format_variable_define_plugin/ 在vs里,对选中的变量定义块进行格式化,效果 ...

  6. 全局声明宏定义_C++模拟面试:宏、lambda、智能指针闲谈

    有时候出于种种目的,我们会用宏来写一些函数.有人称之为宏函数.下面我们来模拟一场面试: 面试官 自来也 先来个简单的热热身,用宏实现求两个数最大值. 刷刷刷 #define MAX(x, y) ((x ...

  7. c语言解除宏定义_3.3.5 取消宏定义和重新定义宏

    3.3.5   取消宏定义和重新定义宏 #undef命令可以取消定义一个名称为宏:#undef name 这个命令使预处理器忘记name的所有宏定义.取消一个当前未定义宏的定义并不是错误.当一个名称被 ...

  8. 如何定义一个带参数的宏

    开发中我们经常会遇到一些需要封装起来的简单函数 比如说:有两个数,通过调用一个宏去返回较大的数 或者:通过输入三原色(RGB)的值去输出一个自己的颜色 这中做法比较常用  下面就来说一下这种带参数的宏 ...

  9. html 定义悬浮块层级,采用CSS3的动态元素(动画)设计div块的层级式展现

    此练习作品是为学习HTML5+CSS3而设计的(如有不好请大家批评指教~~~). 动画定义:animation:animationName; div块的移动: @keyframes keyframeN ...

最新文章

  1. 微软在.NET官网上线.NET 架构指南频道
  2. apue学习之文件IO第二部分
  3. 我对汇编中进位和溢出的理解
  4. 打印格式设置(SPAD)
  5. IT项目管理总结:第四章 项目综合管理
  6. 【Linux】一步一步学Linux——declare命令(217)
  7. 服务器装win10系统文档,Win10系统安装远程服务器管理的技巧
  8. ubuntu14.04安装tun/tap网络设备
  9. oracle查询排序速度慢,Oracle-请问Oracle SQL排序查询慢如何解决
  10. java dao 单元测试_Spring Service、Dao进行Junit单元测试
  11. 【李宏毅机器学习】Unsupervised Learning - Word Embedding 无监督学习 - 词嵌入(p22) 学习笔记
  12. 如何获取foreach循环当前迭代的索引?
  13. 新法规将处罚垃圾邮件制造者
  14. java+catch块不执行_Java异常处理机制:try...catch...的执行流程
  15. 支付网关-vertx
  16. R语言windows函数自动生成可视化图像画布框、使用plot函数可视化数据点图、使用type参数指定数据点为实线
  17. mysql取出时间最近的一条字段_Mysql 根据时间取出每组数据中最新的一条
  18. Xilinx 7系列FPGA收发器架构之硬件设计指导(一)
  19. AWS认证攻略 – E哥的AWS Solution Architecture Associate 认证攻略
  20. 科技赋能拉萨之“肺”,华为助力拉鲁湿地智慧管理守护绿水青山

热门文章

  1. 编写测试用例的常用方法
  2. vim常用命令使用总结
  3. 移动端 元素外面使用伪类after加边框 导致其内部元素无法选中
  4. [Codeforces] Round #320 (Div.2)
  5. Windows Phone 7 XNA开发之关于图形的配置
  6. [转]海量查询的数据优化
  7. sql之left join、right join、inner join的区别,连接自己时的查询结果测试
  8. KVM日常管理-克隆-快照-磁盘扩容-虚拟磁盘挂载
  9. Oracle:管理 date类型 interval 动态变化的分区:查询、删除
  10. 发现check_nginx.sh 里的一个小bug~~~