Fw: [問題] 呼叫gets前的sub $0xc,%esp

作者: GNUGCC (-std=c++14)   2016-07-28 14:52:38
※ [本文轉錄自 ASM 看板 #1NcQiseh ]
作者: GNUGCC (-std=c++14) 看板: ASM
標題: [問題] 呼叫gets前的sub $0xc,%esp
時間: Thu Jul 28 14:50:28 2016
小弟最近在練習看組語,遇到問題想來請教各位
這是source code
#include <stdlib.h>
#include <stdio.h>
void print(){
char buf[5];
gets(buf);
}
int main(){
print();
}
這是在
ubuntu 16.04 amd64

gcc -fno-stack-protector -m32 -O0 test.c
編譯出來的結果
0804840b <print>:
804840b: 55 push %ebp
804840c: 89 e5 mov %esp,%ebp
804840e: 83 ec 18 sub $0x18,%esp <=為啥預留24 bytes
8048411: 83 ec 0c sub $0xc,%esp <=為啥要減12
8048414: 8d 45 f3 lea -0xd(%ebp),%eax
8048417: 50 push %eax
8048418: e8 c3 fe ff ff call 80482e0 <[email protected]/*
作者: GNUGCC (-std=c++14)   2016-07-28 14:55:00
因為和C稍微有關係,而且這邊人比較多,所以轉過來,請板主包容,謝謝!
作者: longlongint (華哥爾)   2016-07-28 14:57:00
1 配四的倍數 是為了配合硬體(?2 分配區域變數的空間根據記憶回的 我覺得你查一下書裡面應該有寫突然想到還有個傳參數功能還有存ip忘了說還有一個功能是存ebp......
作者: wtchen (沒有存在感的人)   2016-07-28 15:15:00
板工勉強放行,至少言之有物
作者: longlongint (華哥爾)   2016-07-28 15:31:00
我也不懂為什麼要減16這個數字 XD
作者: descent (「雄辯是銀,沉默是金」)   2016-07-28 15:33:00
q2: http://goo.gl/vNJXig, -mpreferred-stack-boundary
作者: x000032001 (版廢了該走了)   2016-07-28 20:47:00
應該是為了對齊16bytes
作者: LPH66 (-6.2598534e+18f)   2016-07-28 23:10:00
原 PO 在問的就是為什麼是 16 byte, 其原因就是那個選項
作者: longlongint (華哥爾)   2016-07-29 00:39:00
哇 學習了
作者: Sidney0503 (Sidney0503)   2016-07-30 18:31:00
ID wwwwwwwwww
繼續閱讀

Links booklink

Contact Us: admin [ a t ] ucptt.com