win32下vs2013彙編傳參和區域性變數棧的分配

Haris發表於2024-05-14

1、傳參無論是用暫存器還是棧,最終都要壓入棧中。
2、第一個引數的位置是ebp+8,少於4byte的資料型別按照4Byte壓棧,第n個引數的地址是[ebp+4+4n],ebp+4是返回地址。
8byte的資料型別,會先開闢8位元組的棧空間esp-8,再把資料放入棧中。下一個引數的地址相應的要加8。
3、區域性變數用函式自己的開闢棧幀。區域性變數之間間隔2個棧幀。n個區域性變數,除了double棧幀開闢的大小為0C0h+n*0Ch,double額外增加4byte。也是為了保持變數間間隔2個棧幀。
若第一個變數是char,那麼第一個區域性變數的位置是ebp-5,第二個變數ebp-11h,佔用一個棧幀,間隔2個棧幀,第三個變數仍然間隔2個棧幀。
若第一個變數是short或int,第一個變數的位置是ebp-8,後面間隔0Ch,double變數本身佔2個棧幀,但同下一個變數仍然間隔2個棧幀。
若第一個變數是double,位置是ebp-0C0h。後面間隔也是2個棧幀。

相關文章