【汇编和c语言】空函数和裸函数和调用约定

                                              c语言里面有个东西叫函数

                                                             辣么~

                                       你们看下以下这个函数,它干了什么?

                                                                    

                                     嗯~看起来是一个空函数,什么都没干!

   对于c语言来说,因为函数里面什么程序都没有,所以什么都没有执行,所以称之为空函数

                                                            !然 而!

                                               它真的什么都没干吗?未必。

                           程序是什么都没干,但是编译器却干了很多事情!!!

                                            我们来看下这个空函数的反汇编

                                                             

可以看到,即使我们只是写了一个空函数,但是编译器还是为我们在暗地里做了很多手脚

                                                      做了什么事情?

                                                    开辟内存空间!!!

由此可知:每个程序运行都是需要占用内存的,就算程序没有用到,编译器也会自动开辟一块地方给函数,当程序执行完成之后再释放内存,留给下一个程序继续使用。

————————————————————————————————————————

                                                               辣么

                     如果我们不想让编译器自动为我们开辟空间,那要怎么办呢? 

                               ↓↓↓↓↓↓↓↓在这里有一个东西可以使用↓↓↓↓↓↓↓↓

                                                               裸函数

                                                                

               如图上所示,按照以上规定的格式书写函数,函数将变成一个裸函数

              意思是告诉编译器,这个函数不进行任何操作,不能添加任何代码!!

                            ↓↓↓↓↓↓↓所以我们看到的反汇编是这个样子的↓↓↓↓↓↓↓

                                                                       

                                      真正意义上的空函数,比空函数还空的函数

                                                  但是这样可以运行起来吗?

         

                         可以看到,即使编译器没有报错,但是程序却直接崩溃

                                                              为什么?

                                                         为什么?

                                                为什么? 

           因为裸函数里面什么都没有,所以里面的堆栈无法平衡,所以程序奔溃了

                                                          那要怎么办呢?

因为裸函数里面什么都没有,所以之前编译器为我们做的东西,现在我们要自己动手做

                                                               怎么做?

                                            ↓↓↓↓↓↓↓按照以下的格式↓↓↓↓↓↓↓

                                                               

               在__asm这个函数里面自行添加汇编的指令,使得堆栈平衡,就可以通过啦~

                                                       如此,编译成功!

              最后!附上一个调用约定,具体怎么使用得可以看着说明自己操作一下下~

猜你喜欢

转载自blog.csdn.net/qq_41884002/article/details/81582908
今日推荐