首页 > 后端开发 > 正文

C语言逆向之表达式短路分析及应用 客评价谭浩强C语言书到底好不好

2023-06-26 19:33:03 | 我爱编程网

C语言逆向之表达式短路分析及应用

C语言逆向之表达式短路分析及应用

大家在学习C语言过程中,可能会见到过一些这样的题,就是表达式短路,表达式短路主要体现在C语言中逻辑运算符&&和||。今天将对表达式短路的做逆向分析,来深入理解它。

首先利用表达式短路,我们可以写一个很经典的累加求和的函数,代码如下:

功能很简单,就是求1+2+…+99+100的数字和的一个程序,但用递归写了出来,利用逻辑与运算,左边判断是否递归到0,右边累加求和,其中的技巧巧妙的运用逻辑与运算的短路特点,实现累加的效果。请大家自行分析理解~

下面我们断点反汇编,查看重点num && (num += Add(num-1));语句的汇编代码,如下

下面详细分析:

;比较num是否为0! 这里也就是逻辑与表达式左边的判断!

0040D718       cmp         dword ptr [ebp+8],0

;判断ZF标志位是否为1然后进行跳转,到return处

0040D71C       je          Add+35h (0040d735)

;继续把num变量送入eax寄存器

0040D71E       mov         eax,dword ptr [ebp+8]

;对num减1

0040D721       sub         eax,1

;结果作为参数,压栈准备进入递归调用

0040D724       push        eax

;继续调用Add函数,地址位于0040100a处

0040D725       call        @ILT+5(_Add) (0040100a)

;栈清空

0040D72A       add         esp,4

;将num里的值放入ecx寄存器里

0040D72D       mov         ecx,dword ptr [ebp+8]

;进行累加运算我爱编程网

0040D730       add         ecx,eax

;放回num地址处

0040D732       mov         dword ptr [ebp+8],ecx

;此处为return num 返回Add函数结束

0040D735       mov         eax,dword ptr [ebp+8]

大家通过阅读汇编代码,上下文联系应该就可以分析出来,递归调用时候的每次参数递减,进行累加求和,正因为逻辑与运算的短路特点会先判断左边num的值是否减到了0来决定是否还算右边的表达式,汇编代码对应num为0时JE比对跳转到return处;而为假时继续计算右边表达式,进行call命令递归调用,栈地址不断变化直至0结束return返回。

大家仔细体会!

以上就是逻辑与运算中短路的特点以及运用短路来实现语句中断的例子!逻辑或原理也相同,大家可以自行实验!欢迎讨论!

客评价谭浩强C语言书到底好不好


近来,总听到有一些吐槽谭浩强C语言入门这个本书的问题,在业内掀起一阵跟风行为,也令不少打算入门的同学选择困难,今天通过此文表达一个客观公正的观点。


我总结了一下吐槽谭浩强书不好的几个点:
1. 陈旧,有错误,比如void main问题
2. 太注重理论,过多++a+b++这种绕圈子的问题,太过应试不利于能力培养



其实,这本作为第一批清华大学出版,用于全国各地高校的第一本大规模推广的书籍,在当时资料匮乏、缺乏资源的年代,这本书已经是一本不可多得的好书了。错误、格式落后即便用现在的眼光看,也应该能够理解当时的处境,何况语言标准从C89、C90、C99多次大标准修订,我觉得这类问题大不可作为评判这本书不好的原因
另一个方便,许多朋友说这本书太过于纠结低级问题来回绕圈子,完全就是应试教学,根本培养不了编程人才,甚至因此贬低中国教育落后。我真的想说,这就是教育家与普通技术男的区别 ,如果你了解国情,作为从上到下的推广书籍的主编的时候,你就不会这么想了

其实,我觉得这些一条条的原因主要是应为一些对编程有更高要求,而看不上谭浩强C语言这种给初学者和小白的教材,甚至略有些“恃才傲物”的人们刻意放大的这本书的错误。
但如果你明白这本书是为了绝大部分C语言的学习者、编程入门的初学者等甚至很大一部分人是非计算机专业的人而准备,就明白这本书的创作目的了。所以,我们也会看到网上一些人们除了贬低这本书之外,还建议直接学习类似《C prime plus》、《C语言程序设计入门》翻译版等书籍了,笔者这里不完全赞同,唯一提醒的就是初学者要警惕“小马过河“的故事,知道自己“几斤几两”,选择适合自己的教材,才是正确的办法!


更多相关文章关注我爱编程网:www.52biancheng.com

