任何人都可以帮我理解这个汇编代码吗?我对汇编语言完全不熟悉,我只是想不出来......下面的汇编代码应该产生这个函数:
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)
有人可以解释一下如何解决这个问题吗?非常感谢!
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)