我正在尝试学习一些汇编代码,所以我在一些教程中读到了
的汇编代码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
输入)来获取数据的地址是正确的。存储?
答案 0 :(得分:1)
这里发生的是构建堆栈帧以将参数传递给scanf
。 subl
用于为新堆栈帧分配空间,movl
用于堆栈指针%esp
的偏移量,以便为新分配的堆栈帧上的参数写入值。
可以找到关于x86调用约定和特别是cdecl的更全面的解释here。理解堆栈框架的高级结构和cdecl约定将有助于您理解此代码段的意图。
答案 1 :(得分:0)
调用scanf
的约定为cdecl
。它将其参数传递给esp
指向的堆栈。