簡體   English   中英

了解一些匯編代碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM