了解一些汇编代码

时间:2013-06-11 09:01:37

标签: c assembly

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

的汇编代码
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输入)来获取数据的地址是正确的。存储?

2 个答案:

答案 0 :(得分:1)

这里发生的是构建堆栈帧以将参数传递给scanfsubl用于为新堆栈帧分配空间,movl用于堆栈指针%esp的偏移量,以便为新分配的堆栈帧上的参数写入值。

可以找到关于x86调用约定和特别是cdecl的更全面的解释here。理解堆栈框架的高级结构和cdecl约定将有助于您理解此代码段的意图。

答案 1 :(得分:0)

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