须使用visual c 内联汇编语言开发,在VisualC 中使用内联汇编

在VisualC 中使用内联汇编

2008-04-09 04:08:57来源:互联网 阅读 ()

c4468b3f4df77e96b0a416fa2a870fba.png

一、内联汇编的优缺点

因为在Visual C 中使用内联汇编不需要额外的编译器和联接器,且可以处理Visual C 中不能处理的一些事情,而且可以使用在C/C 中的变量,所以非常方便。内联汇编主要用于如下场合:

1.使用汇编语言写函数;

2.对速度要求非常高的代码;

3.设备驱动程序中直接访问硬件;

4."Naked" Call的初始化和结束代码。

//(."Naked",理解了意思,但是不知道怎么翻译^_^,大概就是不需要C/C 的编译器(自作聪明)生成的函数初始化和收尾代码,请参看MSDN的"Naked Functions"的说明)

内联汇编代码不易于移植,如果你的程序打算在不同类型的机器(比如x86和Alpha)上运行,应当尽量避免使用内联汇编。这时候你可以使用MASM,因为MASM支持更方便的的宏指令和数据指示符。

二、内联汇编关键字

在Visual C 使用内联汇编用到的是__asm关键字,这个关键字有两种使用方法:

1.简单__asm块

__asm

{

MOV AL, 2

MOV DX, 0XD007

OUT AL, DX

}

2.在每条汇编指令之前加__asm关键字

__asm MOV AL, 2

__asm MOV DX, 0xD007

__asm OUT AL, DX

因为__asm关键字是语句分隔符,因此你可以把汇编指令放在同一行:

__asm MOV AL, 2 __asm MOV DX, 0XD007 __asm OUT AL, DX

显然,第一种方法和C/C 的风格很一致,并且有很多其它优点,因此推荐使用第一种方法。

不象在C/C 中的"{}",__asm块的"{}"不会影响C/C 变量的作用范围。同时,__asm块可以嵌套,嵌套也不会影响变量的作用范围。

三、在__asm块中使用汇编语言

1.内联汇编指令集

内联汇编完全支持的Intel 486指令集,允许使用MMX指令。不支持的指令可以使用_EMIT伪指令定义(_EMIT伪指令说明见下文)。

2.MASM表达式

内联汇编可以使用MASM中的表达式。比如: MOV EAX, 1。

3.数据指示符和操作符

虽然__asm块中允许使用C/C 的数据类型和对象,但它不能用MASM指示符和操作符定义数据对象。这里特别指出,__asm块中不允许MASM中的定义指示符: DB、DW、DD、DQ、DT和DF,也不允许DUP和THIS操作符。MASM结构和记录也不再有效,内联汇编不接受STRUC、RECORD、WIDTH或者MASK。

4.EVEN和ALIGN指示符

尽管内联汇编不支持大多数MASM指示符,但它支持EVEN和ALIGN,当需要的时候,这些指示符在汇编代码里面加入NOP(空操作)指令使标号对齐到特定边界。这样可以使某些处理器取指令时具有更高的效率。

5.MASM宏指示符

内联汇编不是宏汇编,不能使用MASM宏指示符(MACRO、REPT、IRC、IRP和ENDM)和宏操作符(<>、!、&、%和.TYPE)。

6.段说明

必须使用寄存器来说明段,跨越段必须显式地说明,如ES:[BX]。

7.类型和变量大小

我们可以使用LENGTH来取得C/C 中的数组中的元素个数,如果不是一个数组,则结果为一。使用SIZE来取得C/C 中变量的大小,一个变量的大小是LENGTH和TYPE的乘积。TYPE用来取得一个变量的大小,如果是一个数组,它得到的一个数组中的单个元素的大小。

8.注释

可以使用C/C 的注释,但推荐用ASM的注释,即";"号。

9._EMIT伪指令

_EMIT伪指令相当于MASM中的DB,但一次只能定义一个字节,比如:

__asm

{

JMP _CodeOfAsm

_EMIT 0x00 ; 定义混合在代码段的数据

_EMIT 0x01

_CodeOfAsm:

; 这里是代码

_EMIT 0x90 ; NOP指令

}

四、在__asm块中使用C/C 语言元素

C/C 与汇编可以混合使用,在内联汇编可以使用C/C 的变量和很多其它C/C 的元素。在__asm块中可以使用以下C/C 元素:

1.符号,包括标号、变量和函数名;

2.常量,包括符号常量和枚举型(enum)成员;

3.宏定义和预处理指示符;

4.注释,包括"/**/"和"//";

5.类型名,包括所有MASM中合法的类型

6.typedef名称, 像PTR、TYPE、特定的结构成员或枚举成员这样的通用操作符。

