【编程经验】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返回。

原文发布于微信公众号 - 编程范(dotcpp)

原文发表时间:2018-03-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏desperate633

HashMap 与 HashTable的对比

而负载因子表示一个散列表的空间的使用程度,有这样一个公式:initailCapacity*loadFactor=HashMap的容量。

9320
来自专栏编程

Python的三个问题

第一,以下程序的执行结果是什么? deffoo(a=[]):a.append(1)printafoo()foo() 第二,以下程序的执行结果是什么? deffo...

18690
来自专栏Objective-C

Swift 基本语法03-"if let"和"guard let"

43740
来自专栏java架构师

【SQL Server】系统学习之三:逻辑查询处理阶段-六段式

一、From阶段 针对连接说明: 1、笛卡尔积 2、on筛选器 插播:unknown=not unknuwn 缺失的值; 筛选器(on where having...

367110
来自专栏Felix的技术分享

KMP子字符串查找算法

26960
来自专栏小灰灰

ForkJoin 学习使用笔记

ForkJoin 学习使用笔记 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结...

320100
来自专栏数据结构与算法

洛谷P3812 【模板】线性基

1 \leq n \leq 50, 0 \leq S_i \leq 2 ^ {50}1≤n≤50,0≤Si​≤250

7420
来自专栏debugeeker的专栏

《coredump问题原理探究》Linux x86版7.7节 set对象

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

11010
来自专栏海纳周报

Python的三个问题

第一,以下程序的执行结果是什么? def foo(a = []): a.append(1) print a foo()foo() 第二,以下...

29570
来自专栏ACM算法日常

UVA11988:悲剧文本(模拟链表)

You’re typing a long text with a broken keyboard. Well it’s not so badly broken....

9510

扫码关注云+社区

领取腾讯云代金券