C 理解一些汇编代码

C 理解一些汇编代码,c,assembly,C,Assembly,我试图学习一些汇编代码,所以我在一些教程中读到 int proc(void) { int x,y; scanf("%x %x", &y, &x); return x-y; } 是 如果我能很好地理解的话,第5行到第8行的指令存储了一些地址,这些地址将用于存储scanf的输入值。所以说scanf系统地使用地址%esp加上一定数量的字节(取决于输入的sizeof大小)来获取存储数据的地址是正确的吗?scanf的调用约定是cdecl。

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

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


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

scanf的调用约定是
cdecl
。它将其参数传递给esp所指向的堆栈,这里发生的事情是建立一个堆栈框架,将参数传递给scanf
subl
用于为新堆栈帧分配空间,
movl
与堆栈指针的偏移量
%esp
一起使用,为新分配的堆栈帧上的参数写入值


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

使用调试符号编译并使用objdump-S,可以使汇编代码与C代码交错。依我的拙见,通过理解细节开始学习汇编代码并不是最有效的方法。
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