免责声明:文章内容来自网络,如有侵权请及时联系删除。
标签: C++
与“C语言逆向之表达式短路分析及应用 客评价谭浩强C语言书到底好不好”相关推荐
PHP与C语言的语法有什么不同
PHP与C语言的语法有什么不同

PHP与C语言的语法有什么不同PHP与C语言的语法有什么不同?PHP的基本语法和C是很相似的,可以说大部分编程语言的基本语法都是如出一辙的:顺序、选择(if)、循环(while)。不同之处有变量定义,还有实现的具体细节。但是,php主要是部署网站用的,所以大部分时候是要嵌在HTML语言里面的,并且与JS混合在一起,所以表面看上去很乱,远远没有C语言的单纯。以上是对格式方面的理

2024-09-04 16:58:18
PHP用到的C语言中的“指针”多吗?
PHP用到的C语言中的“指针”多吗?

PHP用到的C语言中的“指针”多吗?php没有指针的概念.=============如果学习PHP的话还有没有必要学习“指针”“结构体共同体”“编译预处理”等知识点?================单从php来说,的确是用不上.但是既然都学习了前面几章,何不顺带看一下呢.即使PHP中没有指针概念,但你要理解了指针概念,对PHP的引用概念搏侍就很容易理解了.编译预算处理

2024-07-23 15:07:52
c语言可以写java吗
c语言可以写java吗

c语言可以写java吗c语言学完可以转java吗?当然可以转,但如果说你学C语言的目标是为了初步掌握编程基础,并打算学习更高级语言做web开发,那可以考虑直接去学java。C语言是高级语言的基础,也是高级语言入门的最佳选择之一,C语言面向过程写程序按部就班自由性比较大,java基础比较简单,没有语言基础的照样能学会。在你学了C语言之后,顶多了解了C语言的思想以及某些语法。但是在java

2024-04-08 21:31:14
Python到底是什么语言?
Python到底是什么语言?

Python到底是什么语言?简单来说,Python是一个程序开发语言,是一个:高级编程语言,其设计的核心理念是代码的易读性,以及允许编程者通过若干行代码轻松表达想法创意。Python是一门多种用途的编程语言,时常在扮演脚本语言的角色。一般来说,Python可定义为面向对象语的脚本语言:这个定义把面向对象的支持和全面的面向脚本语言的角色融合在一起。事实上,人们往往以“脚本”而不是“程序

2024-02-09 08:24:27
刚入大学,请问计算机二级,Python,c语言,c++,编程分别是什么?
刚入大学,请问计算机二级,Python,c语言,c++,编程分别是什么?

刚入大学,请问计算机二级,Python,c语言,c++,编程分别是什么?计算机二级是一门计算机等级的考试,其中报考的科目可以有好多种,主要分为两种——office和语言,而语言又分成三个大科目——高级语言程序设计,web语言网页开发,数据库程序设计,派森跟C就是其中高级语言程序设计的科目之一。考生只需要在公布的科目里随便报考一个就可。(自行看下图)C和C++的关系,可以看成win7和

2024-02-20 02:24:02
如何用c语言在windows平台上开发php extension
如何用c语言在windows平台上开发php extension

如何用c语言在windows平台上开发phpextension何使用C语言发PHP扩展函数功能:php面整数符号数其内部实现其实longunsignedlong于32位机器说php能表示整数2^31-1般应用碰于2^31-1于2^32数能用字符串表示于mixedint_ext(stringin)说字符串in表示整数于2^31-1返整数于返字符串发扩展步骤:(首先需要载php源码载

2024-09-23 08:43:13
python到底是什么类型的语言
python到底是什么类型的语言

python到底是什么类型的语言Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。解释型语言:(推荐学习:Python视频教程)程序不需要编译,程序在运行时才翻译成机器语言,每执行一次都要翻译一次。因此效率比较低。比如Basic语言,专门有一个解释器能够直接执行Basic程序,每个语句都是执行的时候才翻译。(在运行程序的时候才翻译,专门有一个解释器去进行翻译,每个

2024-02-29 10:33:15
python是最好的编程语言吗?
python是最好的编程语言吗?

python是最好的编程语言吗?是的,Python诞生之初被誉为最容易上手的编程语言。Python的设计哲学强调代码的可读性和简洁的语法,使得Python比其他语言更加的简洁。Python常被称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。以及强大的机器学习功能库的支持,使得Python被誉为最好的人工智能语言。一个原因就是Python现在已经逐渐

2023-12-17 10:44:14