变量是一段有名字的连续存储空间。在源代码中通过定义变量来申请并命名这样的存储空间,并通过变量的名字来使用这段存储空间。 变量是程序中数据的临时存放场所。在代码中可以只使用一个变量,也可以使用多个变量,变量中可以存放单词、数值、日期以及属性。
标识符:用来标识对象名字(包括变量、函数、数组、类型等)的有效字符序列。
(1)关键字,如int、for、if等。
(2)系统预定义标识符,如sin、main、printf等。
(3)用户标识符,如变量名、函数名、数组名等。
1 #include <stdio.h> 2 3 void main() 4 { 5 //不同的整型 6 int a=10; 7 short int b=20; 8 long c=30; 9 unsigned int d=40; 10 printf("%d",a+b+c+d); 11 }
下面是IDA部分汇编代码:
1 mov [ebp+var_4], 0Ah ;mov [ebp+var_4], 10 2 mov [ebp+var_8], 14h ;mov [ebp+var_8], 20 3 mov [ebp+var_C], 1Eh ;mov [ebp+var_C], 30 4 mov [ebp+var_10], 28h ;mov [ebp+var_10], 40 5 movsx eax, [ebp+var_8] 6 mov ecx, [ebp+var_4] 7 add ecx, eax 8 add ecx, [ebp+var_C] 9 add ecx, [ebp+var_10] 10 push ecx 11 push offset Format ; "%d" 12 call _printf
下面是对应的IDA F5代码:
1 int __cdecl main() 2 { 3 char v1; // [sp+Ch] [bp-50h]@1 4 int v2; // [sp+4Ch] [bp-10h]@1 5 int v3; // [sp+50h] [bp-Ch]@1 6 __int16 v4; // [sp+54h] [bp-8h]@1 7 int v5; // [sp+58h] [bp-4h]@1 8 9 memset(&v1, -858993460, 0x50u); 10 v5 = 10; 11 v4 = 20; 12 v3 = 30; 13 v2 = 40; 14 printf("%d", 100); 15 return _chkesp(); 16 }
修改一下:
1 int __cdecl main() 2 { 3 char v1; 4 int d; 5 int c; 6 __int16 b; 7 int a; 8 9 memset(&v1, -858993460, 0x50u); 10 a = 10; 11 b = 20; 12 c = 30; 13 d = 40; 14 printf("%d", 100); 15 return _chkesp(); 16 }
发现貌似只有short int 发生了变化。
===============================================================================================
下面来看看Release版的情况
1 ; int __cdecl main(int argc, const char **argv, const char **envp) 2 _main proc near 3 push 100 4 push offset unk_407030 5 call sub_401010 6 add esp, 8 7 retn 8 _main endp
发现,变量的定义都省了,直接只有结果。