美文网首页
换个角度学C语言,函数调用0

换个角度学C语言,函数调用0

作者: xiaobing | 来源:发表于2017-04-26 23:05 被阅读0次

说明

本文将从全新的角度学习C语言,从原理的角度学习C语言,这是第0篇,讲解一些基础知识,会用到一些简单的汇编,但你不用会汇编,只需要看懂一些指令即可。

简单C代码

int main(int argc, char* argv[])
{
    return 0;
}

代码简单不用解释了,编译它

反编译它的exe

汇编核心代码:

push    ebp
mov     ebp, esp
sub     esp, 40h
push    ebx
push    esi
push    edi
lea     edi, [ebp+var_40]
mov     ecx, 10h
mov     eax, 0CCCCCCCCh
rep stosd
xor     eax, eax
pop     edi
pop     esi
pop     ebx
mov     esp, ebp
pop     ebp
retn

分析它

//int main(int argc, char* argv[])
//{
push    ebp 
//保存原来的栈底,执行push操作后,esp - 4,这里保存以前的ebp,执行完函数后会恢复ebp
mov     ebp, esp 
//新栈底
sub     esp, 40h  
//构造栈空间,由于冯诺依曼机是小端模式,所以sub操作可以理解为将esp栈顶减去,实际上是为栈增加空间,把esp移动一个范围
push    ebx
push    esi
push    edi
//保存执行main函数之前的状态,避免函数执行完了影响其他程序
lea     edi, [ebp+var_40]
mov     ecx, 10h
mov     eax, 0CCCCCCCCh
rep stosd
// return 0;
xor     eax, eax
//清0 eax eax被作为函数返回值
pop     edi
pop     esi
pop     ebx
//恢复之前寄存器状态
mov     esp, ebp
// 还原esp状态
pop     ebp
//还原ebp,pop操作弹栈到ebp,esp+4
retn
//函数结束,返回
//}

总结

这个过程比较复杂,但其实我们只需要记住函数如何调用的关键点就可以了。
首先,会保留现场,然后开辟栈空间,结束时会删除栈空间,并恢复现场。我们都知道局部变量保存在栈区内。由于函数调用结束会删除栈帧(mov esp, ebp),这就是为什么函数调用结束局部变量会消失的原因。我们通过反汇编直接看到了这个过程,相信自己所看到的。我们换个角度---从实践,事实的角度来学习C语言,从原理层学习C语言。

相关文章

  • 换个角度学C语言,函数调用0

    说明 本文将从全新的角度学习C语言,从原理的角度学习C语言,这是第0篇,讲解一些基础知识,会用到一些简单的汇编,但...

  • [转载]C语言函数调用栈

    原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...

  • Runtime之消息发送

    调用对象的方法,在Objective-C中叫做传递消息,先来看一下C语言中的函数调用方式 C语言中的函数调用方式 ...

  • 是否还需要在源文件中添加“extern C”?

    c++调用c语言的函数时我们一般在c语言函数声明处用extern "C"包c函数。例如: extern "C"的主...

  • cgo

    cgo cgo是用来在Go语言中调用C语言的工具 Go语言调用C语言 简单C语言函数 在Go语言中需要通过impo...

  • iOS 理解Block的调用

    Block是C语言的扩充功能。 1.先看看C语言的函数: 直接调用: 使用函数指针调用: 将func赋值给func...

  • gcc

    C语言 c语言是面向函数的语言,所以c语言中全部都是函数 看看单文件中对函数的生命和调用。 要先对函数进行声明再进...

  • 2018-08-29日常C笔记

    C语言初学笔记 C语言程序是由函数组成的C语言程序启动时,系统就会自动调用名字叫main的函数C语言规定了函数定义...

  • iOS消息转发机制

    函数的调用方式 Objective-C是C语言的超集,C语言的函数调用方式是“静态绑定的”,也就是说在编译的时候就...

  • 笔试题

    1Objective-C语言的消息机制和其他语言的普通函数调用有什么区别? 答:对于C语言,函数的调用在编译器的时...

网友评论

      本文标题:换个角度学C语言,函数调用0

      本文链接:https://www.haomeiwen.com/subject/qbjizttx.html