理解和分析汇编代码

sca*_*ula 3 x86 assembly

任何人都可以帮我理解这个汇编代码吗?我对汇编语言完全不熟悉,我只是想不出来......下面的汇编代码应该产生这个函数:

func(int a){return a*34}

评论//我的想法应该是什么意思,如果我错了,请纠正我

//esp = stack-pointer, ebp = callee saved, eax = return value

pushl %ebp                   // a is pushed on stack
movl %esp,%ebp               // a = stackpointer
movl 8(%ebp),%eax            // eax = M(8 + a).But what is in M(8 + a)?
sall $4,%eax                 // eax << 4
addl 8(%ebp),%eax            // eax = M(8 + a)
addl %eax,%eax               // eax = eax + eax
movl %ebp,%esp               // eax = t
popl %ebp                    // pop a from stack
ret
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下如何解决这个问题吗?非常感谢!

dus*_*uff 7

pushl %ebp                   // a is pushed on stack
movl %esp,%ebp               // a = stackpointer
Run Code Online (Sandbox Code Playgroud)

如评论中所述,ebp与此无关a.ebp堆栈基指针 - 此代码将旧值保存ebp到堆栈,然后将堆栈指针保存在堆栈中ebp.

movl 8(%ebp),%eax            // eax = M(8 + a).But what is in M(8 + a)?
Run Code Online (Sandbox Code Playgroud)

正确.堆栈上的内容是输入值eax.

sall $4,%eax                 // eax << 4
Run Code Online (Sandbox Code Playgroud)

正确.(并将结果分配回去eax.)

addl 8(%ebp),%eax            // eax = M(8 + a)
Run Code Online (Sandbox Code Playgroud)

不,你误解了这一点.这增加了栈在对价值8(ebp)-这是原值a-到eax.添加应用于值,而不是内存地址.

addl %eax,%eax               // eax = eax + eax
Run Code Online (Sandbox Code Playgroud)

正确.eax此处的值不会被修改,因此这是函数的返回值.

movl %ebp,%esp               // eax = t
popl %ebp                    // pop a from stack
ret
Run Code Online (Sandbox Code Playgroud)

此代码反转前两个指令的效果.这是一个标准的清理序列,与之无关a.

该功能的重要部分可以掩盖为:

a1 = a << 4;   // = a * 16
a2 = a1 + a;   // = a * 17
a3 = a2 + a2;  // = a * 34
return a3;
Run Code Online (Sandbox Code Playgroud)