【讨论】C++程序员是否该掌握某种汇编语言?

导语:日前网络上关于C++程序员是否应该对汇编语言有一定的掌握程度的问题讨论比较激烈。反对的观点大致有几点: 1.对于普通软件开发人员来讲,关注于上层实现,关注于功能和产品才是主要,汇编也用不到;2.很多的C++程序员不懂汇编,也成为了某公司某项目组主程序、核心研发,因此汇编可以不学不用;3.绝大多数C++程序员还是在做上层开发,绝大多数项目也是上层开发,不了解底层也能赚到大钱,而且是更多的钱;4.做底层,比如:逆向、破解、写病毒等,很多致力于这层的程序员,感觉整天昏天暗地,无数的重复劳动也没赚到大钱,觉得没意义;5.对于做C#、Java、WEB等领域的程序员们,大多数不会去关注底层实现,他们照样过得很好,以此类推,汇编也是可以不掌握的;6.汇编语言几乎是不跨平台的,于是就算掌握了某个平台的汇编,但在汇编语言上,例如语法、机制等还是有局限性。

本文作者作为一名C++程序员也参与了讨论。作为站在支持一方,他就上面几种反对的观点的看法(可以总体分为几个关键点:利益、收入和兴趣)以及个人的体会分享了看法,有一定参考价值。

以下是根据他的文章整理而成的内容:

从上面几种反对的观点来看,可以总体分为几个关键点:利益、收入和兴趣。我不打算将这三个关键点分别进行针对性阐述,因为它们之间都是息息相关分不开的。对于利益和收入上来讲,的确是有很多公司的高职位且收入不错的程序员并不了解汇编和底层,这样也不代表他们没有能力,而往往他们是非常有能力的人。这样一来似乎和我个人的支持类的观点有所冲突,但我认为这个冲突可以用追求二字来化解。为什么可以用追求来化解呢?因为追求可以是任何领域、任何方向、任何目的和任何标准的,因此也就是我前面所说的,归结到根本,掌握不掌握都没有对错。

我们进入这个行业,从事了编程工作(大多数程序员都是编程开发做起的)。我相信很多程序员的初衷,都是对编程开发有很大的兴趣,兴趣驱使着我们熬夜,驱使着我们研究, 驱使着我们进步。对于C++程序员,我相信兴趣占有很大的比重。那么,我们来举几个例子:

你应该看过《深入C++对象模型》这本书吧,这是一本非常细致和美妙的书,我想你应该有这样的感受。那么在此基础之上,你有过更多的思考吗?这本书里都是以实例和理论来进行讲解的,实例是以C++语言进行描述的。于是你是否有想知道在具体的编译器和平台下的这样一些疑问:

1.this指针是怎么传递进成员函数的?成员函数和普通函数以及静态成员函数有何区别和联系?

2.透过语法,成员函数和类在内存中有什么联系?对象和成员函数有何种联系?

3.函数间的调用原理,是怎么实现的?

4.__cdecl、__stdcall、__thiscall和__fastcall这几种函数调用方式,在本质上有什么区别?具体是怎么实现的?

5.虚函数、多态和继承在本质上的体现,以及这些机制在底层是怎么实现的?

除此之外,你在学习和使用C++的时候,我想你还会在乎一些细节,例如:

1).递归函数一定会导致低效?编译器针对递归函数会不会有什么样的优化?你怎么知道这些优化细节?

2).对于这句代码:int b = a > 0 ? 100 : 200;  // int a; 编译器会有什么细节上的优化?这句代码会有比较并跳转的过程吗?

3).对于这样的代码:

view plaincopy to clipboardprint?

  1. #include <stdio.h>   
  2. int a = 10;  
  3. int main( void )  
  4. {  
  5.     printf( "%d", a );  
  6.     return 0;  
  7. }             

在VC下,开启全局优化,全局变量a还存在吗?你怎么通过本质的论证来证明?

4).对于:float a = 100;  int b = a / 30;  在VC下,你会不会怀疑这两句代码背后会存在函数调用?如果有,调用了什么函数?为什么?

5).对于__declspec( thread ) int g_nNum = 0; 你知道g_nNum++;这句代码背后的具体实现机制吗?

6).对于调试,你会怎么根据自己记录的程序崩溃时的堆栈现场及其它信息来错误跟踪查找呢?

7).对于开发游戏来说,你怎么知道外挂是怎么修改游戏程序的,修改了哪个地方呢?

8).你要怎么熟悉编译器的优化细节,怎么写出适应它的代码,怎么写出比它优化得更好的代码?

