C++反汇编与逆向分析之数据类型的基本表现学习笔记

float GetFloat()
{
	return 12.25f;
}

void Add(int &nVar)
{
	nVar++;	
}
int main(int argc, char* argv[])
{
	// 在未使用到浮点数的情况下
	// VC++ 6.0中输入小数会报错,即没有对浮点寄存器初始化
	// 解决办法是在任意位置声明一个浮点类型的变量对浮点寄存器初始化即可
	// 	int nInt = 0;
	// 	scanf("%f",nInt);
	
	// 在VC6中,遵循C调用约定,以小端方式存储,&fFloat = 0x0012ff7c
	// &fFloat 在内存中存储为 414400,转为2进制为:0100 0001 0100 0100 0000 0000 共32位
	// float 遵循IEEE编码方式 0~22 共23位存储尾数 23~30 8位存储指数部分 第31位最高有效位为符号位
	// IEEE 规定127 即 01111111 为0
	

	//	float fFloat = 12.25f;

	// fFloat = 1.3f 内存中为 3f a6 66 66 转为 2进制为 0011 1111 1010 0110 0110 0110 0110 0110 
	// 后面乘不尽
	// fFloat = 1.3f;
	
	// fFloat = 0.0f;
	// C++比较浮点数是否为0时,要做区间比较
	/*
	float fTemp = 0.0001f;
	if (fFloat >= -fTemp && fFloat <= fTemp)
	{
		//fTemp为0
		printf("%f",fFloat);
	}
	*/
	//浮点数与整数的转换
	/*
	int nInt = 4;
	float fFloat = (float)argc;
	printf("%f",fFloat);
	argc = (int)fFloat;
	printf("%d",argc);
	*/

	/*
		00412940   fld         dword ptr [ebp-4]
		00412943   sub         esp,8
		00412946   fstp        qword ptr [esp]
		不能直接利用PUSH压入堆栈传参,浮点寄存器为8字节,而在32位的80386的机器上,PUSH 只能压入4字节的数据
		所以程序将浮点数装载尽ST(0)寄存器,先提高堆栈空间,分配8个字节,然后从ST(0)弹出到ESP栈顶单元进行传
		参
		
	*/
	// float fFloat = GetFloat();
	// printf("%f",fFloat);
	
	// 字符串
	/*
	char *pcChar = "Hello World";
	wchar_t *pwChar = L"Hello World";

	pcChar = "逆向分析";
	pwChar = L"逆向分析";
	*/

	//bool
// 	bool bBool;
// 	if (argc > 0)
// 	{
// 		bBool = true;
// 	}
// 	else
// 	{
// 		bBool = false;
// 	}

	// 地址、指针和引用
	// 对指针取内容
// 	int nVar = 12345678;
// 
// 	int *pnVar = &nVar;
// 	char *pcVar = (char *)&nVar;
// 	short *psnVar = (short *)&nVar;
// 
// 	printf("%08x \r\n",*pnVar);
// 	printf("%08x \r\n",*pcVar);
// 	printf("%08x \r\n",*psnVar);

	// 指针偏移
	// 指针寻址的公式,即 p + n = 首地址 + sizeof(指针类型type) * n;
	// 求数组元素的个数
	// 指针相减必须是两个同类型的指针类型相减,否则没有意义
	// char cVar[5] = {0x01,0x23,0x45,0x67,0x89};

// 	int *pnVar = (int *)cVar;
// 	char *pcVar = (char *)cVar;
// 	short *psnVar = (short *)cVar;
// 	
// 	pnVar += 1;
// 	pcVar += 1;
// 	psnVar += 1;

	// 引用类型
	// 从汇编代码可以看出,引用类型其实等同于指针,在内存中占4个字节的内存空间,保存的是地址
	// 引用类型是对指针的封装,更加安全可靠,不用担心数据被不小心破坏掉导致程序的崩溃
// 	int nVar = 12345678;
// 	int &nVarType = nVar;
// 
// 	Add(nVar);
// 	printf("%d",nVar);
	
	
	// 常量
	// 字符串常量,在内存中直接存放,在程序运行之前就已经存在了的,不可以修改的。
	// 字符串常量的首地址 - 程序的基地址,即为其在文件中(没有加载到内存时)的偏移地址
	// Hello World的字符串常量的便宜地址为 00427018 - 00400000 = 27018 
	// 打开16进制编辑工具可以直接GO到该地址,查看其在可执行文件中所对应的数据
	// 00427018  48 65 6C 6C 6F 20 57 6F 72 6C 64 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  Hello World!................
// 	char *pString = "Hello World!";
// 	printf("%c",*pString);
	
	// 常量有真常量#define 和 假常量 const 在编译过程中由编译器判断的,在内存中仍有内存占用的变量,只是在程序编译的时候
	// 检查在定义之后,是否有修改,如果有,则报错。
	
	// project -> settings -> C/C++ -> project Options 添加 /P选项,将预处理文件生成到.i文件中
	// const int nVar = 1;
	// printf("const = %d #define  = %d \r\n",nVar,1);
	// 可以看到Number_One被1替换了
// 	#define  NUMBER_ONE 1
// 
// 	const int nVar = NUMBER_ONE;
// 	printf("const = %d #define  = %d \r\n",nVar,NUMBER_ONE);

	// Const 常量 其实是可以修改的
	// 当在内存中时,其值被动态修改了。但是为什么输出还是没有变得值呢。因为nConst的值是已知的,如果是未知的话就可以被修改了

	const int nConst = 0;

	int *pConst = (int *)&nConst;
	*pConst = 6;
	
	printf("%d",nConst);
	getchar();
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值