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

                                                             辣么~

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

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

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

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

                                                            !然 而!

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

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

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

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

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

                                                      做了什么事情?

                                                    开辟内存空间!!!

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

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

                                                               辣么

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

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

                                                               裸函数

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

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

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

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

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

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

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

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

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

                                                              为什么?

                                                         为什么?

                                                为什么? 

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

                                                          那要怎么办呢?

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

                                                               怎么做?

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

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

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

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

                                                       如此,编译成功!

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

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

相关文章:

  • 2021-10-20
  • 2022-12-23
  • 2022-12-23
  • 2022-02-17
  • 2021-10-20
  • 2021-06-26
猜你喜欢
  • 2021-07-03
  • 2021-10-25
  • 2021-10-20
  • 2021-12-17
  • 2021-10-20
相关资源
相似解决方案