重学C第六节:变量

变量是一段有名字的连续存储空间。在源代码中通过定义变量来申请并命名这样的存储空间,并通过变量的名字来使用这段存储空间。 变量是程序中数据的临时存放场所。在代码中可以只使用一个变量,也可以使用多个变量,变量中可以存放单词、数值、日期以及属性。

 

标识符:用来标识对象名字(包括变量、函数、数组、类型等)的有效字符序列。

(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

发现,变量的定义都省了,直接只有结果。

 

原文地址:https://www.cnblogs.com/tk091/p/2483520.html