只需要帮助澄清汇编代码和有关我的分析的反馈

所以我从C创建汇编代码并尝试了解它是如何工作的。 我需要你的帮助来澄清一些观点,并告诉我是否以正确的方式分析大会工作。

这里是C代码

int mult(int x, int y){
    int result = x * y;
    return result;
}

int main(int argc, char *argv[]){
    int x = 10;
    int y = 2;
    return mult(x, y);
}

这里是生成的Assembly

mult:
.LFB0:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    subl    $16, %esp
    movl    8(%ebp), %eax
    imull   12(%ebp), %eax
    movl    %eax, -4(%ebp)
    movl    -4(%ebp), %eax
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc

main:
.LFB1:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    subl    $24, %esp
    movl    $10, -8(%ebp)
    movl    $2, -4(%ebp)
    movl    -4(%ebp), %eax
    movl    %eax, 4(%esp)
    movl    -8(%ebp), %eax
    movl    %eax, (%esp)
    call    mult
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc

所以我如何理解上面的程序集:1. pushl%ebp - 我们首先推动ebp,它会指向我们主栈的底部2. movl%esp,%ebp - 不完全确定它是什么,但我认为我们只是给esp的地址和ebp 3中的一样。subl $ 24,%esp - 我们给esp 6个块(它是4个字节)的地址。 这意味着esp将具有第6块的地址(这里我不确定是否以正确的方式特别放置)。 我在下面展示了我的堆栈

.............

EBP

.............

.............

.............

.............

.............

.............

ESP

.............

  • movl $ 10,-8(%ebp) - 所以我们从堆栈的底部向第二块放10
  • .............

    EBP

    .............

    .............

    10

    .............

    .............

    .............

    .............

    ESP

    .............

  • movl $ 2,-4(%ebp)我们从堆栈底部的第一个块中放入2
  • .............

    EBP

    .............

    2

    .............

    10

    .............

    .............

    .............

    .............

    ESP

    .............

  • movl -4(%ebp),%eax - 我们把2放入eax中
  • .............

    EBP

    .............

    2 << --- eax

    .............

    10

    .............

    .............

    .............

    .............

    ESP

    .............

  • movl%eax,4(%esp) - 我们把2从eax放到堆栈顶部的第一个块
  • .............

    EBP

    .............

    2 << --- eax

    .............

    10

    .............

    .............

    .............

    2

    .............

    ESP

    .............

  • movl -8(%ebp),%eax - 我们把10放入eax中
  • .............

    EBP

    .............

    2

    .............

    10 << --- eax

    .............

    .............

    .............

    2

    .............

    ESP

    .............

  • movl%eax,(%esp) - 我们将eax中的10放入esp .............
  • EBP

    .............

    2

    .............

    10 << --- eax

    .............

    .............

    .............

    2

    .............

    10 << --- esp

    .............

    RET

    .............

  • 调用mult - 我们称之为mult函数。
  • 所以,我的理解是,我们准备2和10作为参数,将它们移动到栈顶。 然后我们把参数后面的返回地址放在最上面。 所以返回地址之后的下一个块将被多功能的ebp占用。 正确?

    虽然,我不明白为什么我们有2块(意思是-12(%ebp)和-16(%ebp))是空的? 我没有看到Assembly中的任何代码与那些2字节的8字节有关。 为什么然后堆栈的主要分配了24个字节,但不是16个字节? 1. pushl%ebp mult:.............

    2

    .............

    10

    .............

    RET

    .............

    ebp << ----

    .............

  • 不知道.cfi_def_cfa_offset 8 .cfi_offset 5,-8意味着这里......它告诉我们什么? 我也不确定movl%esp,%ebp会做什么。 它将esp地址复制到ebp? 我明白这是基本的堆栈启动。

  • subl $ 16,%esp。 esp的地址是第4块。

  • .............

    2

    .............

    10

    .............

    RET

    .............

    EBP

    .............

    .............

    .............

    .............

    esp << ----

    .............

  • movl 8(%ebp),%eax
  • 所以我们在这里复制10到eax

  • imull 12(%ebp),%eax然后我们采用第二个参数2并将其与10中的eax相乘。

  • movl%eax,-4(%ebp)然后我们将结果从eax移到多功能堆栈中.............

  • 2

    .............

    10

    .............

    RET

    .............

    EBP

    .............

    20 << ----

    .............

    .............

    .............

    ESP

    .............

  • -4(%ebp),%eax然后我们再将它移回eax? 我们为什么要那样做? 不确定这两条指令的目的:

    movl%eax,-4(%ebp)movl -4(%ebp),%eax

  • 他们相互抵消..不是吗?

    对不起,很长的文章。 如果您能澄清我的分析错误,并澄清上述一些令人困惑的问题,我会很感激。


    您在分析的第1步和第2步中取得了进展。

    pushl   %ebp           ;save ebp on the stack.
    ...
    movl    %esp, %ebp     ;point ebp to the stack to access arguments and local variable space.
    ...
    movl    %eax, -4(%ebp) ;move the product to result
    movl    -4(%ebp), %eax ;return result
    

    未优化,但这是mult()函数的作用。

    链接地址: http://www.djcxy.com/p/80345.html

    上一篇: Need help in clarifying simply Assembly code and feedback about my analyzis

    下一篇: Understanding Assembly language output of a C program