在__asm块中,可以使用C/C 或ASM的基数计数法(比如: 0x100和100H是相等的)。

__asm块中不能使用像<

int array[10];

__asm MOV array[6], BX ; Store BX at array 6 (not scaled)

array[6] = 0; /* Store 0 at array 12 (scaled) */

* 小技巧: 内联汇编中,你可以使用TYPE操作符使作其与C一致。比如,下面两条语句是一样的:

__asm MOV array[6 * TYPE int], 0 ; Store 0 at array 12

array[6] = 0; /* Store 0 at array 12 */

内联汇编能通过变两名直接引用C/C 的变量。__asm块中可以引用任何符号,包括变量名。

如果C/C 中的类、结构或者枚举成员具有唯一的名称,如果在"."操作符之前不指定变量或者typedef名称,则__asm块中只能引用成员名称。然而,如果成员不是唯一的,你必须在"."操作符之前加上变量名或typedef名称。例如,下面的两个结构都具有same_name这个成员变量:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dockerfile 修改文件权限_网易技术实践|Docker文件系统实战

在本文中&#xff0c;我们来实战构建一个Docker镜像&#xff0c;然后实例化容器&#xff0c;在Docker的生命周期中详细分析一下Docker的文件存储情况和DockerFile优化策略。在开始实战之前&#xff0c;我们先介绍一个概念&#xff0c;联合文件系统&#xff08;Union File Syste…

stm32c语言写数码管定时器,使用TIM1产生1秒定时控制数码管显示0-9(STM32_10)

一、项目配置1、新建项目文件夹"TimSeg"&#xff1b;2、通过Keil5创建新项目&#xff0c;保存在所创建的文件夹中(设项目名为pTimSeg)&#xff0c;选择MCU芯片为"STM32F103ZE"(本程序使用的硬件为&#xff1a;STM32-PZ6806L开发板)3、在"TimSeg"…

pandas自动创建文件夹_pandas快速入门

pandas有两类数据对象&#xff1a;dataframe和series。Series是一个带标签的一维数组&#xff0c;通常索引在左&#xff0c;值在右。dataframe是一个带标签的二维数组&#xff0c;可以理解成series的字典&#xff0c;共用索引标签。重点记录dataframe的相关用法&#xff1a;一.…

