9159金沙游艺场-奥门金沙游艺场-[欢迎您]

9159金沙游艺场为您呈现最新的面貌!,目前注册送体验金,欢迎您将成为影视娱乐行业新的风向标,是亚洲的优质娱乐先锋。

汇编方式简析

日期:2020-01-04编辑作者:服务器

C程序汇编运维形式简析,汇编形式简析

SJTUBEA揽胜 原创作品转发请表明出处 /《Linux内核分析》MOOC课程

 

1. 汇编

        在修习LINUX内核那门课的上马阶段,首先需求调节的就是汇编以至汇编制程序序对于货仓的操作。

        下边大家就来深入分析一下多少个简短地C程序是怎么被汇编程序所公布的!

2. 获得汇编代码

        首先,大家写多少个轻易地C程序,命名称叫exp1.c:

 1 #include <stdio.h>
 2 
 3 int g(int x)
 4 {
 5     return x+3;
 6 }
 7 
 8 int f(x)
 9 {
10     return g(x);
11 }
12 
13 int main()
14 {
15     return f(8)+1;    
16 }

      程序非常的简便,我们当时再经过编写翻译指令将其编写翻译为汇编制程序序:

1 gcc –S –o main.s main.c -m32

      那样我们就得到了这几个大致C程序的汇编代码:

 1     .file    "exp1.c"
 2     .text
 3     .globl    g
 4     .type    g, @function
 5 g:
 6 .LFB0:
 7     .cfi_startproc
 8     pushl    %ebp
 9     .cfi_def_cfa_offset 8
10     .cfi_offset 5, -8
11     movl    %esp, %ebp
12     .cfi_def_cfa_register 5
13     movl    8(%ebp), %eax
14     addl    $3, %eax
15     popl    %ebp
16     .cfi_def_cfa 4, 4
17     .cfi_restore 5
18     ret
19     .cfi_endproc
20 .LFE0:
21     .size    g, .-g
22     .globl    f
23     .type    f, @function
24 f:
25 .LFB1:
26     .cfi_startproc
27     pushl    %ebp
28     .cfi_def_cfa_offset 8
29     .cfi_offset 5, -8
30     movl    %esp, %ebp
31     .cfi_def_cfa_register 5
32     subl    $4, %esp
33     movl    8(%ebp), %eax
34     movl    %eax, (%esp)
35     call    g
36     leave
37     .cfi_restore 5
38     .cfi_def_cfa 4, 4
39     ret
40     .cfi_endproc
41 .LFE1:
42     .size    f, .-f
43     .globl    main
44     .type    main, @function
45 main:
46 .LFB2:
47     .cfi_startproc
48     pushl    %ebp
49     .cfi_def_cfa_offset 8
50     .cfi_offset 5, -8
51     movl    %esp, %ebp
52     .cfi_def_cfa_register 5
53     subl    $4, %esp
54     movl    $8, (%esp)
55     call    f
56     addl    $1, %eax
57     leave
58     .cfi_restore 5
59     .cfi_def_cfa 4, 4
60     ret
61     .cfi_endproc
62 .LFE2:
63     .size    main, .-main
64     .ident    "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
65     .section    .note.GNU-stack,"",@progbits

3.汇编代码剖判

    汇编出的代码,多了数不清帮手音讯,为了能够越来越好地看清主干,大家删减一下:

 1 g:
 2     pushl    %ebp            //保存现场,将父函数的栈底寄存器存入当前程序栈中
 3     movl    %esp, %ebp      //构建当前函数堆栈
 4     movl    8(%ebp), %eax   //从父函数堆栈中取得参数,存入ax寄存器
 5     addl    $3, %eax        //完成+3操作
 6     popl    %ebp            //恢复原父函数堆栈
 7     ret                     //pop出原EIP地址,恢复执行
 8 f:
 9     pushl    %ebp            //保存现场,将父函数的栈底寄存器存入当前程序栈中
10     movl    %esp, %ebp      //构建当前函数堆栈
11     subl    $4, %esp        //栈顶加一,用以储存变量传递给g函数
12     movl    8(%ebp), %eax   //取得参数
13     movl    %eax, (%esp)    //将参数传入变量位置
14     call    g               //调用g
15     leave                   //清楚局部变量空间
16     ret                     //返回
17 main:
18     pushl    %ebp
19     movl    %esp, %ebp
20     subl    $4, %esp        //空出局部变量空间
21     movl    $8, (%esp)      //为变量赋值
22     call    f               //调用f
23     addl    $1, %eax        //完成+1操作
24     leave                   //清理局部变量
25     ret                     //返回

我们对f函数实行详尽的分析:

 1. 先是举办enter指令:

      那时候,ebp当前所指向的职务存入栈顶,并且将ebp重定向指向esp:

     图片 1

    2.栈顶加风流洒脱并存入变量值:

        图片 2 

    3.调用g

  图片 3

    4.从g再次回到后,再次回到值积存在AX寄放器中,不用操作,调用leave,清理变量

    图片 4

  5.最终ret,同有时间EIP被读出复苏到原来的地点置继续实施,重回值在AX中传送给调用函数

       图片 5

3.私家的少数清醒:

     程序的调用正是那样嵌套的执行下去,每种函数皆有和煦的库房用以积攒当前变量以致情形值,并由此将父函数的EBP放入栈底用以苏醒蒙受。

     同不常候EIP存入父栈栈顶,便于恢复生机到原节点处继续实施。

     那样,就足以有规律的直接嵌套下去。

     假若接受递归函数,正是一个码仓库的长河,知道最顶上部分的库房再次来到,函数好似多米诺骨牌相近收回全体的货仓。

     那也是递归函数占用空间比较多的原故之生龙活虎。若无很好地淡出机制,有希望内部存款和储蓄器溢出。

SJTUBEA揽胜极光原创文章转载请注解出处 /《Linux内核解析》MOOC课程 1...

本文由9159金沙游艺场-奥门金沙游艺场-[欢迎您]发布于服务器,转载请注明出处:汇编方式简析

关键词:

python学习笔记

python学习笔记九:正则表达式,python学习笔记 本文不涉及正则表达式本身的内容,只记一下python中正则的用法及常用...

详细>>

Python二维码生成库qrcode安装和使用示例

Python二维码生成库qrcode安装和使用示例,pythonqrcode示例 二维码简称 QR Code(Quick ResponseCode),学名为快速响应矩阵码...

详细>>

python除去html标签

python除去html标签 使用python自带的HTMLParser 实现。 #!/usr/bin/env python# -*- coding: utf-8 -*-import urllib2,reimport time,sysfrom HTMLP...

详细>>

CSS 百分比 margin &amp;amp; padding,css百分比margin

CSS 百分比 margin & padding,css百分比margin 前段时间我同事对于margin和padding应用百分比值似乎有些误解,觉得可能是个普...

详细>>