【发布时间】:2010-11-19 18:39:54
【问题描述】:
我试图理解一些汇编代码,并设法完成了大部分代码,除了几行。我能够理解内部发生的大部分事情,但无法完全理解在代码的开头和结尾发生了什么(以及为什么会发生)。有人可以对此有所了解吗?
int main() {
int a, b;
a = 12;
b = 20;
b = a + 123;
return 0;
}
拆机版:
8048394:8d 4c 24 04 lea 0x4(%esp),%ecx ; ??
8048398:83 e4 f0 and $0xfffffff0,%esp ; ??
804839b:ff 71 fc pushl -0x4(%ecx) ; ??
804839e:55 push %ebp ; Store the Base pointer
804839f:89 e5 mov %esp,%ebp ; Initialize the Base pointer with the stack pointer
80483a1:51 push %ecx ; ??
80483a2:83 ec 4c sub $0x4c,%esp ; ??
80483a5:c7 45 f8 0c 00 00 00 movl $0xc,-0x8(%ebp) ; Move 12 into -0x8(%ebp)
80483ac:c7 45 f4 14 00 00 00 movl $0x14,-0xc(%ebp) ; Move 20 into -0xc(%ebp)
80483b3:8b 45 f8 mov -0x8(%ebp),%eax ; Move 12@-0x8(%ebp) into eax
80483b6:83 c0 7b add $0x7b,%eax ; Add 123 to 12@eax
80483b9:89 45 f4 mov %eax,-0xc(%ebp) ; Store the result into b@-0xc(%ebp)
80483bc:b8 00 00 00 00 mov $0x0,%eax ; Move 0 into eax
80483c1:83 c4 10 add $0x10,%esp ; ??
80483c4:59 pop %ecx ; ??
80483c5:5d pop %ebp ; ??
80483c6:8d 61 fc lea -0x4(%ecx),%esp ; ??
【问题讨论】:
-
您可能会发现画出堆栈上的位置很有帮助...
-
只为 cmets 中的操作码编写英文名称对您没有多大帮助。尝试使它们更“高级”。而且,如果您真的想从反汇编中学习一些东西,请尝试使用人工代码,而不是编译器。
-
通常开头和结尾的内容是通用堆栈设置代码。分配和对齐等。
-
也许您应该在启用优化的情况下进行编译,这样很多不必要的/无法解释的东西可能会消失。
-
恕我直言,汇编代码无法运行(因为奇怪的
%esp算法)。在指令@0x80483c1之后,随后的两个pops 和(缺失?)ret分别处理not%ecx、%ebp、<returnaddress>的值。我尝试自己组装代码,确实引发了分段错误......