小数分数转换c语言,这是把小数转换成分数的程序,可是输入0.6666无限循环

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include int main(){double a;scanf("%lf", &a);输入小数int b, c 0, d 0;double b1 a;do{b1 *10;b (int)b1;printf("%d\n", b);if(b%10!0){c;if(d>0){c d;d 0;}}else{d;}}while(d<5);printf("…

血栓清道夫机器人_血栓“清道夫”找到了!木耳排第三,排在第一很多人都并不知道...

当血液中出现大量的血栓&#xff0c;很容易堵塞血管&#xff0c;多处血栓&#xff0c;主要是由于血液中积聚了大量的脂类物质&#xff0c;沉积在血管内壁上形成的&#xff0c;而日常生活中不良的饮食习惯则会加剧我们血液的粘稠程度&#xff0c;大量的直流物质&#xff0c;更容…

for循环c语言流水灯,巧用数组与for循环为流水灯程序瘦身

数组——一种储存大量同性质数据的连续存储器空间a [6];b [] {2&#xff0c;4&#xff0c;8&#xff0c;3&#xff0c;6};c[6] {1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6};char d[6] "hello";以上方式均是数组创建的常用方式~数组是从…

java的map 使用string数组多了双引号_奥奥奥利给!!!再也不怕面试官问我String源码了!来吧...

简述字符串广泛应用 在 Java 编程中&#xff0c;在 Java 中字符串属于对象&#xff0c;Java 提供了String 类来创建和操作字符串。字符串缓冲区支持可变字符串。因为String对象是不可变的&#xff0c;因此可以共享它们。String类代表字符串&#xff0c;Java程序中的所有字符串字…

C 语言 运算符怎么使用,详解C++编程中运算符的使用

C的运算符十分丰富&#xff0c;使得C的运算十分灵活方便。例如把赋值号()也作为运算符处理&#xff0c;这样&#xff0c;abc4就是合法的表达式&#xff0c;这是与其他语言不同的。C提供了以下运算符&#xff1a;算术运算符(加) -(减) *(乘) /(除) %(整除求余) (自加) --(…

面积积分_袁颖妍:用定理积分求平面区域面积(有代表性的9个例题)

考研竞赛智慧e数学的广告&#xff1a;鸡汤所谓“理解”&#xff0c;所谓“智商”&#xff0c;本质上最终都归到"记忆",还有一点就是能够发现自己“记忆”中各个零散的知识点的关系。所谓“智商”高低的人&#xff0c;其实是强化这些“记忆”的能力的不同&#xff0c;…

vip会员管理系统c语言,路西牌会员管理系统。

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼void VIP::show( Node *v){no(v);char *aVIP::sex(v);std::cout<<< "会员姓名: "<< node.item.num[1]<< endl<< "性别: "<< sex(v)<<< "手机号码: "<…

字体选择_十分钟带你掌握精准选择字体的方法!

文章序言&#xff1a;上次记得有粉丝评论需要讲讲字体&#xff0c;今天就给大家带来一期关于&#xff0c;如何快速选择合适的字体的文章&#xff0c;帮助大家以后把字体用对&#xff0c;用好&#xff0c;用准。在讲这个字体的时候会结合实际的案例操作给大家讲解&#xff0c;这…

c语言输出行末不得有多于空格,新人提问:如何将输出时每行最后一个空格删除...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼如何将每行最后一个空格删除&#xff0c;使矩阵只有数字间有空格&#xff0c;没有多余空格&#xff1f;#include#includeint main(){int i,j,k,m,n,x,h,y;int a[15][15]{0};while(scanf("%d",&i)){k1;for(n1;n<i;…

php对象数组转数组_php 数组对象互相转换

有时候会遇到php中对象和数组之间的互相转换/*** 将对象转换为多维数组***/function objectToArray($d) {if (is_object($d)) {// Gets the properties of the given object// with get_object_vars function$d get_object_vars($d);}if (is_array($d)) {/** Return array con…

linux 查看neihe版本_linux查看系统内核版本号

查看系统内核有三种方法&#xff1a;第一种方法&#xff1a;[rootlocalhost nginx]# uname -aLinux localhost.localdomain 2.6.32-696.30.1.el6.i686 #1 SMP Tue May 22 02:54:00 UTC 2018 i686 i686 i386 GNU/Linux第二种方法&#xff1a;uname -r[rootlocalhost nginx]# una…

android自动生成cardview,学习使用Material Design控件(三)使用CardView实现卡片效果...

本文主要介绍CardView的使用&#xff0c;CardView是继承自FrameLayout&#xff0c;使用比较简单&#xff0c;只需要用CardView包含其他View就可以实现卡片效果了。实现效果如下&#xff1a;加入依赖库dependencies {….compile com.android.support:cardview-v7:22.2.0}Layout布…

p6000 深度学习_英伟达推Quadro新显卡,支持VR、深度学习等技术

青亭网(ID:qingtinwang)--链接科技前沿&#xff0c;服务商业创新英伟达今天宣布了一系列的Quadro产品&#xff0c;全部都是基于他们的Pascal架构。能够让桌面级工作站转换为跨越多个产业、具备专业工作流突破性能的超级电脑。包括设计、工程和其他领域的工作流都在急速发展&…

android最新设计规范,Android应用未来的设计规范

谷歌在2014 I/O大会上不但发布了Android L&#xff0c;还一同推出了全新的Material Design设计语言&#xff0c;它被认为是未来Android系统和应用的设计方向。虽然Android L和谷歌自家的应用都会按照这一设计规范来执行&#xff0c;但第三方应用却没能够积极的响应。究竟用Mate…

react实现上传文件进度条功能_React.js 可拖放文件的上传表单(支持多文件和进度显示)...

JavaScript语言&#xff1a;JaveScriptBabelCoffeeScript确定console.clear();const {createClass,PropTypes} React;const {render} ReactDOM;const styles {inputWrapper: input-wrapper,inputCover: input-cover,helpText: help-text,fileName: file-name,fileNameStretc…

qt android程序联网死机,Qt for Android(九) ——APP 崩溃卡死拉起保活实战

这篇文章要基于前面的基础&#xff0c;我们才能继续下面的内容&#xff0c;建议阅读。背景首先&#xff0c;本文的案例环境基于一些特殊的 android 设备&#xff0c;比如瑞星微的RK系列&#xff0c;在该设备上不会熄屏&#xff0c;没有锁屏键&#xff0c;运行的应用也仅限于几个…

rootfs 制作ubuntu_Ubuntu12笔记: 基于busybox的Linux小系统制作

开发环境&#xff1a;Ubuntu 12.04开发板&#xff1a;mini2440256M NandFlash 64M SDRAM交叉编译器&#xff1a;arm-linux-gcc 4.4.3点此可下载BusyBox版本&#xff1a;busybox-1.13.3点此可下载yaffs制作工具&#xff1a;mkyaffsimageyaffs2制作工具:mkyaffs2image(适合64M)、…