一.什么是堆棧平衡
含義就是 當函數在一步步執行的時候 一直到ret執行之前,堆棧棧頂的地址 一定要是call指令的下一個地址。
也就是說函數執行前一直到函數執行結束,函數里面的堆棧是要保持不變的。
如果堆棧變化了,那么,要在ret執行前將堆棧恢復成原來的樣子。
第一種情況:push影響堆棧
比如 call ...
函數:mov ... (不影響堆棧平衡)
push..... (影響堆棧平衡)
ret.....
第二種情況:堆棧傳遞參數
......
堆棧如下:
因為PUSH 1 PUSH 2 是為了函數傳參而准備的 ,當函數執行完成后 ,push1,push2 就都沒用了,所以要把堆棧恢復到執行前的位置
兩種解決辦法 :函數外部處理和內部處理
第一種 :在函數外部添加ADD處理
第二種:在函數內部添加
ret 8 是把 ret 和第一種情況的add 兩條指令整合成一條指令,在函數內部完成堆棧平衡。