iT邦幫忙

DAY 5
3

freedos bochs 16位元 組合語言…等系列 第 5

FreeDos下組合語言之熱身:debug之四,call,ret, jmp.

  • 分享至 

  • xImage
  •  

call 函式,我們會return值回來,把常用的,常重覆的功能寫成function來使用,也可以不傳值(void)回來,通常return值回來,又會繼續往下執行,直到結束,我們應該不會問為什麼會回來,這個動作,回傳值,就會回呼叫的地方,很自然的習慣且接受call完會回來的事實,以組合語言的角度,這是有底層機制在協助的,要借助上一節所提到的堆疊。

jmp在一般語言,好像比較像goto 的語法,和call比較,就是沒有return(返回)。
本篇參考加拿大女教授的youtube教學,Understanding Subroutine Calls at the Machine Level(從機器角度來理解呼叫副程式http://www.youtube.com/watch?v=XYzXcCASH9M&feature=plcp

C:\>debug
-a 100
08FA:0100 jmp 200
08FA:0103 call 200
08FA:0106
-t

這時ip的值,從100, 變200, 表示跳到200去了。
很直覺的JUMP, 跳過去。
接著測call的效果。
把ip指標指回call這行,

-r ip
IP 0200  :103
-t

然後執行下一步,
這時有事情發生了,
SP推疊指標發生變化,由FFFE變成FFEC,類似昨天的機制發生了,
這時,
-d ss:fff0
08FA:FFF0 00 00 03 01 00 00 00 02-FA 08 86 73 06 01 00 00

返回的位置,106放入ss堆疊段,返回時, 就接106往下做。
這時ip還是指向200.
我們在200, 做一個RETURN(RET)

-a 200
08FA:0200 ret
08FA:0201
-t

這時ip參考SS堆疊段,SP位置的值,106,再返回。
IP由200變成106。SP也變回FFFE.
而SS堆疊段也改變了。
-d ss:fff0
08FA:FFF0 00 02 00 00 FA 08 00 00-06 01 FA 08 86 73 00 00

小結:這段練習演示了筆者視為理所當然沒有懷疑的呼叫函數機制,沒想到在底層是需要堆疊的配合。
也許大家會提問,傳參數,多個參數,組合語言要放那裏??傳參數物件呢?回傳參數又怎麼表示呢?
筆者隨後會找例子來示範。筆者很期望知道。


上一篇
FreeDos下組合語言之熱身:debug之三,IP, SS, SP.
下一篇
FreeDos下組合語言之熱身:debug之五,相對位址
系列文
freedos bochs 16位元 組合語言…等17
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
timloo
iT邦研究生 2 級 ‧ 2012-09-28 23:14:51

今天月結,被課長留了下來,
搞到8點半,坐火車回到家,吃完飯,10點了。

好累,以為退居第5/6線TIPTOP維護人員,
狀況會很少。結果第五天遇到了。

大家加油。

0
timloo
iT邦研究生 2 級 ‧ 2012-09-28 23:17:03

回家途中,風好大。台中果然是盆地,不擋風,相較於銅鑼,風大到嚇人!

我要留言

立即登入留言