主页
文章
分类
系列
标签
简历
【从汇编的视角重学C++ 01】基本数据类型的表现形式
发布于: 2021-11-1   更新于: 2021-11-1   收录于: Cpp
文章字数: 280   阅读时间: 2 分钟   阅读量:

整数类型

浮点数类型

字符和字符串

地址、指针和引用

常量

变量

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
int c = 10;
void func(int a )
{
    int b = ++a;
    c++;
}
int main()
{   
    {    
        int b = 100;
        func(b);
        c--;
    }
    
    {
        int b = 200;
        func(b);
        c+=3;
    }

    return 0;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
c:
.long   10  # 定义一个变量c为10,.long是定义长整型变量的指令

func(int):
push    ebp  # 将ebp寄存器的值保存到栈中
mov     ebp, esp  # 将esp寄存器的值赋给ebp,相当于保存了当前函数的栈指针
sub     esp, 16  # 在栈上为局部变量和函数参数分配16字节的空间,esp寄存器指向新的栈顶位置
add     DWORD PTR [ebp+8], 1  # 取出调用函数时压入栈中的第一个参数,并将其加1
mov     eax, DWORD PTR [ebp+8]  # 将参数赋值给eax寄存器
mov     DWORD PTR [ebp-4], eax  # 将eax的值传递给局部变量[ebp-4]
mov     eax, DWORD PTR c  # 将变量c的值赋给eax寄存器
add     eax, 1  # 将eax的值加1
mov     DWORD PTR c, eax  # 将eax的值赋给变量c
nop  # 空指令
leave  # 恢复栈指针
ret  # 返回函数结果

main:
push    ebp  # 将ebp寄存器的值保存到栈中
mov     ebp, esp  # 将esp寄存器的值赋给ebp,相当于保存了当前函数的栈指针
sub     esp, 16  # 在栈上为局部变量和函数参数分配16字节的空间,esp寄存器指向新的栈顶位置
mov     DWORD PTR [ebp-4], 100  # 将100赋值给局部变量[ebp-4]
push    DWORD PTR [ebp-4]  # 将[ebp-4]的值压入栈中,作为函数调用的参数
call    func(int)  # 调用函数func
add     esp, 4  # 释放栈空间
mov     eax, DWORD PTR c  # 将变量c的值赋给eax寄存器
sub     eax, 1  # 将eax的值减1
mov     DWORD PTR c, eax  # 将eax的值赋给变量c
mov     DWORD PTR [ebp-8], 200  # 将200赋值给局部变量[ebp-8]
push    DWORD PTR [ebp-8]  # 将[ebp-8]的值压入栈中,作为函数调用的参数
call    func(int)  # 调用函数func
add     esp, 4  # 释放栈空间
mov     eax, DWORD PTR c  # 将变量c的值赋给eax寄存器
add     eax, 3  # 将eax的值加3
mov     DWORD PTR c, eax  # 将eax的值赋给变量c
mov     eax, 0  # 将eax寄存器清零
leave  # 恢复栈指针
ret  # 返回函数结果