(MASM) - 恢复堆栈的重要性

时间:2017-09-21 12:25:18

标签: winapi assembly stack stack-overflow masm

我最近一直在学习装配,开始进入一些更复杂的做事指令。我理解堆栈是如何工作的以及它的大小但是恢复有多重要?

假设我们调用一个采用4字节整数的函数

push 0
call ...

现在调用它肯定会导致堆栈溢出?我认为这具有基本知识,但可以在其他地方处理。

从堆栈中弹出该整数有多重要? (或重新对齐堆栈指针)。这样做是否更好,可能会降低性能。

我理解在某些情况下可能需要这不是全部 但是我注意到调用WINAPI函数会改变堆栈本身而不是恢复它,为什么呢?

1 个答案:

答案 0 :(得分:3)

回答你的问题:

  
      
  1. 调用很多会导致堆栈溢出?
  2.   

不一定 - WINAPI调用约定使用被调用的方法弹出堆栈。如果所有被调用的例程都有相应的弹出,那么它不会导致溢出。

  
      
  1. 从堆栈中弹出那个整数有多重要?
  2.   

由于它是由被调用函数使用的,它应该被弹出某个地方 - 如果我们使用调用者清理调用约定执行调用的代码,或者通过调用例程调用例程我们正在使用被调用者清理调用约定。

  
      
  1. 某些不需要它的情况
  2.   

WINAPI让被调用的例程在最后弹出堆栈,而不是调用者。这节省了内存,因为所有调用者都不需要弹出堆栈。 Raymond Chen's blog has good overview of calling conventions;所有这些规格的完整规格也是in the x86 tag wiki

有很多调用约定,如果您希望代码与其他代码一起使用,则需要遵循它们。您可以选择自己推送自己的#,但如果您想使用您没有写过的代码,则总是希望您遵循某些标准。