首页 > 后端开发 > 正文

C语言逆向之表达式短路分析及应用 编程入门为什么要先要学C语言

2023-06-26 19:27:31 | 我爱编程网

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、C++、java、php、python、go、ruby等等),到底应该先学哪一个?

笔者的观点很明确:首选C语言!


纵观我国教育课程设置,各大高等院校普遍成熟的课程安排95%以上都是先学C语言(少部分非计算机专业院校安排VB或重点院校直接学C++),往后根据学校培养目标、课程体系需要决定开设C++或java或前端等其他开发语言。近几十年的计算机教育的发展也验证了这个课程安排的科学性。下面通过笔者这些年的感悟谈谈这样设置的好处及原因:


1.C语言本身的特点
语言诞生于上世纪70年代,本身在发明初期就定位为系统级语言,是面向过程编程,是专门为系统开发准备的中级语言,其安全性、效率、跨平台的特点决定了它最符合人们心目中编程语言的样子,加上其主导的特性,好多语言的解释器/编译器甚至新的语言本身都是通过C来改写或直接开发的,足以看出C语言的重要性

2.教学学习需要的安排
语言作为中级编程语言,从靠近机器还是靠近人的分级来看,最适合编程学习,适合奠定人们对程序的第一观念,为今后无论学习解释性语言、还是面向对象的高级语言都有决定性的铺垫作用,这也是很多高校把C语言作为第一门语言的原因

3.学习支持、应用场景多
无论是中学生还是成年人,学习C语言的应用场景都非常多,学习资料支持也非常多、成熟。中学生有NOI/NOIP竞赛、大学ACM、嵌入式开发、计算机二级等无论竞赛、开发、考试都无处不在C语言的影子



以上笔者十多年从业经验的感悟看法,希望对初学还犹豫的你有所帮助!

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

免责声明:文章内容来自网络,如有侵权请及时联系删除。
标签: C++
与“C语言逆向之表达式短路分析及应用 编程入门为什么要先要学C语言”相关推荐
编程语言python入门要学习哪些?
编程语言python入门要学习哪些?

编程语言python入门要学习哪些?学习python,主要学习ython基础语法、数据类型、字符编码、文件操作、函数、装饰器、迭代器、内置方法、常用模块等;之后再进阶学习,如框架等。阶段一:Python开发基础Python全栈开发与人工智能之Python开发基础知识学习内容包括:Python基础语法、数据类型、字符编码、文件操作、函数、装饰器、迭代器、内置方法、常用模块等。

2024-01-19 18:01:13
刚入大学,请问计算机二级,Python,c语言,c++,编程分别是什么?
刚入大学,请问计算机二级,Python,c语言,c++,编程分别是什么?

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

2024-02-20 02:24:02
为什么说php是c语言
为什么说php是c语言

php中的几个输出函数1echo();2print();3die();4printf();5sprintf();6print_r();7var_dump();1echo()可以同时输出多个字符串,可以多个参数,并不需要圆括号,无返回值。2print()只可以同时输出一个字符串,一个参数,需要圆括号,有返回值,当其执行失败时返flase.print的用法和C语言很像,所以会对输

2025-03-03 06:09:39
Python编程语言主要应用在什么领域
Python编程语言主要应用在什么领域

Python编程语言主要应用在什么领域Python是一门简单、易学并且很有前途的编程语言,很多人都对Python感兴趣,但是当学完Python基础用法之后,又会产生迷茫,尤其是自学的人员,不知道接下来的Python学习方向,以及学完之后能干些什么?以下是Python十大应用领域!1.WEB开发Python拥有很多免费数据函数库、免费web网页模板系统、以及与web服务器进行交互的库,

2024-02-10 00:46:39
编程入门先学什么?
编程入门先学什么?

编程入门先学什么?编程入门先学C语言或者python。为了解决使用机器语言编写应用程序所带来的一系列问题,人们首先想到使用助记符号来代替不容易记忆的机器指令。这种助记符号来表示计算机指令的语言称为符号语言,也称汇编语言。在汇编语言中,每一条用符号来表示的汇编指令与计算机机器指令一一对应;记忆难度大大减少了,不仅易于检查和修改程序错误,而且指令、数据的存放位置可以由计算机自动

2024-02-09 09:39:48
PHP与C语言的语法有什么不同
PHP与C语言的语法有什么不同

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

2024-09-04 16:58:18
c语言可以写java吗
c语言可以写java吗

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

2024-04-08 21:31:14
在PHP语言中,为什么要引入“函数”这个概念?
在PHP语言中,为什么要引入“函数”这个概念?

php中function函数的用法在PHP中,function是用于定义和声明函数的关键字。函数是一段可重复使用的代码块,它封装了一系列操作或逻辑,并可以通过函数名进行调用和执行。通过使用函数,可以将代码模块化,提高代码的可读性、可维护性和重用性。在PHP中,function关键字用于定义和声明函数。函数是一段可重复使用的代码块,它封装了一系列操作或逻辑,并可以通过函数名进行调用和执行,

2025-01-04 03:59:21