作者lalawul (鋒哥開砲囉......)
看板ASM
標題[問題] 8051用JMP跳到副程式可以用RET返回嗎 ?
時間Wed Jun 20 10:32:10 2012
我知道一般呼叫副程式需要返回都是用 CALL 和 RET
那如果用JMP跳到副程式,而在副程式最後也用RET,這樣
也可以返回嗎 ? 這樣stack會不會亂掉 ? 我的觀念是
如果執行 JMP的時候, 8051有把目前的address存入
stack, 那這樣寫應該是不會有問題, 但是我不知道
JMP會不會把 目前的address存入stack (Call當然會)
如果JMP可以做到相同的事, 那似乎8051可以不必有
CALL這個指令囉 ?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.114.39.67
1F:→ easypro:ret才會從stack拉出 jmp不會 jmp是位直直接跳的 06/20 14:18
2F:→ lalawul:那用Jmp之後,在副程式最後硬是RET會怎樣 ? 06/20 21:53
3F:→ jason12308:應該是位址會亂跳...回不到正確 06/20 22:02
4F:→ kikiqqp:硬要RET不是不行,這時候要看你STACK裡有啥 06/21 00:56
5F:→ kikiqqp:有位址就會跳到那位址,沒位址就Stack Under Flow 06/21 00:57
6F:→ kikiqqp:至於Stack Under Flow硬體如何處理看IC類型和編譯器設定 06/21 00:58
7F:推 ruemann:可以的,在某些特別的應用上會用到這些技巧 06/21 00:58
8F:→ ruemann:具體的方法是在JMP前先把你要RET回來的address先push進 06/21 00:59
9F:→ ruemann:stack,這樣就會在ret時跳回來 06/21 00:59
10F:→ ruemann:一定要手動push address ,所以會比call還花時間 06/21 01:00
11F:→ lalawul:rue大所說的方式是指先把PC值讀出來,然後push進stack嗎 ? 06/21 01:31
12F:推 WolfLord:也不一定,如果是個多重入口的FUNCTION就可以利用JMP 06/21 01:47
13F:→ WolfLord:做函式串接,不過這算是高階技巧而且是結構化程式大忌 06/21 01:48
14F:推 WolfLord:像五隻尼克寫得Apple2的Monitor(BIOS)就很多這種技巧 06/21 07:08
15F:→ james732:工作上的code常看到 a call b, b jmp c, c ret 這種 06/21 21:02
16F:→ kikiqqp:空間不夠用時會常常這樣做,更甚一堆程式同用一個RET XDDD 06/22 15:19
17F:推 WolfLord:因為return前需要些重複的工作,這樣寫可以省很多事 06/22 22:06
18F:→ WolfLord:另一種情況是,一個function有多重入口一個出口 06/22 22:07
19F:→ WolfLord:還有另一種比較罕見的用途是:查表法 06/22 22:08
20F:→ jason12308:話說……用查表法來建立一個SIN波XDDDDD 06/22 22:26
21F:→ kikiqqp:查表在小容量單晶片很常用PC+RETL 尤其是複雜數學運算 06/22 22:41
22F:推 WolfLord:在CISC(8051是一種CISC)上用這種方法查表並不常見 ^^; 06/23 01:24
23F:→ lalawul:收穫良多~~~thx all 06/25 09:14