PE学习前的一些小知识
位移运算
1、与运算 &
2、或运算 |
3、非运算 ~
4、异或运算 ^
5、移位运算 << >>
内存分配,文件读写
宏定义说明
一、无参数的宏定义的一般形式为:# define 标识符 字符序列
如:# define TRUE 1
# define PI 3.1415926
注意事项:
1、只作字符序列的替换工作,不作任何语法的检查
2、如果宏定义不当,错误要到预处理之后的编译阶段才能发现
二、带参数宏定义:#define 标识符(参数表)字符序列
# define MAX(A,B) ((A) > (B)?(A):(B))
代码 x= MAX( p, q)将被替换成 y=((p) >(q)?(p):(q)
注意:
1、宏名标识符与左圆括号之间不允许有空白符,应紧接在一起.
2、宏与函数的区别:函数分配额外的堆栈空间,而宏只是替换.
3、为了避免出错,宏定义中给形参加上括号.
4、末尾不需要分号.
头文件
#include "stdafx.h"
其实就是包含了其他程序写的代码,自己可以调用
在内存分配中,我们可能不知道自己到底需要多大的空间,这时需要用到malloc
而使用malloc,是在堆里面分配的,堆是需要使用结束后自己告诉系统,这块空间我不用了
PE文件的两种状态
一种是在硬盘里的,没有运行
一种是已经运行起来,内存里已经有了
硬盘对齐,内存对齐
以前技术不足,为了节省硬盘空间,使数据存储在硬盘中的时候,节与节之间的间隙比较小,而当把数据放入内存的时候,间隙又恢复了,所以有些程序:硬盘对齐:200h 内存对齐:1000h
但有些程序是现在开发的,技术比较好,硬盘内存对齐都是1000h
但是为什么要有分节呢,因为考虑到多开的概念
就相当于QQ开多个小号,每一个QQ都有一些相同的部分,只可读不可写,当我们使用小号时,就可以不改变这一部分,而只需要重新在内存里创建自己可以操控的可读可写部分
联合体
union Student
{
int x;
int y;
};
这样Student作为类型名
union
{
int x;
int y;
} Student ;
这样Student直接作为变量,类型是匿名的
比如我们要存储学号和身份证号,但我们存一个就可以了,就可以用联合体