滴水逆向三期笔记和作业-c语言总结3

第十五课 c语言8 switch语句

初步测试感觉switch在反汇编的语句和if语句的唯一差别就是jcc语句比较集中

当分支大于四条时,switch的反汇编开始变

3为switch传入的值,1是case最小值,4是case最大值减1,算出偏移量后通过偏移量*4加上基址就可以在大表中获取要输出的case语句的地址

当现在case的值不连续,空掉一个202时,大表的第二个地址会用default填充,如果case从201到209,我们删掉中间三四个值,他还是会用default填充

如果是删剩201,207,208,209,那么switch反汇编又会开始不一样,会生成一张大表和小表,从小表查出偏移量,再去*4加上基址得出case想要输出的语句的地址,小表有00,01,02,03,04对应着大表五个地址,分别是201,209,210,211和default的输出语句,和只有一张大表直接用default填充的方法相比,这个只需用一个字节04这个偏移量来填充,而04偏移量指向的就是default的地址,更省空间

总结 

4、分支少于4时,用switch没有意义,因为编译器会生成类似if...else之类的反汇编.

5、case后面的常量可以是无序的,并不响大表的生成

6、所以switch语句的case最好是相近连续的,他可以生成大表,比if...else语句效率更高

7、抹去一两项会直接在大表用default语句的地址填充

8、抹去多项时,会生成一个小表代替大表填充default的地方

9、会使用类似if..else反汇编

第十六课 c语言9指针1

1.声明

在之前学习的任何类型都可以加上数个*,就变成了一种新的类型,叫做指针。

总结:

2.宽度

和局部变量不一样,虽然都是占12个字节,但是真正使用时不管char,short还是int或者结构体类型也都还是4个字节

3.赋值

完整写法赋值

总结:

4.+-常数

我们暂时先理解加*号这种类型的++--的运算是不一样的,不是直接加1,而是加上自身减去一个*的宽度,比如char**减去一个*号为char*,char*宽度为4个字节,所以char*的++应该是+4

+5和++同理,相当于五个++

总结 :

5.求差值

还是同理,砍星后根据宽度去除

而且求差值还得相同类型才可以相加减

两个char*相减得出的结果是一个int类型,不能用char*接收

总结:

6.比较

总结:

作业

1、1,4,4

2、40

第十七课 c语言10 指针2

1.类型转换

基本数据类型之间可以直接赋值或者强转

基本数据类型和其他类型之间则无法直接赋值或者强转

指针之间可以强转但是不会自动转换直接赋值

一级指针二级指针之间也没办法自动转换直接赋值,但是可以强转

2.&地址符

&可以去变量的地址,我们现在取完放在char y变量,发现报错了char*不能转为char类型,得知&取地址后是char*类型

char***类型的变量x取地址后是char****类型

&取地址符反汇编

 

3.*取值符

*的类型

*反编译

从这个例子已经可以看出上节课指针类型运算为什么不同了

作业

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值