gpt4 book ai didi

assembly - 理解和分析汇编代码

转载 作者:行者123 更新时间:2023-12-01 08:45:53 26 4
gpt4 key购买 nike

谁能帮我理解这个汇编代码?我对汇编语言完全陌生,我只是想不通......下面的汇编代码应该产生这个函数:

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

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

最佳答案

pushl %ebp                   // a is pushed on stack
movl %esp,%ebp // a = stackpointer

如评论中所述,ebpa 无关。 ebp 是堆栈基指针 -- 这段代码将 ebp 的旧值保存到堆栈中,然后将堆栈指针保存在 ebp 中。

movl 8(%ebp),%eax            // eax = M(8 + a).But what is in M(8 + a)?

正确。栈上的是eax的输入值。

sall $4,%eax                 // eax << 4

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

addl 8(%ebp),%eax            // eax = M(8 + a)

不,你误解了这一点。这会将堆栈中 8(ebp) 处的值(即 a 的原始值)添加到 eax。加法应用于值,而不是内存地址。

addl %eax,%eax               // eax = eax + eax

正确。 eax 的值在这里没有被修改,所以这是函数的返回值。

movl %ebp,%esp               // eax = t
popl %ebp // pop a from stack
ret

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

这个函数的重要部分可以概括为:

a1 = a << 4;   // = a * 16
a2 = a1 + a; // = a * 17
a3 = a2 + a2; // = a * 34
return a3;

关于assembly - 理解和分析汇编代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53981965/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com