__asm
来源:http://msdn.microsoft.com/zh-cn/library/45yd4tzz.aspx
Microsoft 专用
__asm 关键字调用一个内联汇编,并且可以显示,每当 c. 或 C++ 语句合法。 它不能单独出现。 必须由程序集指令执行它,请在大括号中的命令的一组,或者,至少, null 对大括号。 该术语 “__asm 块是”此处称为命令的说明或组,在大括号。
说明 |
|---|
|
Visual C++ 对标准 C++ asm 关键字支持仅限于该条件编译器在关键字不会生成错误。 但是, asm 块不会生成任何有意义的代码。 使用 __asm而不是 asm。 |
语法:
__asm 程序集命令 [;]
__asm {} 程序集指令列表 [;]
-
__asm assembly-instruction ; opt
__asm { assembly-instruction-list }; opt
- 程序集指令列表:
-
assembly-instruction ; opt
assembly-instruction ; assembly-instruction-list ; opt
如果使用,而不用大括号, __asm 关键字表示此行的其余部分是一个汇编语言的语句。 如果使用与大括号,这意味着在大括号之间的每一行都是一个汇编语言的语句。 对于与以前版本的兼容, _asm 是 __asm的同义词。
因为 __asm 关键字是语句分隔符,则在同一行中放置程序集指令。
在 Visual C++ 2005 版之前,命令
__asm int 3
没有导致本机代码,便会产生编译 /clr;编译器将该命令对 CLR 中断命令。
__asm int 3 现在导致该函数的本机代码生成。 如果希望功能生成断点在代码中,并且,如果您希望函数编译为 MSIL,使用 __debugbreak。
下面的代码片段是简单的 __asm 块对大括号:
__asm {
mov al, 2
mov dx, 0xD007
out dx, al
}
或者,可以放置在每个程序集指令前面的 __asm :
__asm mov al, 2 __asm mov dx, 0xD007 __asm out dx, al
由于 __asm 关键字是语句分隔符,则在同一行中放置程序集指令:
__asm mov al, 2
__asm mov dx, 0xD007
__asm out dx, al
所有三个示例生成相同的代码,不过,第一个样式 (将 __asm 块括在大括号中) 有一些优点。 从 C 或 C++ 代码的大括号明显不同的代码和避免 __asm 关键字不必要的重复。 大括号也会阻止多义性。 如果在同一 __asm 块的行要将 c. 或 C++ 语句,可以在大括号必须将块。 不带大括号,编译器无法告诉程序集代码位置停止,并且 C 或 C++ 语句开始。 最后,因为,在大括号的文本与普通 MASM 文本的格式,您可以轻松地剪切和粘贴文本从现有 MASM 源文件。
不同于 C 和 C++ 的大括号,将 __asm 的大括号块不会影响变量的范围。 您也可以嵌套 __asm 块;嵌套不影响变量的范围。
特定于 Microsoft 的结尾
__asm的更多相关文章
- 异常处理第一讲(SEH),筛选器异常,以及__asm的扩展,寄存器注入简介
异常处理第一讲(SSH),筛选器异常,以及__asm的扩展 博客园IBinary原创 博客连接:http://www.cnblogs.com/iBinary/ 转载请注明出处,谢谢 一丶__Asm的 ...
- SYSTEM\sys\sys.c:33:7: error: expected '(' before 'void' __ASM void MSR_MSP(u32 addr)
在STM32中的sys.c文件编译报出这个错误时: __ASM void MSR_MSP(u32 addr){ MSR MSP, r0 //set Main Stack value BX r14} 如 ...
- 类似register uint32_t __regPriMask __ASM("primask");的代码分析
代码: #define __ASM __asm /*!< asm keyword for ARM Compiler */ #define __INLINE __inline /*!< in ...
- 让Visual Studio x64 支持 __asm内联汇编
目录 让Visual Studio x64 支持 __asm内联汇编 Intel Parallel Studio XE 2016安装 设置Interl C++ Compiler 使VS x64支持内联 ...
- 《Note --- Unreal --- MemPro (CONTINUE... ...)》
Mem pro 是一个主要集成内存泄露检测的工具,其具有自身的源码和GUI,在GUI中利用"Launch" button进行加载自己待检测的application,目前支持的平台为 ...
- 逆向工程学习第二天--动手开发自己的第一个shellcode
一个简单的c语言添加windows管理员账号的小程序,之前在渗透的时候经常用到,现在拿它来做自己的第一个shellcode. C代码: #pragma comment(lib, "netap ...
- CPUID指令简单调用
关于CPUID指令,可以看维基百科的相关介绍 https://en.wikipedia.org/wiki/CPUID 在windows下可以调用__cpuid和__cpuidex这两个函数,__cpu ...
- AliSQL的编译使用
1.下载源码 git clone https://github.com/alibaba/AliSQL.git Linux下编译 2.编译 编译前需要安装好gcc cmake bison等.(如果缺少其 ...
- 【逆向篇】分析一段简单的ShellCode——从TEB到函数地址获取
其实分在逆向篇不太合适,因为并没有逆向什么程序. 在http://www.exploit-db.com/exploits/28996/上看到这么一段最简单的ShellCode,其中的技术也是比较常见的 ...
随机推荐
- ES之事件绑定,解除绑定以及事件冒泡、事件捕获
绑定事件的处理方法任何元素都有事件属性,而绑定事件就是将这个事件与一个函数相连接. ①句柄事件dom.onXXX = function () {代码块} 以on开头的事件属于句柄事件兼容性非常好,但是 ...
- [转] 随机数是骗人的,.Net、Java、C为我作证
(转自:随机数是骗人的,.Net.Java.C为我作证 - 杨中科 原文日期:2014.05.12) 几乎所有编程语言中都提供了"生成一个随机数"的方法,也就是调用这个方法会生 ...
- CentOS 7 挂载ntfs磁盘格式的U盘
因为CentOS 默认不识别NTFS的磁盘格式,所以我们要借助另外一个软件来挂载,那就是ntfs-3g了 自带的yum源没有这个软件,要用第三方的软件源,这里我用的是阿里的epel. 1. 切换到系统 ...
- gitlab数据迁移到docker容器
需求:想把服务器上的gitlab迁移到docker容器里面注意:gitlab的迁移,必须保持gitlab的版本一致,此处使用的是:8.4.3,数据库版本和类型一致,此处使用的是postgresql 9 ...
- Zend Studio 服务器根目录设置
在 Apache 服务器根目录里查找 \conf\httpd.conf 例如:C:\AppServ\Apache24\conf\httpd.conf 打开后查找 DocumentRoot 标记 修改调 ...
- 常用的HTTP方法有哪些?
GET: 用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器POST:用于传输数据给服务器,主要功能与GET方法类似,但一般推荐使用POST方式.PUT: 传输数据,报文 ...
- 工具:docs网页笔记
用到工具python 网页笔记工具:mkdocs https://www.cnblogs.com/bigmagic/p/10309260.html 案例: https://github.com/zha ...
- java实现zip,gzip,7z,zlib格式的压缩打包
本文主要介绍的是通过使用java的相关类可以实现对文件或文件夹的压缩. zlib是一种数据压缩程序库,它的设计目标是处理单纯的数据(而不管数据的来源是什么). 7z 是一种新的压缩格式,它拥有目前最高 ...
- Tomcat的配置方法(解压版)
Tomcat解压版虽然不用安装,但是死难配!!之前刚学的时候很是郁闷了一阵,Jsp倒还好,但是Servlet死活跑不起来.今天就把你给记下来!! 解压到C:/Tomcat 然后再配置环境变量: 添加三 ...
- 运用 node + express + http-proxy-middleware 实现前端代理跨域的 详细实例哦
一.你需要准备的知识储备 运用node的包管理工具npm 安装插件.中间件的基本知识: 2.express框架的一些基础知识,知道如何建立一个小的服务器:晓得如何快速的搭建一个express框架小应用 ...
说明