今天开始进入C语言,汇编枯燥的基础已经讲的差不多了,但远远没有结束,汇编会伴随我们逆向全程,C语言这部分的内容除了加入总的专栏软件逆向工程,还专门创建了个C语言分类,我所写的C语言文章,大多也是从反汇编的角度去理解C语言,今天文章的主要内容是C语言表达式,程序中大部分都是表达式,所以表达式是至关重要的
二.C语言表达式定义:用运算符号链接起来的式子叫做表达式,运算符号包括算术符号 逻辑符号 加减乘除 或 取反 异或 取余 大于等于等.
譬如,a+b;这是表达式,b;这也是表达式,正数+b 前面有个正号 符号省略了
三.表达式举例以及它的反汇编如上面两图,a,b是参数,调用时分别赋值1和2,c是变量,初始值为0.
由此写出:
表达式1: c=a+b*2,它的反汇编如下图所示
关键点:这里主要是通过lea寻址的方式
表达式2:c=(a+b)*2;它的反汇编如下图所示
关键点:这里主要是移位的方式,一般乘法2的倍数就用移位运算
表达式3:c=(a+b)*3;它的反汇编如下图所示
关键点:不是2的倍速就用乘法,编译器默认的是有符号的
表达式4:c=(a+b)*3/2;它的反汇编如下图所示
关键点:除法一定记得符号扩展,这里是cdq,除以2也是移位右移一位
表达式5:c=a+1*4/b;它的反汇编如下图所示
关键点:1*4,直接就赋值4,除法一定记得符号扩展
表达式6: c=a+1*4/b%3;它的反汇编如下图所示
关键点:除法符号扩展,add eax,edx,为啥加edx,余数在edx里
表达式7:c=a+b|3;它的反汇编如下图所示
关键点:加法运算的优先级比逻辑运算高
表达式8:c=a+b|3-a&2;它的反汇编如下图所示
关键点:先算and再算or,And优先级高于or
表达式9:c=a++;c=++a;以及它们的反汇编如下图所示
关键点:由反汇编很明显可以看出一个是先赋值再自加,另一个是先自加再赋值,根本不需要死记硬背,看反汇编秒懂,可以这样说,再骚的操作,看反汇编就搞得懂
今天的文章就到这里了,如果有任何不明白的地方欢迎与我交流,我必定知无不言。这篇文章也花了一定的心血,喜欢的小伙伴可以点赞关注哦。感激不尽!


![[逆向]C语言表达式,通过反汇编去理解C语言 [逆向]C语言表达式,通过反汇编去理解C语言](http://www.mshxw.com/aiimages/31/974937.png)