还有很多这样上层开发的例子,这里就不一一列举了。从上面列举的这些疑问,我想作为一名C++程序员,热爱编程开发的程序员来讲,你都想知道其中的原委。作为上层开发者,是应该关注上层的功能开发和产品方面的东西。但是我个人觉得,本着技术,本着这份热爱,本着自身的技术发展,了解更底层一些,有助于上层开发的通透性,以及全局的掌控力度。从我个人的感受来讲,当把握了关键细节以及全局设计之后,任何地方出了问题,都能很及时的反应并予以追查和处理。在当前的编译器技术上,已经非常强大了,很多细节可以放心的交给编译器来优化和处理。但是我想,编译器不是万能的,人才是最智能的。掌握不是必然,但掌握了会更好。

对于初学者乃至工作了一定时间的程序员,对于C++,很多处于C++语法的层面,在语法上的条条款款使用得得心应手,问其本质,可能就缺乏一二了。我个人的经历来看,在掌握语法之后,在向下关注一下语法背后的具体实现,会通透很多。你会在内存上、数据上和程序的各种底层运行机制上会有深刻的认识。这也就是为什么去海边玩儿,还要潜水去看看海底世界。错过了海底,你会失去很多精彩,而这些精彩我想也是作为程序员应有的追求之一。

对于Java、C#以及WEB类领域的程序员,我想汇编可能相对遥远一些。在这方面的关注也会相对少一些,但结合前面的观点,作为程序员这个角色,都是让自己的程序在机器上面跑起来,那么我想这之间的诸多底层的疑问可以作为程序员的一种兴趣来研究。目的也是为了让自己更通透,更熟悉自己的平台。我不知道怎么表达通透二字,就我个人的感受就是,能够从现象联系到本质实现,并且能够从本质实现勾勒出一幅很清晰生动的图像在脑子里,一切都一目了然尽收眼底。有点居高临下,望长城内外,惟余莽莽的那种宽广的感触。

对于本身就处于底层开发的程序员来说,无可厚非,掌握汇编就是必须的了。但是澄清一点,本文的观点更多的是从兴趣和通透性上出发,对于底层开发者可能会觉得底层有一定的枯燥,特别是整天破解、逆向等工作,非常多的体力活,从我几年的业余破解和逆向经验来看的确是这样的。但是我觉得,破解和逆向只是领域之一,我之所以破解和逆向,很多时候是处于兴趣和为了对上层进行更本质和合理的解释。所以,上层和底层结合,才是我的根本目的,也是本文想推崇的一种思路。

综上所述,我的观点是C++程序员乃至程序员,不管是作为兴趣还是工作,掌握或者了解一下汇编都是有一定必要的,但不是强制性的,也正所谓需求和追求不尽相同罢了。因此,不要问别人到底是否应该关注一下底层,掌握一下某种汇编语言,答案很明显。

作者博客原文:C++程序员“是否应该掌握”【某种汇编语言】?

 

 

网友评论(共 169条评论)..

