0

我正在尝试学习一些汇编代码,所以我在一些教程中阅读了汇编代码

int proc(void)
  {
      int x,y;
       scanf("%x %x", &y, &x);
       return x-y;
   }

1   proc:
2     pushl  %ebp
3     movl  %esp, %ebp
4     subl   $40, %esp
5     leal  -4(%ebp), %eax
6     movl  %eax, 8(%esp)
7     leal  -8(%ebp), %eax
8     movl  %eax, 4(%esp)
9     movl  $.LC0, (%esp)
10    call  scanf
 Diagram stack frame at this point
11    movl  -4(%ebp), %eax
12    subl  -8(%ebp), %eax
13    leave
14    ret

如果我很好理解的话,第 5 到第 8 行的指令存储了一些地址,这些地址将用于存储scanf' 输入的值。那么是否可以说scanf系统地使用地址%esp加上一定数量的字节(取决于sizeof输入)来获取将存储数据的地址?

4

2 回答 2

1

这里发生的是构建了一个堆栈框架来将参数传递给scanf. subl用于为新的堆栈帧分配空间,并movl与堆栈指针的偏移量一起使用%esp,以在新分配的堆栈帧上写入参数的值。

可以在此处找到有关 x86 调用约定和 cdecl 的更全面的解释。了解堆栈帧的高级结构和 cdecl 约定将帮助您理解此代码片段的意图。

于 2013-06-11T09:22:19.463 回答
0

scanfis的调用约定cdecl。它将其参数传递给指向的堆栈esp

于 2013-06-11T09:07:03.737 回答