gpt4 book ai didi

c - 帮助破译简单的汇编代码

转载 作者:太空宇宙 更新时间:2023-11-04 05:31:31 24 4
gpt4 key购买 nike

我正在使用 GDB 和 Eclipse 学习汇编
这是一个简单的C代码。

int absdiff(int x, int y)
{
if(x < y)
return y-x;
else
return x-y;
}

int main(void) {
int x = 10;
int y = 15;
absdiff(x,y);
return EXIT_SUCCESS;
}

下面是main()对应的汇编指令

          main:
080483bb: push %ebp #push old frame pointer onto the stack
080483bc: mov %esp,%ebp #move the frame pointer down, to the position of stack pointer
080483be: sub $0x18,%esp # ???
25 int x = 10;
080483c1: movl $0xa,-0x4(%ebp) #move the "x(10)" to 4 address below frame pointer (why not push?)
26 int y = 15;
080483c8: movl $0xf,-0x8(%ebp) #move the "y(15)" to 8 address below frame pointer (why not push?)
28 absdiff(x,y);
080483cf: mov -0x8(%ebp),%eax # -0x8(%ebp) == 15 = y, and move it into %eax
080483d2: mov %eax,0x4(%esp) # from this point on, I am confused
080483d6: mov -0x4(%ebp),%eax
080483d9: mov %eax,(%esp)
080483dc: call 0x8048394 <absdiff>
31 return EXIT_SUCCESS;
080483e1: mov $0x0,%eax
32 }

基本上,我要求帮助我理解这段汇编代码,以及它为什么以这种特定顺序执行操作。我被卡住的地方显示在程序集评论中。谢谢!

最佳答案

0x080483cf0x080483d9 行正在从堆栈中的当前帧复制 xy,然后推送它们作为 absdiff() 的参数返回堆栈(这是典型的;参见例如 http://en.wikipedia.org/wiki/X86_calling_conventions#cdecl )。如果您查看 absdiff() 的反汇编程序(从 0x8048394 开始),我打赌您会看到它从堆栈中选取这些值并使用它们。

在这种情况下,这看起来像是在浪费周期,但这可能是因为您在没有优化的情况下进行了编译,所以编译器确实按照您的要求进行了操作。如果你使用例如-O2,您可能会看到大部分代码消失了。

关于c - 帮助破译简单的汇编代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4188670/

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