【讨论】C++程序员是否该掌握某种汇编语言?

  • qiaonnxy 2011-09-13 19:48:35

    从一个团队考虑,如果是做应用类开发(驱动层以上,这里的驱动不包括中间层驱动),大家最好还是专心自己的业务。

    c/c++最大的害处不是技术本身,而是会造就一帮自以为是、固执己见的技术人员。这些人往往有很多不切实际的幻想,而认为当前从事的某应用系统的开发太没有技术含量。

    自以为了解到了本质,孰不知花费的时间本可以解决N个bug,多写N页说明文档。一个团体,这样的人多了会有很多不稳定因素。同样,由于表现出的技术特性,还会影响后来的新人。

    程序员最大的毛病就是认为有个编译器自己就可以当上帝。你不会去ms的内核团队上班,你关心cpu指令集只能说明你不务正业。

    程序员应该有个正确的定位,不要浮躁。看看电焊工、电工等传统的技术行业,比这个行业务实多了。那里的大师傅都在认真解决当前遇到的问题,而程序员却整天在做梦那天可以在做一遍操作系统。

    回复(4) 支持(4)反对(3) 举报(0) | 4条回复..

    • daraemon418 2011-09-14 04:35:20

      说的很好,很中肯。

      回复(0) 支持(1)反对(0) 举报(0)

    • fang_xx 2011-09-14 09:23:33

      不要这么说嘛, ...
      那些没事探底层的是有些玩物/自恋/自以为是, 那些致力于解决问题的充满奴性(你以为你解决了什么问题, 做出了什么产品), 那些动不动说"C/C++最大..."说别人自己为是的更是自己为是

      回复(0) 支持(4)反对(0) 举报(0)

    • tangyzh 2011-09-14 11:03:07

      自以为是、固执己见和用什么语言没有太大关系吧?我最近刚刚见识了一个自以为是、固执己见的Java程序员,我们在一起只有一天时间,讨论我做的东西。他走后,我对老板说,他好像有点书呆子气。老板说不是有点,是很书呆子气。另外,我是做C++的,我老板也是做技术出身的,而且技术很好。

      回复(1) 支持(0)反对(0) 举报(0)

    • qiaonnxy 2011-09-14 12:09:27
      引用内容tangyzh 2011-09-14 11:03:07自以为是、固执己见和用什么语言没有太大关系吧?我最近刚刚见识了一个自以为是、固执己见的Java程序员,我们在一起只有一天..

      不知道你们做什么! 如果是做应用类开发,除非你的老板很愿意出钱。

      否则,人数过了5个,你们自然就转c#或者java了。

      回复(0) 支持(0)反对(0) 举报(0)

  • qiaonnxy 2011-09-13 09:07:29 -[精]

    理解本质真的不重要,重要的是解决问题。

    你花上2年来理解本质,也并不见得能在解决问题的过程中比不理解的快多少。

    你理解了this指针和成员函数之间的关系有什么用?

    你理解C++对象布局又能如何?

    你掌握了函数调用机制你还是要按照这样的规则写代码不是?

    不要再浪费时间了,有时间多思考一下当前项目的业务过程吧。

    术业有专攻,要么学好、学透,要么不学。

    否则你会成为:汇编社区c++最棒的,和,c++社区汇编最棒的

    回复(24) 支持(15)反对(10) 举报(0) | 24条回复..

    • tompaz 2011-09-13 09:18:18

      有些东西理解了和记住了并不一样
      理解了对象布局,你就可以很容易实现com hook之类的应用

      回复(0) 支持(1)反对(0) 举报(0)

    • lsccsl 2011-09-13 09:49:12

      强顶,支持

      回复(0) 支持(1)反对(0) 举报(0)

    • lanzhengpeng2 2011-09-13 09:50:09

      理解本质真的很重要,他能帮助你解决重要的问题。
      你花上2年来理解本质,就有可能在解决问题的过程中比不理解的快得多。
      你理解了this指针和成员函数之间后,就知道.Net或者Java里,代理/函数线程为什么需要一个对象了
      你理解C++对象布局,就能解决某些机器上由于字节没有对齐导致的崩溃问题.
      你掌握了函数调用机制后,你才能写出正确的函数去匹配函数指针
      浪费点时间,有助于你更好的思考当前项目的业务过程

      术业有专攻,要么学好、学透,要么不学。

      否则你会成为:汇编社区c++最棒的,和,c++社区汇编最棒的

      回复(1) 支持(11)反对(1) 举报(0)

    • masefee 2011-09-13 10:06:51

      理解本质与否并不是强制性的,原文已经说明了,重要在于加深自己的理解。当然加深与否不一定影响自己的收入、职位还有上层业务。也就是追求不同罢了。另外,最棒的人不一定在汇编社区和C++社区,最棒的人也不一定玩儿社区。呵呵!

      回复(0) 支持(0)反对(0) 举报(0)

    • crackly1986 2011-09-13 17:06:35

      我都说了楼主的文章更本不知道什么是底层,。。。看起来认为懂汇编语言就是底层啦
      哎。。可怕。

      回复(2) 支持(0)反对(0) 举报(0)

    • personball 2011-09-13 17:23:00
      引用内容crackly1986 2011-09-13 17:06:35我都说了楼主的文章更本不知道什么是底层,。。。看起来认为懂汇编语言就是底层啦
      哎。。可怕。..

      确实,其实个人认为汇编只是相对c++,java这些语言而言是底层,如果java的jvm是c++编写的话,那也可以说c++是java的底层。这世上估计能用01写程序烧硬件的才算真正懂计算机底层的吧。。

      回复(2) 支持(2)反对(1) 举报(0)

    • crackly1986 2011-09-13 17:30:51
      引用内容personball 2011-09-13 17:23:00确实,其实个人认为汇编只是相对c++,java这些语言而言是底层,如果java的jvm是c++编写的话,那也可以说c++..

      底层 是什么 最起码是为我们已经实现的与硬件无关的操作系统级别的,简单说就是内核的代码。你必须去分析, 以及对于ddk这样的东西才能说的上。至于汇编用到楼主的那些东西只是雕虫小技。至于你说的01 这样的有时另外的话题,不是不可以写01的程序。01和汇编并无重大区别,但是01你必须自己把代码和数据的位置安排好已经他们在文件和内存的区别,just 。那么可能熟悉exe(coff格式)也是可以达到的。简单的说不是很难

      回复(0) 支持(0)反对(0) 举报(0)

    • masefee 2011-09-13 17:36:24
      引用内容crackly1986 2011-09-13 17:06:35我都说了楼主的文章更本不知道什么是底层,。。。看起来认为懂汇编语言就是底层啦
      哎。。可怕。..

      你认为我不知道,那我就不知道吧。嘿嘿。

      回复(0) 支持(0)反对(0) 举报(0)

    • qiaonnxy 2011-09-13 20:00:27
      引用内容lanzhengpeng2 2011-09-13 09:50:09理解本质真的很重要,他能帮助你解决重要的问题。
      你花上2年来理解本质,就有可能在解决问题的过程中比不理解的快得..

      .net 的代理/函数需要一个对象吗?

      对于字节对齐造成的奔溃,我pack调一下不就可以了吗? 我需要知道原因吗?

      写函数去匹配函数指针,不都是把函数指针的定义赋值过来,改一些语法结构的吗?

      回复(0) 支持(0)反对(0) 举报(0)

    • bhdgx 2011-09-13 20:23:31

      要想有好的发展,只是解决问题是不够的

      回复(1) 支持(0)反对(0) 举报(0)

    • luozenghui529480 2011-09-13 20:31:40

      如果人人像你这么想,那我看中国真的是真正没救了!!!

      回复(1) 支持(2)反对(0) 举报(0)

    • qiaonnxy 2011-09-13 21:34:46
      引用内容luozenghui529480 2011-09-13 20:31:40如果人人像你这么想,那我看中国真的是真正没救了!!!..

      伙计,没事别忧国忧民好不!

      天朝,多你一个不多,少你一个不少!

      别太把自己当回事情。

      回复(0) 支持(2)反对(0) 举报(0)

    • qiaonnxy 2011-09-13 21:38:24
      引用内容bhdgx 2011-09-13 20:23:31要想有好的发展,只是解决问题是不够的..

      你错了!

      能做到解决问题的人已经非常了不起了。

      大多数人都是那些眼高手低的。 自己学2年,无非是可以

      把某个ms写的函数自己写一下,而且完全达不到人家的水平。

      你说你可以重写stl,有什么用? stl已经有了,你能解决实际项目或者工程中遇到的实际问题才是关键。

      回复(1) 支持(0)反对(0) 举报(0)

    • ybt631 2011-09-13 21:54:31

      说下我的经验
      1.你说的这几个方面对于实现东西帮助不大,但是对于解决bug是很有帮助的
      2.理解本质对于对它感兴趣的人,只是个顺路而已,不用耗费多少时间.
      3.理解本质在更多的时候是一个思维习惯,你说的这几个方面或许没太大帮助,但是所谓的问题本质还有更多方面,比如对于一个写逻辑应用的coder而言,你不了解整个底层的实现原理.那你走不远的.典型的是,假如现在有个创业公司,让你当主程,就不行了.
      4.思考业务过程跟了解本质也不矛盾.

      回复(1) 支持(0)反对(0) 举报(0)

    • ybt631 2011-09-13 22:12:45

      最后总结下
      理解本质很重要,可以帮助你更快速,更好的解决问题.

      回复(0) 支持(0)反对(0) 举报(0)

    • qiaonnxy 2011-09-13 22:28:51
      引用内容ybt631 2011-09-13 21:54:31说下我的经验
      1.你说的这几个方面对于实现东西帮助不大,但是对于解决bug是很有帮助的
      2.理解本质..

      现实是,能写你那所谓逻辑的人一大把,更别提用了一些类库和框架之后的数量了。

      但,一旦某个问题,往往表现为bug出现的时候,在不改变现有结构,也就是不进行大规模的修改,就事论事改完bug的人往往不那么好找。

      回复(2) 支持(0)反对(0) 举报(0)

    • ybt631 2011-09-13 23:16:19
      引用内容qiaonnxy 2011-09-13 22:28:51现实是,能写你那所谓逻辑的人一大把,更别提用了一些类库和框架之后的数量了。

      但,一旦某个问题,往往..

      是的
      现实确实是这样
      debug能力很容易被忽略,但事实上水平往往就是体现在这方面:
      同样的功能,你能写的代码bug更少,解决问题更快
      如果你有探究本质的牛劲的话,再棘手的bug都是纸老虎

      回复(0) 支持(0)反对(0) 举报(0)

    • ybt631 2011-09-13 23:19:58
      引用内容qiaonnxy 2011-09-13 22:28:51现实是,能写你那所谓逻辑的人一大把,更别提用了一些类库和框架之后的数量了。

      但,一旦某个问题,往往..

      很显然,我这里说的本质 不是钻牛角尖
      而是知其然 且知其所以然的程序员素质
      最终只为一个目的,更好,更快的解决问题.

      回复(0) 支持(0)反对(0) 举报(0)

    • biosman 2011-09-13 23:46:58
      引用内容personball 2011-09-13 17:23:00确实,其实个人认为汇编只是相对c++,java这些语言而言是底层,如果java的jvm是c++编写的话,那也可以说c++..

      恩,你的说法我也同意。只是如果我们不是去转牛角尖的话,这里的底层应该是值得计算机原理和逻辑结构。也许这些物理层面的实现本质是计算机硬件工程问题,而不是软件工程问题,但是,我们不能否认的是,这些程序和软件是基于这些原理和数字逻辑实现。所以,我认为,了解计算机的这些逻辑结构和原理是对编程有用的。比如我们可以利用c或c++轻松实现计算机之间的通信,而不用调用大量我们自己都不知道的函数。

      回复(1) 支持(0)反对(0) 举报(0)

    • qiaonnxy 2011-09-14 06:09:06
      引用内容biosman 2011-09-13 23:46:58恩,你的说法我也同意。只是如果我们不是去转牛角尖的话,这里的底层应该是值得计算机原理和逻辑结构。也许这些物理层面的实现本..

      "比如我们可以利用c或c++轻松实现计算机之间的通信,而不用调用大量我们自己都不知道的函数。"

      tcp/ip 你自己写的啊? recv 你写的啊?

      你说的这些,只是你调用系统api给你产生的错觉。

      你用c#实现计算机之间的通信用到的api和c/c++的有几个不同?

      回复(0) 支持(1)反对(0) 举报(0)

    • gap062 2011-09-14 08:50:29

      有道理!

      回复(0) 支持(0)反对(0) 举报(0)

    • fang_xx 2011-09-14 09:12:18
      引用内容qiaonnxy 2011-09-13 21:38:24你错了!

      能做到解决问题的人已经非常了不起了。

      大多数人都是那些眼高手低的。..

      对, 解决了才有饭吃. 你不解决有人会解决, 没人解决的了也没关系, 末日不会到来.

      回复(0) 支持(0)反对(0) 举报(0)

    • mymixing 2011-09-14 11:14:01

      呵,真是倔强啊。
      其实你说的话,都是自相矛盾的。
      你说的那些东西理解了,会对解决问题没有用?
      呵呵,也是啊,这些东西都理解了,就不会写出有问题的程序了。
      也就不需要解决问题了。
      ~~另外多说一句,你不懂汇编的话,你是没有资格评论汇编的。

      回复(1) 支持(0)反对(0) 举报(0)

    • qiaonnxy 2011-09-14 12:08:16
      引用内容mymixing 2011-09-14 11:14:01呵,真是倔强啊。
      其实你说的话,都是自相矛盾的。
      你说的那些东西理解了,会对解决问题没有用?

      呵呵,又一个自以为是的。

      和另外一个写:“学过汇编都会支持,不学的就反对”如出一辙。

      麻烦别那么自以为是好不好!

      你的自以为是还体现在:以为理解了运行机制就不会写出有问题的程序。(不解释)

      回复(0) 支持(0)反对(0) 举报(0)

  • tug007 2011-09-14 11:14:25

    底层确实很重要尤其是在调试观察程序的运行过程时,懂汇编有益无害啊

    回复(0) 支持(0)反对(0) 举报(0) | 0条回复..

    • wlq891115 2011-09-14 10:51:26

      有意思就有兴趣

      回复(0) 支持(0)反对(0) 举报(0) | 0条回复..

      • yangmijun 2011-09-13 18:20:16

        假如汇编学习的难度与VB差不多,还会有争论吗?

        回复(2) 支持(0)反对(0) 举报(0) | 2条回复..

        • qiaonnxy 2011-09-13 19:56:56

          你发一个“C++程序员是否该掌握VB”出来,看看反映不就知道了吗?

          回复(1) 支持(0)反对(0) 举报(0)

        • fang_xx 2011-09-14 09:33:00
          引用内容qiaonnxy 2011-09-13 19:56:56你发一个“C++程序员是否该掌握VB”出来,看看反映不就知道了吗?..

          你的意思是假如难度一样, 学VB与学汇编是一样? VB与汇编的区别在难度上?
          什么公司, 想进还不让进?

          回复(0) 支持(0)反对(0) 举报(0)

      • masefee 2011-09-14 08:52:08

        再次声明本文的观点,希望大家不要讨论偏了。
        本文举的例子可能并不是很全面,这些例子只是很小一部分。本文没有任何强制性的意思说必须掌握汇编,这个看自己喜好和兴趣。另外,至于什么是底层,本文并没有解释。底层是相对的,本文也不是要表达清楚了底层就怎么怎么。本文的意图在于,作为程序员,让自己的见识更宽广一些,对于自己的程序的上层工作和后台工作有更清晰的,更彻底的掌控,更能有效并快速的反应和解决各种问题。本文不在于汇编这门语言上,而在于一种思路,也是一种追求。就像有朋友回复的,你如果作为主程序,作为架构师,对了解细节和原理性的东西,会更有利于你。当然你可以选择其他方式。本文不是唯一的途径。

        回复(3) 支持(3)反对(0) 举报(0) | 3条回复..

        • masefee 2011-09-14 08:55:12

          【【【【【【【【【【【回复的朋友,请先看本文的最终意图,别把一件好事讨论偏了】】】】】】】】】】】】】】

          回复(0) 支持(1)反对(0) 举报(0)

        • qiaonnxy 2011-09-14 09:16:43

          围绕你的最终意图不但会非常无趣,而且必须以你的话题为核心。

          这不是“评论”的目的所在。

          回复(1) 支持(0)反对(0) 举报(0)

        • masefee 2011-09-14 09:30:12
          引用内容qiaonnxy 2011-09-14 09:16:43围绕你的最终意图不但会非常无趣,而且必须以你的话题为核心。

          这不是“评论”的目的所在。..

          不是围绕这个为核心进行评论,我的意思是客观一些,本文并没有偏执的观点。嘿嘿!

          回复(0) 支持(0)反对(0) 举报(0)

      • e513479333 2011-09-13 10:17:50 -[精]

        在这个领域,要感谢以下这些专家和团队的努力
        排第一的当然是微软,微软为了加大Windows的可操控性,在系统下预留了调试接口
        并和VS系列进行了无缝整合,同时推出支持单机和双击调试的WinDBG
        (虽然用起来和在DOS差不多,一点不好用,而且几乎所有逆向工程的高级动作全部需要手动)
        但是还要感谢微软在这个领域的架构级的卓越贡献
        ---------------------------------------------------------------------------------------------
        排第二个是世界排名第一的逆向调试软件ollydbg,来自于德国
        逆向工程江湖第一把交椅,软件成熟,稳定,几乎支持各种逆向工程高级特性,而且可以自己编写插件
        软件工程公司对ollydbg是又爱又恨,爱他的强大,可以在没有源码的情况下迅速的理解软件的代码架构
        恨他过于强大,以至于自己的软件会被对手迅速的研究以至于重构
        从某种意义上来说,逆向工程能去的今天的成就
        很大一部分是因为这个来自德国的软件,成熟,稳定,可靠,可扩展
        ---------------------------------------------------------------------------------------------
        排第三的是来横跨R3和R0级调试的Syser,来自于中国
        在微软XP和Win7下为数不多的内核级调试器,另外两个是WinDBG,ollydbg(需要加插件)
        很难相信,这居然是两个人花了五年时间开发出来的,从最初的1.0版本升级到现在的199.1900.1201
        仅仅是内核稳定调试这简单的六个字,就足以让这款调试器进入前三

        回复(6) 支持(2)反对(2) 举报(0) | 6条回复..

        • crackly1986 2011-09-13 17:05:14

          你连ida都不说 在乱说吧。

          回复(1) 支持(0)反对(0) 举报(0)

        • e513479333 2011-09-13 17:53:17
          引用内容crackly1986 2011-09-13 17:05:14你连ida都不说 在乱说吧。..

          对了,还真忘记IDA了,C32ASm小巧敏捷
          IDA是商用级的静态分析软件,技术完善,功能强大
          支持IDC脚本分析引擎

          回复(0) 支持(0)反对(0) 举报(0)

        • baby393 2011-09-13 19:09:52

          NuMega的softice是非常出名的

          回复(1) 支持(0)反对(0) 举报(0)

        • e513479333 2011-09-13 22:54:45
          引用内容baby393 2011-09-13 19:09:52NuMega的softice是非常出名的..

          softice的公司已经停止更新了

          回复(0) 支持(0)反对(0) 举报(0)

        • qiaonnxy 2011-09-14 06:10:10

          如果你是做应用开发,不是做软件破解,依赖这些工具,只能说明你的设计和代码风格有问题。

          回复(1) 支持(0)反对(0) 举报(0)

        • masefee 2011-09-14 08:46:34
          引用内容qiaonnxy 2011-09-14 06:10:10如果你是做应用开发,不是做软件破解,依赖这些工具,只能说明你的设计和代码风格有问题。..

          做应用开发有很多领域,也得看领域的,看问题要客观一点,不能以偏概全。

          回复(0) 支持(0)反对(0) 举报(0)

      • u_r_sb 2011-09-13 20:53:08

        噗⋯⋯看到很多对汇编嗤之以鼻的⋯⋯
        不管是嵌入式系统核心层和固件层还是高性能计算都对汇编有很高要求。前者需要系统级的各类指令,后者需要各类多媒体指令集或各类功能强大的算术逻辑计算的指令集。
        其实个人认为用汇编来研究啥对象模型并不科学。C++提供的对象模型本来就是一个抽象模型。各个操作系统和编译器都可以有不同的实现方式。就如同网络7层模型,并不需要你每一层都做完整实现,呵呵。另外,偶跟zenny大一样,更偏好于C++的泛型,而不是OO。

        回复(1) 支持(1)反对(0) 举报(0) | 1条回复..

      • king_2007 2011-09-13 22:04:50

        楼主有点昏头转向,编写汇编程序是理解系统的工作原理,比如cpu、内存、硬盘之类的工作流程是怎样的,但这不能说明就能理解了硬件底层。至于是否该学汇编语言,我觉得多学没有什么坏处。

        回复(1) 支持(1)反对(0) 举报(0) | 1条回复..

        • masefee 2011-09-14 08:45:06

          不是晕头转向,底层是相对的,不是硬件才是底层,还有比硬件更底层的东西。
          本文意在作为程序员,多了解原理性的东西,对上层开发是件好事。

          回复(0) 支持(0)反对(0) 举报(0)

      • wildwild1 2011-09-14 08:18:45

        至少我是很想知道怎么处理这些看上去不是问题的问题的……但是没有机会去了解这些

        回复(0) 支持(0)反对(0) 举报(0) | 0条回复..

        • uuussseeennn 2011-09-14 07:53:21

          一句话:Think in low, code in high!

          回复(0) 支持(0)反对(0) 举报(0) | 0条回复..

          • xuanner 2011-09-14 01:51:11

            其实作者说得也有一定的道理,我本人来说曾经也有过一段时间研究汇编,没坚持多久就不行了,确实有点枯燥,如果是做C++方面(算法)优化的话,了解汇编可能会有一定的作用。

            回复(0) 支持(0)反对(0) 举报(0) | 0条回复..

            • baby393 2011-09-13 19:33:09

              懂汇编是很有用的,如果不懂汇编但你说自己是C++高手我是不信的。
              我用了十二年C++,我会C++之前一年学会了汇编,因此我可以说我会汇编十三年了,但2000年以后我几乎不用汇编写程序,在以前写C++代码的时候往往很冲动,常常想用内联汇编来提高效率,但后来几乎想都不想了,取而代之的是从汇编的角度去思考C++代码,这对提高C++代码的质量是很有好处的。最初我体会到一点,C++是很阴暗的!这需要有汇编的知识从指令级别观察才更有体会。例如一个“=”赋值操作,C++编译器背着你做了多少工作你知道吗?所以说懂汇编以后能够从本质上观察C++编译器的表现,对于提升自己的C++水平是大有帮助的。
              我也提几个问题:
              1) 你理解“=”吗?
              2) 类的虚表vtable是如何初始化的?
              3)C++异常处理是如何初始化的?异常的传递过程是怎样的?
              4)WIN32 结构化异常处理SEH是如何初始化的,过程是怎样的?

              回复(6) 支持(4)反对(2) 举报(0) | 6条回复..

              • qiaonnxy 2011-09-13 19:34:41

                这些和完成我的应用系统有关系吗?

                回复(2) 支持(4)反对(0) 举报(0)

              • qiaonnxy 2011-09-13 19:35:23

                用异常处理的cpp程序员都是不能说是cpp程序员

                回复(0) 支持(0)反对(0) 举报(0)

              • luozenghui529480 2011-09-13 20:40:55
                引用内容qiaonnxy 2011-09-13 19:34:41这些和完成我的应用系统有关系吗?..

                我想说两句,哈哈!!谢谢!!!
                不会你就简单到这么简单吧!!!你太牛了,你们公司也太牛了!!

                回复(1) 支持(0)反对(0) 举报(0)

              • qiaonnxy 2011-09-13 21:33:58
                引用内容luozenghui529480 2011-09-13 20:40:55我想说两句,哈哈!!谢谢!!!
                不会你就简单到这么简单吧!!!你太牛了,你们公司也太牛了!!..

                你别在这里搞什么讽刺,事实就是如此!

                业务才是关键,你又不是intel或者ms的内核团队成员!

                我们公司,那不是你这样的随便就能来的。

                回复(1) 支持(1)反对(0) 举报(0)

              • e513479333 2011-09-13 22:53:34
                引用内容qiaonnxy 2011-09-13 21:33:58你别在这里搞什么讽刺,事实就是如此!

                业务才是关键,你又不是intel或者ms的内核团队成员!

                就算给你拿到业务,程序在运行中出现异常错误
                如果无法有效解决这样的问题,客户会买单?

                回复(0) 支持(0)反对(0) 举报(0)

              • biosman 2011-09-13 23:50:18
                引用内容qiaonnxy 2011-09-13 19:34:41这些和完成我的应用系统有关系吗?..

                有一些关系。比如程序的效率和程序的运行成本。

                回复(0) 支持(0)反对(0) 举报(0)

            • FM9066 2011-09-13 23:38:31

              学会汇编,快马加鞭

              回复(0) 支持(0)反对(0) 举报(0) | 0条回复..

              • e513479333 2011-09-13 23:30:52

                该篇可以入选2011年CSDN评论年度评论,见证技术的灯塔......

                回复(0) 支持(0)反对(1) 举报(0) | 0条回复..

                • bookyjh 2011-09-13 23:29:15

                  如果分析中国整个软件产业链,你就知道该不该掌握汇编语言了!

                  回复(0) 支持(0)反对(0) 举报(0) | 0条回复..

                  • personball 2011-09-13 17:20:21

                    只要用得着,不管是工作上还是个人爱好上,就自然会掌握;
                    用不着,再逼着自己学也掌握不了,短期掌握了也会忘记。

                    回复(1) 支持(1)反对(0) 举报(0) | 1条回复..

                  • hertz2007 2011-09-13 22:01:07

                    楼主的意思应该是认为,如果想做技术大家,就应该融会贯通;即便不需要那么多综合的知识,但通过理解整条流水线,也有利于更准确的把握你现在所关注那一个点。

                    回复(0) 支持(0)反对(0) 举报(0) | 0条回复..

                    • romandion 2011-09-13 21:51:39

                      支持楼主的观点。做客户端可能感觉不是很明显,做服务端感觉尤为明显。系统崩溃现场,很多只能通过底层只是来支撑静态分析。生产环境的core dump很多时候也提供不了足够的信息。

                      回复(0) 支持(0)反对(0) 举报(0) | 0条回复..

                      • fangjuanyuyue 2011-09-13 21:18:35

                        应该,学习汇编可以更好的了解程序的实现,对程序的错误也能避免,本人正在学习中

                        回复(0) 支持(0)反对(0) 举报(0) | 0条回复..

                        • fcly1981826ly 2011-09-13 20:58:59

                          啊,,,,,

                          回复(0) 支持(0)反对(0) 举报(0) | 0条回复..

                          • luozenghui529480 2011-09-13 20:57:09

                            这个问题我觉得就有点像学不学要学算法一样!!!

                            回复(0) 支持(0)反对(0) 举报(0) | 0条回复..

                            • janvi 2011-09-13 20:56:56

                              目前的情况来看,能耐心看懂,写少量的就够了。

                              回复(0) 支持(0)反对(0) 举报(0) | 0条回复..

                              • luozenghui529480 2011-09-13 20:52:02

                                其实这本来就可以说是一个没有答案的问题!!!关键在于你能从中得到什么,每个人从中得到的东西都不一样!!有的人学了能把他灵活的运用在每个地方,有的人学了等于没学!!!唉。。。
                                没什么号争论的,一切都在于自己!!!

                                回复(0) 支持(1)反对(0) 举报(0) | 0条回复..

                                • svtanto 2011-09-13 20:50:25

                                  不是懂不懂汇编的问题,是懂不懂计算机的问题,我的观点技术上在汇编以下,业务上在汇编以外,心里有十,手里做一,你确实有把握按计划完成工作吗?

                                  回复(0) 支持(2)反对(0) 举报(0) | 0条回复

                                • 0
                                  点赞
                                • 0
                                  收藏
                                  觉得还不错? 一键收藏
                                • 0
                                  评论
                                评论
                                添加红包

                                请填写红包祝福语或标题

                                红包个数最小为10个

                                红包金额最低5元

                                当前余额3.43前往充值 >
                                需支付:10.00
                                成就一亿技术人!
                                领取后你会自动成为博主和红包主的粉丝 规则
                                hope_wisdom
                                发出的红包
                                实付
                                使用余额支付
                                点击重新获取
                                扫码支付
                                钱包余额 0

                                抵扣说明:

                                1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
                                2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

                                余额充值