函数反汇编疑惑。。。

WecanHuang 2009-12-10 10:24:42
一个c函数反汇编后
前三行一般是:
push ebp
mov ebp,esp
sub esp,8

第三行我没法理解
主要是那个“8”
我试了下
这个数不是固定的
有时候是48
有时候是14
等等

请问
这个数是干嘛的
怎么确定这个数的?
要不要理会?
...全文
131 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
WecanHuang 2009-12-11
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wocow3 的回复:]
引用 10 楼 wecanhuang 的回复:
引用 9 楼 jennyvenus 的回复:
C/C++ code标准的C 函数调用方式.其过程是:1) 调用方把参数反序的压入堆栈中。2) 调用函数。3) 调用方把堆栈复原。


被调用函数需要做以下一些事情:1) 保存ebp. ebp 用来保存这个函数执行之前的esp 。执行完毕之后,ebp 恢复esp.
push ebp2) 保存esp 到ebp 中。
mov ebp,esp3) 在栈中腾出一个区域用来申请局部变量。
sub esp, ?-


这些我知道
我现在不知道的是:sub esp, xxh
这个xxh由什么定的,什么时候定的


编译期就决定了,编译器能算出你的函数需要多少的栈空间
[/Quote]

这个不用理会吧?
了解下就行?
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wecanhuang 的回复:]
那你们能告诉我这个怎么解释吗?

原函数:
void func()
{
int a = 0;
}

反汇编:
00413660  push        ebp
00413661  mov        ebp,esp
00413663  sub        esp,0CCh
00413669  push        ebx
0041366A  push        esi
0041366B  push        edi
。。。。

我一个参数都没
只有一个局部变量
sub        esp,0CCh      这行怎么解释?
[/Quote]
debug版 多申请了一些空间
WecanHuang 2009-12-10
  • 打赏
  • 举报
回复
那你们能告诉我这个怎么解释吗?

原函数:
void func()
{
int a = 0;
}

反汇编:
00413660 push ebp
00413661 mov ebp,esp
00413663 sub esp,0CCh
00413669 push ebx
0041366A push esi
0041366B push edi
。。。。

我一个参数都没
只有一个局部变量
sub esp,0CCh 这行怎么解释?
wocow3 2009-12-10
  • 打赏
  • 举报
回复
减8说明你这个函数总共用了8字节的局部变量,根据函数的调用方式看8字节是否包含函数参数
一般C函数在编译后的操作都是保存栈帧,编译期会算出函数需要多少栈空间,然后减小esp
MoXiaoRab 2009-12-10
  • 打赏
  • 举报
回复
恢复堆栈,8说明是2个参数,三个参数的话就是12了
WecanHuang 2009-12-10
  • 打赏
  • 举报
回复
我自认为自己很菜的了
为什么发的帖子都变成了散分帖?
5555555555555555
WecanHuang 2009-12-10
  • 打赏
  • 举报
回复
我要的不是这个
我想知道紧跟着“sub esp,”的那个数字是怎么来的
zgl7903 2009-12-10
  • 打赏
  • 举报
回复
在google上搜一下 “可以被C调用的汇编函数编程规范”
http://www.99inf.net/SoftwareDev/VC/28929.htm
MoXiaoRab 2009-12-10
  • 打赏
  • 举报
回复
int main(void)
{
004113E0 push ebp
004113E1 mov ebp,esp
004113E3 sub esp,0C0h
004113E9 push ebx
004113EA push esi
004113EB push edi
004113EC lea edi,[ebp-0C0h]
004113F2 mov ecx,30h
004113F7 mov eax,0CCCCCCCCh
004113FC rep stos dword ptr es:[edi]
func();
004113FE call func (411082h) //在上面有00411082 jmp func (4113A0h)
return 0;
00411403 xor eax,eax

}

void func()
{
004113A0 push ebp
004113A1 mov ebp,esp
004113A3 sub esp,0CCh
004113A9 push ebx
004113AA push esi
004113AB push edi
004113AC lea edi,[ebp-0CCh]
004113B2 mov ecx,33h
004113B7 mov eax,0CCCCCCCCh
004113BC rep stos dword ptr es:[edi]
int a = 0;
004113BE mov dword ptr [a],0
}
wocow3 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wecanhuang 的回复:]
引用 9 楼 jennyvenus 的回复:
C/C++ code标准的C 函数调用方式.其过程是:1) 调用方把参数反序的压入堆栈中。2) 调用函数。3) 调用方把堆栈复原。


被调用函数需要做以下一些事情:1) 保存ebp. ebp 用来保存这个函数执行之前的esp 。执行完毕之后,ebp 恢复esp.
push ebp2) 保存esp 到ebp 中。
mov ebp,esp3) 在栈中腾出一个区域用来申请局部变量。
sub esp, ?-


这些我知道
我现在不知道的是:sub esp, xxh
这个xxh由什么定的,什么时候定的

[/Quote]
编译期就决定了,编译器能算出你的函数需要多少的栈空间
WecanHuang 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jennyvenus 的回复:]
C/C++ code标准的C 函数调用方式.其过程是:1) 调用方把参数反序的压入堆栈中。2) 调用函数。3) 调用方把堆栈复原。


被调用函数需要做以下一些事情:1) 保存ebp. ebp 用来保存这个函数执行之前的esp 。执行完毕之后,ebp 恢复esp.
push ebp2) 保存esp 到ebp 中。
mov ebp,esp3) 在栈中腾出一个区域用来申请局部变量。
sub esp, ?-
[/Quote]

这些我知道
我现在不知道的是:sub esp, xxh
这个xxh由什么定的,什么时候定的
用户 昵称 2009-12-10
  • 打赏
  • 举报
回复
标准的C 函数调用方式.其过程是:
1) 调用方把参数反序的压入堆栈中。
2) 调用函数。
3) 调用方把堆栈复原。


被调用函数需要做以下一些事情:
1) 保存ebp. ebp 用来保存这个函数执行之前的esp 。执行完毕之后,ebp 恢复esp.
push ebp

2) 保存esp 到ebp 中。
mov ebp,esp

3) 在栈中腾出一个区域用来申请局部变量。
sub esp, xxh

4) 保存寄存器值到堆栈中。调用完后恢复

push ebx
push esi
push edi
...

5) 在函数中。参数的获取是ebp+8 字节为第一个参数,ebp+12 为第二个参数,依次增加。ebp+4 字节处是要返回的地址。

6) 恢复ebx,esi,edi ,esp,ebp,最后返回。
pop edi
pop esi
pop ebx
mov esp,ebp
pop ebp
ret
用户 昵称 2009-12-10
  • 打赏
  • 举报
回复
那就是申请变量的。

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