第七课 堆栈图
1.函数
函数的入口
汇编中的函数
函数有入口出口,但不一定有返回值和参数
2、堆栈
第八课 c语言
分析这段代码的反编译
有时候跟反汇编不一定要进函数看,有时候从上下文就能大概猜出函数的作用
第九课 c语言2
1、什么是裸函数
可以看到plus1()函数是可以正常运行且就算是空函数也会有开栈等操作
下图可以看到裸函数plus里面是一堆int 3(断点)
这时候如果我们自己在裸函数里面写上ret,程序就能正常运行
总结:
普通函数编译器会自动帮我们操作一些堆栈,但是裸函数什么都没有,全需要我们自己写
2、调用约定
前言
这是正常调用函数的四句汇编,可以看到正常都是两个参数从右到左入栈,调用约定就是约定这些东西
常见的三个调用约定:
__cdecl():一般c++默认的调用约定;从右至左入栈,采用外平栈
__stdcall():一般windows api默认的调用约定;从右至左入栈,采用内平栈
__fastcall():从右至左入栈,剩下前两个使用edx和ecx;如果只有两个参数,都是使用mov,则不用平衡堆栈,但是还是使用的内平栈
总结:
1、fastcall运行较快
2、看堆栈平衡的代码(ret 8)去 判断函数有几个参数不一定准确,可能调用约定不一样,或者fastcall他有两个参数是mov,和堆栈没关系
3、函数入口点
真正的函数起始的地方是mainCRTStartup()
不可被替换,他帮我们做了很多初始化操作
4、数据类型
整数类型
总结:
1、其实内存中有无符号存储到内存里面都是一样的
2、在运算中需要注意
3、有符号数在计算时汇编指令就会使用有符号的比较指令,无符号的就会使用无符号的指令,一切都是写程序的人决定的,
浮点类型
作业
2、
3、