《老码识途》笔记
《老码识途》读书笔记
fztfztfzt
这个作者很懒,什么都没留下…
展开
-
老码识途 创造面向对象语言(使用C模拟C++)
对象相当于结构体变量,其内存布局和去掉成员函数后的等价结构体完全相同。成员函数的数目不会影响对象的大小。(在内存耗费上优于C语言结构体模拟的对象(每个成员函数必须在结构体上对应一个函数指针变量存储其入口地址)) 调用成员函数时都会悄悄传递对象首地址(ECX),并在成员函数中自动获取该首地址,面向对象语言保证了自己操作自己的数据,与结构体有本质区别 C++中的类是所有对象共享一套函数,通过悄悄传递不同原创 2015-03-24 12:05:19 · 559 阅读 · 0 评论 -
老码识途 私有成员
私有成员只是一块内存而已,拿到地址就照样可以操作(对象public private的保护是在编译时进行的):#include<iostream> using namespace std; class A{ public: int a; void show() { cout<<c<<endl; } private: int c; }; int m原创 2015-03-24 09:41:40 · 610 阅读 · 0 评论 -
老码识途 switch机制
flag稠密时的switch算法: 1:i=flag-n;n=case分支中最小的整数; 2: if i>num jmp default;num=case 分支max-min;即中间数个数-1(无须比较小于是因为当小于是,i<0;存在计算机中为负数,无符号比较会大于num); 3:跳转到address[i]中存储的地址。address是预先准备好的数组,其中存储了对应case分支的起始地址原创 2015-03-24 09:12:52 · 649 阅读 · 0 评论 -
老码识途 数组和结构体
数组下标从0开始的优势:少计算一次减法,数=首地址+偏移元素大小;否则数=首地址+(偏移-1)元素大小; 结构体对齐规律: 首先选定一个盒子,然后一次将字段往盒子里放,当盒子放不下后,又用下一个盒子放,直至所有字段存放完毕; 其中,盒子大小=min(max(sizeof(成员变量)),对齐长度); 其中的对齐长度在编译器的代码生成中设定,在C\c++–>代码生成–>结构成员对齐中,也可以使用原创 2015-03-24 09:03:13 · 398 阅读 · 0 评论 -
老码识途 函数指针
调用函数需要函数的参数表,返回类型,调用惯例 这三点合在一起就是函数原型; 一个函数指针包含函数的入口地址和函数原型两个方面; 例如 int add(int a,int b) 定义一个函数指针:int (* P) (int ,int);(调用惯例默认是c方式,若不是则要标出,如int (_stdcall* P) (int ,int)); 使用时:P=add 或 p=&add; C语言指针类型原创 2015-03-24 08:56:05 · 436 阅读 · 0 评论 -
老码识途 汇编分析函数调用和局部变量
1.在vc或vs下,编译时可调出各种视图窗口:反汇编,寄存器,内存(可修改值)等等。。。 2.windows下采用小端方式存储数据,数据的地存放在地址的低位(数据12345678放在【78 56 34 12】中(地址前面是低位)) 3.esp是栈指针,push一次减4,EIP指向要执行的代码;对于call指令 (相当于push 返回地址 jmp 函数入口)call先到存放函数入口地址处,在执行j原创 2015-03-23 19:53:31 · 429 阅读 · 0 评论