2023-06-26 19:17:22 | 我爱编程网
大家在学习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返回。
大家仔细体会!
以上就是逻辑与运算中短路的特点以及运用短路来实现语句中断的例子!逻辑或原理也相同,大家可以自行实验!欢迎讨论!
通过上一篇的讲解,相信大家已经明白直接的return数组的问题以及原因了,今天我们将详细为大家讲解在函数中返回数组的常见办法。此类问题,应用场景往往为了解决函数间相互通信,比如某个函数内处理的完的结果数据需要交接给另一个函数的情况,那么一般来说,总结有以下三种:
下面逐个实验,对于第二种方法,由于动态开辟内存在堆区,堆区不想上一讲中局部变量在栈区存储,系统根据它的生命周期自动收回,而是手动开辟,手动释放,这样就可以完全规避问题,例子与效果见下图:我爱编程网
需要注意的是:记得用完free掉,防止内存泄露!
第三种方法:虽然没有在函数中返回数组,但也可以解决数组通信问题,主要思路就是调用方中定义数组,然后将地址传入,由于该内存属于调用方,而非被调用方,故被调用方在调用结束后释放掉内存也无所谓。例子程序及效果如下:
关于数组使用传递的总结,大体如上,大家有任何问题和疑问还可以联系我们!
C语言逆向之表达式短路分析及应用 C语言逆向之表达式短路分析及应用 大家在学习C语言过程中,可能会见到过一些这样的题,就是表达式短路,表达式短路主要体现在C语言中逻辑运算符&&和||。今天将对表达式短路的做逆向分析,来深入理解它。 首先利用表达式短路,我们可以写一个很经典的累加求和的函数,代码如下: 功能很简单,就是求1+2+…+99+100的数
C语言逆向之表达式短路分析及应用 C语言逆向之表达式短路分析及应用 大家在学习C语言过程中,可能会见到过一些这样的题,就是表达式短路,表达式短路主要体现在C语言中逻辑运算符&&和||。今天将对表达式短路的做逆向分析,来深入理解它。 首先利用表达式短路,我们可以写一个很经典的累加求和的函数,代码如下: 功能很简单,就是求1+2+…+99+100的数
C语言自定义函数如何返回数组(下) C语言自定义函数如何返回数组(下) 通过上一篇的讲解,相信大家已经明白直接的return数组的问题以及原因了,今天我们将详细为大家讲解在函数中返回数组的常见办法。此类问题,应用场景往往为了解决函数间相互通信,比如某个函数内处理的完的结果数据需要交接给另一个函数的情况,那么一般来说,总结有以下三种: 直接使用全局变量:这种方法最方便,但此方法打
C语言逆向之表达式短路分析及应用 C语言逆向之表达式短路分析及应用 大家在学习C语言过程中,可能会见到过一些这样的题,就是表达式短路,表达式短路主要体现在C语言中逻辑运算符&&和||。今天将对表达式短路的做逆向分析,来深入理解它。 首先利用表达式短路,我们可以写一个很经典的累加求和的函数,代码如下: 功能很简单,就是求1+2+…+99+100的数
C语言自定义函数如何返回数组(下) C语言自定义函数如何返回数组(下) 通过上一篇的讲解,相信大家已经明白直接的return数组的问题以及原因了,今天我们将详细为大家讲解在函数中返回数组的常见办法。此类问题,应用场景往往为了解决函数间相互通信,比如某个函数内处理的完的结果数据需要交接给另一个函数的情况,那么一般来说,总结有以下三种: 直接使用全局变量:这种方法最方便,但此方法打
C语言自定义函数如何返回数组(下) C语言自定义函数如何返回数组(下) 通过上一篇的讲解,相信大家已经明白直接的return数组的问题以及原因了,今天我们将详细为大家讲解在函数中返回数组的常见办法。此类问题,应用场景往往为了解决函数间相互通信,比如某个函数内处理的完的结果数据需要交接给另一个函数的情况,那么一般来说,总结有以下三种: 直接使用全局变量:这种方法最方便,但此方法打
C语言自定义函数如何返回数组(上) C语言自定义函数如何返回数组(上) 最近看到一些同学问题,有提到说:如何在一个函数中返回数组呢?能否直接在自定义函数中,写成char*类型返回值,直接返回呢?,代码如下: 直接返回str数组名(注意不需要加&,还有好多同学犯这个错)但事实上,运行结果并非正常,我们尝试在调用函数中输出,可以看到结果并非是原来内容(当然你的电脑输出可能还不
C语言中左值和右值的区别 C语言中左值和右值的区别 在C语言学习过程中,大家或许听到过左值和右值的概念,甚至在调试程序时编译器也会给出”leftoperandmustbel-value”即左操作数必须为左值!,今天我们将为大家详细解释这两个词,以及两者的区别! 简单而言,在赋值运算符“=”左边的就是左值,在赋值运算符“=&r
2023-09-13 13:02:53
2023-09-21 21:18:47
2023-06-26 19:36:09
2023-07-16 10:35:19
2023-07-16 10:26:24
2023-06-26 23:28:31