[英]understanding some assembly code
我正在嘗試學習一些匯編代碼,所以我在一些教程中讀到了該匯編代碼
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
)來獲取將存儲數據的地址嗎?
這里發生的是建立了一個堆棧框架以將參數傳遞給scanf
。 subl
用於為新的堆棧幀分配空間, movl
與堆棧指針%esp
偏移量一起使用,以將參數的值寫入新分配的堆棧幀。
在這里可以找到有關x86調用約定(尤其是cdecl)的更詳盡的解釋。 了解堆棧框架和cdecl約定的高級結構將幫助您理解此代碼段的意圖。
scanf
調用約定為cdecl
。 它將參數傳遞給esp
指向的堆棧。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.