使用 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"

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

 

相关文章
|
8月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
196 5
|
8月前
|
C语言
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性。本文探讨了C语言中的错误类型(如语法错误、运行时错误)、基本处理方法(如返回值、全局变量、自定义异常处理)、常见策略(如检查返回值、设置标志位、记录错误信息)及错误处理函数(如perror、strerror)。强调了不忽略错误、保持处理一致性及避免过度处理的重要性,并通过文件操作和网络编程实例展示了错误处理的应用。
239 4
|
8月前
|
网络协议 物联网 数据处理
C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势
本文探讨了C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势。文章详细讲解了使用C语言实现网络通信程序的基本步骤,包括TCP和UDP通信程序的实现,并讨论了关键技术、优化方法及未来发展趋势,旨在帮助读者掌握C语言在网络通信中的应用技巧。
180 2
|
8月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
200 1
|
8月前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
171 1
|
9月前
|
存储 文件存储 C语言
深入C语言:文件操作实现局外影响程序
深入C语言:文件操作实现局外影响程序
|
9月前
|
Linux C语言 iOS开发
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
189 0
|
10天前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
187 15
|
6月前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
322 23
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问