Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly EBP、ESP和组件中的堆栈框架_Assembly_X86_Nasm_Calling Convention_Stack Frame - Fatal编程技术网

Assembly EBP、ESP和组件中的堆栈框架

Assembly EBP、ESP和组件中的堆栈框架,assembly,x86,nasm,calling-convention,stack-frame,Assembly,X86,Nasm,Calling Convention,Stack Frame,在下面的代码中,我有一些关于EBP、ESP和堆栈框架的问题 为什么我们要从esp中减去28?我们主要有两个局部变量x和y。那我们为什么不减去8呢 我们不是把值从右(或上)到左(或下)堆叠吗?那么为什么我们要在[eax+8]中添加1而不是[eax+4] 堆栈指针减去28,因为两个局部变量需要8个字节,func的参数需要12个字节。额外的8个字节可能是由于编译器试图将main的堆栈与16个字节的边界对齐(堆栈上已经有4个字节用于main的返回地址,当按下EBP以在main的第一条指令中建立堆

在下面的代码中,我有一些关于EBP、ESP和堆栈框架的问题

  • 为什么我们要从esp中减去28?我们主要有两个局部变量x和y。那我们为什么不减去8呢

  • 我们不是把值从右(或上)到左(或下)堆叠吗?那么为什么我们要在[eax+8]中添加1而不是[eax+4]


  • 堆栈指针减去28,因为两个局部变量需要8个字节,func的参数需要12个字节。额外的8个字节可能是由于编译器试图将main的堆栈与16个字节的边界对齐(堆栈上已经有4个字节用于main的返回地址,当按下EBP以在main的第一条指令中建立堆栈帧时,还有4个字节)。看看你是否在使用GCC

  • 参数从右向左传递。由于从堆栈指针中减去堆栈空间时,已经为这三个参数分配了堆栈空间,因此1移动到相对于当前堆栈指针(+8)的“最高”位置,2移动到中间(+4),y中的值移动到堆栈指针本身。这与在堆栈上按1、在堆栈上按2,然后在堆栈上按y相同。在最后一条push指令中,ESP的1为+8,ESP的2为+4,ESP的y为+0。请注意,在func内部,必须将8添加到这些偏移量中,因为返回地址是从call指令推送到堆栈上的,func推EBP以建立堆栈帧

  • 对哪种结构感到困惑


  • 很明显,我和我的同事——cpu;)看起来这是用
    gcc-facumulate outing args
    编译的,以避免
    push
    ,而不是保留空间并使用相对于ESP的
    mov
    。没有
    [eax+4]
    [eax+8]
    寻址模式,也没有添加内存目标。如果你想把问题的这一部分编辑成一些有意义的东西,并与给出的答案相匹配,如果你能弄清楚8年前你在想什么,那可能是件好事。(或者如果其他人想要编辑。)
    func(int a, int b, int c)
    {
      return a+b+c;
    }
    main()
    {
     int x, y=3;
     x=func(y,2,1);
    }