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所指向的堆栈,这里发生的事情是建立一个堆栈框架,将参数传递给scanfsubl
用于为新堆栈帧分配空间,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