使用 gcc 命令把C语言程序反汇编

简介: 之前看过一点汇编,不过现在都忘记得差不多了。最近又很蛋疼地想起反汇编这个东西。这里使用 gcc 命令对 .c 文件进行反汇编,把 C语言 翻译成汇编语言 先准备一个简单的 C 程序 sum.c #include int add(int, int); int mode(int, i...

之前看过一点汇编,不过现在都忘记得差不多了。最近又很蛋疼地想起反汇编这个东西。这里使用 gcc 命令对 .c 文件进行反汇编,把 C语言 翻译成汇编语言

先准备一个简单的 C 程序

sum.c

#include <stdio.h>

int add(int, int);
int mode(int, int);

int main()
{
    int a = 3, b = 2;
    int s = add(3, 2);
    int m = mode(3, 2);
    return 0;    
}

int add(int a, int b)
{
    return a + b;
}

int mode(int a, int b)
{
    return a % b;
}

在控制台中先进到 保存 sum.c 的文件夹下,当然你也可以用绝对路径,使用以下命令

gcc -S sum.c -o sum_at.s

这个命令默认生成的是 AT&T 汇编,生成的 sum_at.s 如下

    .file    "sum.c"
    .text
    .def    ___main;    .scl    2;    .type    32;    .endef
    .globl    _main
    .def    _main;    .scl    2;    .type    32;    .endef
_main:
LFB13:
    .cfi_startproc
    pushl    %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    andl    $-16, %esp
    subl    $32, %esp
    call    ___main
    movl    $3, 28(%esp)
    movl    $2, 24(%esp)
    movl    $2, 4(%esp)
    movl    $3, (%esp)
    call    _add
    movl    %eax, 20(%esp)
    movl    $2, 4(%esp)
    movl    $3, (%esp)
    call    _mode
    movl    %eax, 16(%esp)
    movl    $0, %eax
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
LFE13:
    .globl    _add
    .def    _add;    .scl    2;    .type    32;    .endef
_add:
LFB14:
    .cfi_startproc
    pushl    %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    movl    8(%ebp), %edx
    movl    12(%ebp), %eax
    addl    %edx, %eax
    popl    %ebp
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
LFE14:
    .globl    _mode
    .def    _mode;    .scl    2;    .type    32;    .endef
_mode:
LFB15:
    .cfi_startproc
    pushl    %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    movl    8(%ebp), %eax
    cltd
    idivl    12(%ebp)
    movl    %edx, %eax
    popl    %ebp
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
LFE15:
    .ident    "GCC: (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 7.3.0"

 

我之前看的是intel汇编 也就是8086这种 intel 芯片,要转成 intel 汇编 使用以下命令

gcc -S -masm=intel sum.c -o sum_intel.s

生成的 sum_intel.s 文件内容如下

    .file    "sum.c"
    .intel_syntax noprefix
    .text
    .def    ___main;    .scl    2;    .type    32;    .endef
    .globl    _main
    .def    _main;    .scl    2;    .type    32;    .endef
_main:
LFB13:
    .cfi_startproc
    push    ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    mov    ebp, esp
    .cfi_def_cfa_register 5
    and    esp, -16
    sub    esp, 32
    call    ___main
    mov    DWORD PTR [esp+28], 3
    mov    DWORD PTR [esp+24], 2
    mov    DWORD PTR [esp+4], 2
    mov    DWORD PTR [esp], 3
    call    _add
    mov    DWORD PTR [esp+20], eax
    mov    DWORD PTR [esp+4], 2
    mov    DWORD PTR [esp], 3
    call    _mode
    mov    DWORD PTR [esp+16], eax
    mov    eax, 0
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
LFE13:
    .globl    _add
    .def    _add;    .scl    2;    .type    32;    .endef
_add:
LFB14:
    .cfi_startproc
    push    ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    mov    ebp, esp
    .cfi_def_cfa_register 5
    mov    edx, DWORD PTR [ebp+8]
    mov    eax, DWORD PTR [ebp+12]
    add    eax, edx
    pop    ebp
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
LFE14:
    .globl    _mode
    .def    _mode;    .scl    2;    .type    32;    .endef
_mode:
LFB15:
    .cfi_startproc
    push    ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    mov    ebp, esp
    .cfi_def_cfa_register 5
    mov    eax, DWORD PTR [ebp+8]
    cdq
    idiv    DWORD PTR [ebp+12]
    mov    eax, edx
    pop    ebp
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
LFE15:
    .ident    "GCC: (i686-posix-dwarf-rev0, Built by MinGW-W64 project) 7.3.0"

等我复习下汇编再回来看这段代码到底干了什么

 

相关文章
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
78 5
|
2月前
|
C语言
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性。本文探讨了C语言中的错误类型(如语法错误、运行时错误)、基本处理方法(如返回值、全局变量、自定义异常处理)、常见策略(如检查返回值、设置标志位、记录错误信息)及错误处理函数(如perror、strerror)。强调了不忽略错误、保持处理一致性及避免过度处理的重要性,并通过文件操作和网络编程实例展示了错误处理的应用。
79 4
|
2月前
|
NoSQL 编译器 C语言
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。高级技巧包括内存检查、性能分析和符号调试。通过实践案例学习如何有效定位和解决问题,同时注意保持耐心、合理利用工具、记录过程并避免过度调试,以提高编程能力和开发效率。
56 1
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
71 1
|
2月前
|
网络协议 物联网 数据处理
C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势
本文探讨了C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势。文章详细讲解了使用C语言实现网络通信程序的基本步骤,包括TCP和UDP通信程序的实现,并讨论了关键技术、优化方法及未来发展趋势,旨在帮助读者掌握C语言在网络通信中的应用技巧。
58 2
|
2月前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
47 1
|
3月前
|
存储 文件存储 C语言
深入C语言:文件操作实现局外影响程序
深入C语言:文件操作实现局外影响程序
|
8月前
|
存储 Unix 编译器
汇编语言----X86汇编指令
汇编语言----X86汇编指令
322 2
|
3月前
|
存储 移动开发 C语言
【ARM汇编速成】零基础入门汇编语言之指令集(三)
【ARM汇编速成】零基础入门汇编语言之指令集(三)
|
3月前
|
编译器 C语言 计算机视觉
【ARM汇编速成】零基础入门汇编语言之指令集(二)
【ARM汇编速成】零基础入门汇编语言之指令集(二)
346 0