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