读书人

个人感觉内嵌汇编没多大用解决方法

发布时间: 2013-01-26 13:47:04 作者: rapoo

个人感觉,内嵌汇编没多大用
本帖最后由 jackyjkchen 于 2010-04-13 20:25:36 编辑 基本上吵嚷者汇编效率高出C许多的都是没用过汇编的(典型语录——要效率你用汇编啊)……原因很简单,一般水平的家伙写汇编就别说逻辑上跑赢C/C++的代码优化了,就在指令集这块——教材上的386级别的指令也完全比不上最新的intel指令集,现在有些牛逼的SSE指令抵得上一个小型的C函数了。

VS2008可以直接认得SSE4指令集.

类似的,VS2005支持到SSE3.

我觉得,要内嵌汇编,不用SSE3~SSE4就没有价值,而能跑赢C/C++编译器优化的专业汇编选手也太少了,因此我见到喜欢内嵌汇编的,总感觉在装B……


又见到一篇欠扁的文章,该“大牛”竟然在32位C语言程序里内嵌8086汇编以“加强效率”——mov ax,bx
[解决办法]
本身内嵌汇编的可移植性就是一个问题。
[解决办法]

__asm{ 
mov eax, cr0
mov CR0VALUE, eax
and eax, 0fffeffffh
mov cr0, eax

}

[解决办法]
如果lz拿一个刚汇编入门的人和一个精通c语言的比,肯定写出来的c比汇编牛!
[解决办法]
内嵌汇编,通常都比较短,如果说来提效率可能作用不大,不过用来操作端口和某些寄存器还是很有用的
[解决办法]

现在用嵌入式汇编,应该主要不是为了效率了。主要是为了跟特殊的体系结构打交道,而这些是C不能做的。比如把ESP的值取出来什么的。

效率方面,都关注更大粒度的优化吧。真要轮到用汇编优化了,那这个热点要热到什么程度啊?!估计至少能烤羊肉的程度才行。
[解决办法]
现在的机器已经很快了,软件上的优化对速度的影响已经不是很明显了。
[解决办法]
这个也不能这么说,汇编其实对于学习高级语言还是有很大的帮助的
[解决办法]
一件事物的出现,总是有原因的,你觉得奇怪,其实只是你不知道为什么会这样。C不能做,或者不方便做的东西,还是比较多的。

引用:
基本上吵嚷者汇编效率高出C许多的都是没用过汇编的(典型语录——要效率你用汇编啊)……原因很简单,一般水平的家伙写汇编就别说逻辑上跑赢C/C++的代码优化了,就在指令集这块——教材上的386级别的指令也完全比不上最新的intel指令集,现在有些牛逼的SSE指令抵得上一个小型的C函数了。

VS2008可以直接认得SSE4指令集.

类似的,VS2005支持到SSE3.

我觉得,要内嵌汇……

[解决办法]
在某些应用还是必不可少的。想想你在处理多精度数值运算时,不过不使用汇编,效率根本就不可能接受。
[解决办法]
观看~
并保持兴趣!
[解决办法]
我们主要是用来获取任务堆栈信息的,比较SP,RA等寄存器的值
[解决办法]
对于上层应用软件来说。内嵌入式汇编用得很少,不过,感兴趣的话楼主用C或者C++写一个CPU或者ARM的启动程序试试。

汇编在嵌入式中无处不在,而且必须在。搞嵌入式底层驱动程序开发,如果不懂汇编,那么算不上一个真正合格的驱动工程师,同时,薪水也会打折扣的。
[解决办法]
个人认为有些时候还是得用汇编啊!
[解决办法]
确实实际工作中能用到的可能性很小很少。

[解决办法]

底层驱动程序开发,一定会使用到汇编,但不是为了效率。
引用:
对于上层应用软件来说。内嵌入式汇编用得很少,不过,感兴趣的话楼主用C或者C++写一个CPU或者ARM的启动程序试试。

汇编在嵌入式中无处不在,而且必须在。搞嵌入式底层驱动程序开发,如果不懂汇编,那么算不上一个真正合格的驱动工程师,同时,薪水也会打折扣的。

[解决办法]
要看场合的啊,楼主。我当年在InterVideo的时候,就是在VC里内嵌汇编来开发WinDVD的。但是那个级别的汇编不是我们在学校学到的,MMX、SSE之类的指令是常用,有兴趣我可以贴段代码给你看看,当时我们有Intel全套的指令集文档!内嵌汇编主要是解码部分,效率要求非常高,所以选用汇编。

不过话说回来,汇编不能用来实现复杂的逻辑,因为写出来的代码可能比C编译器优化的代码还要复杂!
------解决方案--------------------


汇编自有汇编的优势,高级语言也有自己的优势,其实用什么写代码,现在已经并不重要,高级语言的编译器优化代码还是不错的
[解决办法]
做简单的测试还是不错的,不用一开始就全部放在asm中,可以将关键内容嵌入C,
适合敏捷开发的含义。

另外,从C过度到ASM的朋友可能,一开始不太适合些pure asm,可以先在C的框架中
写内嵌asm

不过我在实际开发中很少内嵌汇编,一般都是些纯asm生成obj,然后与C的obj链接。
或者直接写dll with asm,然后高级语言调用,比如ruby,vb,c#等等。
[解决办法]
听听MYDO说的,内嵌没用,因为你不知道应该用他干什么?

