使用VS编写C语言控制台程序,内联汇编在执行mov ds, ax时报错:0xC0000005访问冲突

使用VS编写C语言控制台程序,内联汇编在执行mov ds, ax时报错:0xC0000005访问冲突,第1张

先看官方示例代码运行成功吗,排除环境问题:

__asm {  

   mov al, 2  

   mov dx, 0xD007  

   out dx, al  

}

>

如果内联失败这个函数就是一个普通的函数,普通的函数不会被编译器展开,只是作为函数调用。内联函数比普通函数效率高的原因就是编译器在调用处把这个函数展开,展开就是直接执行代码而不是调用这个函数,像宏展开的意思。

扩展资料:

宏调用并不执行类型检查,甚至连正常参数也不检查,但是函数调用却要检查。C语言的宏使用的是文本替换,可能导致无法预料的后果,因为需要重新计算参数和 *** 作顺序。在宏中的编译错误很难发现,因为它们引用的是扩展的代码,而不是程序员键入的。

许多结构体使用宏或者使用不同的语法来表达很难理解。内联函数使用与普通函数相同的语言,可以随意的内联和不内联。

参考资料来源:百度百科-内联函数

使用高度频繁,而且 *** 作内容简单的情况下,用inline函数。这样可以解决一些频繁调用的函数大量消耗栈空间(栈内存)的问题。关键字inline必须与函数定义放在一起才能使函数成为内联函数,仅仅将inline放在函数声明前面不起任何作用。inline是一种“用于实现”的关键字,而不是一种“用于声明”的关键字。

inline定义格式

一、inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义。

表达式形式的宏定义如:

#define ExpressionName(Var1,Var2) ((Var1)+(Var2))((Var1)-(Var2))

取代这种形式的原因如下:

1、C中使用define这种形式宏定义的原因是因为,C语言是一个效率很高的语言,这种宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成等一系列的 *** 作。因此,效率很高,这是它在C中被使用的一个主要原因。

2、这种宏定义在形式上类似于一个函数,但在使用它时,仅仅只是做预处理器符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受C++编译器严格类型检查的好处,另外它的返回值也不能被强制转换为可转换的合适的类型。这样,它的使用就存在着一系列的隐患和局限性。

3、在C++中引入了类及类的访问控制,这样,如果一个 *** 作或者说一个表达式涉及到类的保护成员或私有成员,你就不可能使用这种宏定义来实现(因为无法将this指针放在合适的位置)。

4、inline推出的目的,也正是为了取代这种表达式形式的宏定义,它消除了宏定义的缺点,同时又很好地继承了宏定义的优点。

扩展资料

内联函数的不足

除了通常使用内联扩展可能带来的问题,作为一种编程语言特性的内联函数也可能并没有看起来那么有效,原因如下:

1、通常,设计编译器的程序设计者比大多数的程序设计者更清楚对于一个特定的函数是否合适进行内联扩展;一些情况下,对于程序员指定的某些内联函数,编译器可能更倾向于不使用内联甚至根本无法完成内联。

2、对于一些开发中的函数,它们可能从原来的不适合内联扩展变得适合或者倒过来。尽管内联函数或者非内联函数的转换易于宏的转换,但增加的维护开支还是使得它的优点显得更不突出了。

3、对于基于C的编译系统,内联函数的使用可能大大增加编译时间,因为每个调用该函数的地方都需要替换成函数体,代码量的增加也同时带来了潜在的编译时间的增加。

参考资料来源:百度百科-内联函数

参考资料来源:百度百科-inline

以上就是关于使用VS编写C语言控制台程序,内联汇编在执行mov ds, ax时报错:0xC0000005访问冲突全部的内容,包括:使用VS编写C语言控制台程序,内联汇编在执行mov ds, ax时报错:0xC0000005访问冲突、C++内联函数在 在编译时是将该函数的目标代码插入每个调用该函数的地方、在什么情况下适宜采用inline定义内联函数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10108062.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存