只需要帮助澄清汇编代码和有关我的分析的反馈
所以我从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
.............
.............
EBP
.............
.............
10
.............
.............
.............
.............
ESP
.............
.............
EBP
.............
2
.............
10
.............
.............
.............
.............
ESP
.............
.............
EBP
.............
2 << --- eax
.............
10
.............
.............
.............
.............
ESP
.............
.............
EBP
.............
2 << --- eax
.............
10
.............
.............
.............
2
.............
ESP
.............
.............
EBP
.............
2
.............
10 << --- eax
.............
.............
.............
2
.............
ESP
.............
EBP
.............
2
.............
10 << --- eax
.............
.............
.............
2
.............
10 << --- esp
.............
RET
.............
所以,我的理解是,我们准备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 << ----
.............
所以我们在这里复制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()
函数的作用。
上一篇: Need help in clarifying simply Assembly code and feedback about my analyzis