2013-05-03 27 views
1

跳躍後稱這可能是容易的,但我感到困惑了一段時間:回裝配

假設我有類似

main: 
... 
call some_fun 
... 

some_fun: 
... 
jmp op 
... 

op: 
... 
ret 

將這個RET正確返回通話開始的地方?如果沒有,那麼ret如何正確返回?

+0

自從我做了任何程序集已經很長時間了,但我認爲在'some_fun'中,你必須在跳轉之前在棧上存儲返回地址。我認爲。 :/ – GJK 2013-05-03 23:08:55

回答

6

如果在所提供的例子,你要下指令其執行它返回到是後呼叫some_fun在指令之後,然後是它會做正是你想要的,前提是您在返回前清理堆棧幀。

假設您正在使用x86彙編,以下是正在發生的事情。

  1. 當執行呼叫some_fun,它推動返回地址壓入堆棧中,然後改變程序計數器/指令指針指向some_fun所以它繼續執行那裏。
  2. jmp op指令不會修改堆棧。它只修改程序計數器/指令指針。
  3. ret指令從堆棧中彈出一個值並將其轉儲到程序計數器/指令指針中。它彈出堆棧的值被稱爲返回地址。在發行ret之前,將任何東西some_funop推到堆疊上是非常重要的。否則,您將返回錯誤的返回地址。

希望這會有所幫助。

+0

感謝您的解釋 – user2304942 2013-05-05 17:32:15

+0

@ user2304942 - 你非常歡迎。 – Sparky 2013-05-05 18:25:33

0

如果它仍然崩潰然後嘗試

移動DWORD [STAK],ESP;劈頭

和結束

MOV ESP,[STAK]

RET

kinda thing

gl