最好不要发这种无聊的帖子了。知道谦虚怎么写吗?
[解决办法]
楼主别忘了CPU只懂汇编,况且编译器也有出错的时候,编译器也比不上人脑聪明。
[解决办法]
如果开发桌面应用软件,那当然是用C++调用windows API更方便,如果是开发网页,当然是用.net平台的C#更方便,如果是开发动画,当然是用Adobe flash及其平台上的ActionScript更方便。但如果是开发操作系统,你别无选择,只能用汇编,因为操作系统是直接跟硬件打交道,要管理硬件的。要开发操作系统可不是那么简单的,你得翻阅所有硬件公司的技术文档,你得熟悉大量硬件细节才行。

很多系统级操作都要求精确操作硬件,而且要求是原子操作,汇编只要一条指令集可以完成,从而很容易保持操作的精确性和原子性,而高级语言至少要生成几条指令,往往导致无法精确操作,无法保持原子性。而且高级语言编译器为了其通用性,往往只编译生成通用指令集,没有(也无法)对特定处理器的专用指令集做优化,很多处理器新增的高性能操作指令集,高级语言都无法生成,只有汇编才能使用。

学汇编最好看intel软件开发者手册,一共有8本电子书,详细介绍了intel微处理器的体系结构,功能以及所有的指令集,包括保护模式、多核等都有详细的介绍,是系统级程序员必看的电子书。
http://www.intel.com/products/processor/manuals/

光是CPU的指令集还不够,要想成为系统级程序员,还得熟悉GPU指令集才行,比如这是介绍R600 GPU的指令集的电子书
http://www.x.org/docs/AMD/r600isa.pdf

还得熟悉硬盘指令集,比如这是介绍ATA硬盘指令集的电子书
http://www.t13.org/Documents/UploadedDocuments/docs2006/D1699r3f-ATA8-ACS.pdf

此外,还得熟悉总线、键盘、鼠标、摄像头、扫描仪、打印机等的指令集。
[解决办法]
汇编有更大的自由,要的是这种海阔天空的感觉:“我使用的语言是万能的,如果有什么事情我做不到那一定是我自己的问题。”而不是使用其它编译器,在发生莫名其妙问题的时候把责任推给编译器。
[解决办法]
哎,其实干嘛要用汇编呢。
我的原则就是,能不用汇编,就不用汇编!
如果确实发现影响了速度,再来改成汇编也不迟!谁在乎那点速度啊,在不要求速度的场合,或者是相对整个应用来说,这个影响非常小的话,干嘛非得自己整自己啊。高级语言可读性可维护性可移植性都好太多了。
[解决办法]
本来以为LZ挺看明白技术的,现在怎么又掉进来了。

把语言分一个个层次,汇编,C,自定义库,JAVA。。。。
无论你处在哪个层次上,尤其是一些自定义库上,在一些场合你肯定会感觉,这个库怎么这么烂,设计得什么玩意儿,然后你就开始进行一些底部修改以更加符合使用。。

C和汇编的关系又何尝不是这样呢。。跳出来再发个帖指责就又成为众矢之的了。。
[解决办法]
你自己也承认,是有人能够用手工汇编跑赢编译器的C语言优化的,因为这是必然会有人做到的事情,不能说现在用汇编精通的人不多,你就说汇编怎么样了,我觉得你有偏见了。你没资格嘲笑崇尚汇编的人,哪怕他水平不怎么样。
[解决办法]
在嵌入式,嵌入汇编是必需的!有哪个c语言编译器可以同时实现
直接关中断;直接编写中断服务程序;直接操作堆栈指针;直接保存所有寄存器呢
[解决办法]
菜鸟..飘过..
[解决办法]
围观,学习
[解决办法]
我来看看热闹
[解决办法]
没有办法,最近在看VXD编程,貌似汇编用了很多,大都在Ring0下运行,不好意思了,我开始学着XX了,呵呵
[解决办法]
如果基本算法不变的情况下,汇编的效率比C高不了多少。
现在有些嵌入式使用的编译器区分内联汇编和嵌入式汇编,有一种可以优化,有一种是机械嵌入,具体忘记了。

不过内联汇编主要还是起特殊功能时使用。比如前面同学提到的,直接关中断,访问寄存器等。

驱动程序使用汇编,主要是因为部分代码和硬件相关,只能使用汇编;或者其他特殊场景,比如ARM的中断跳转表,用C很困难。而不太是因为效率而采用汇编,
[解决办法]
汇编还是很有用的.
高级语言再强大,毕竟还是有限制.有些用C/C++无法达到,或是代价太大的代码,用汇编是必须的.
而且编译器的SSE优化,远达不到人工的水平...
当然,也并不是所有的地方用汇编都好.实际应用里,只有极少数的地方需要用汇编.
[解决办法]
不相信\不了解编译器如何优化的时候,为了保险起见就写汇编代码。

[解决办法]
围观看热闹。。。


[解决办法]
呵呵,又见楼主愤青啊。
SSE等SIMD本来就是用于图像、音视频等信号处理领域的。
我要你在二叉搜索树里用SSE,不就傻眼了嘛,呵呵。

另外,在嵌入式领域中内嵌汇编更是常见,理由楼上几位已经说得很清楚了,呵呵。
[解决办法]
发现inter。蹭两下~~~
[解决办法]
单纯的看看你们的讨论..
[解决办法]
用处不大和没用是两回事,这么简单的问题...
[解决办法]
有些时候汇编还是必须的,比如,你要获取当前的EIP的值,不用汇编,做的到吗?
[解决办法]
在Hook一些用寄存器传参数的函数或者用ecx来传递this指针的函数的时候,不用内嵌汇编如何实现?
[解决办法]
内联汇编 ,就是方便移植做的 !
一般都会写2个版本 ,一个C版本 一个平台优化版本 通过宏定义切换!
[解决办法]
楼主不知道汇编那些场合要用就说没多大用,也太井底之蛙了吧。

没用过欧元,偶也知道欧元是有用滴

读书人网 >C++

热点推荐