[問題] 8051用JMP跳到副程式可以用RET返回嗎 ?

看板ASM (組合語言)作者 (鋒哥開砲囉......)時間13年前 (2012/06/20 10:32), 編輯推噓5(5018)
留言23則, 7人參與, 最新討論串1/1
我知道一般呼叫副程式需要返回都是用 CALL 和 RET 那如果用JMP跳到副程式,而在副程式最後也用RET,這樣 也可以返回嗎 ? 這樣stack會不會亂掉 ? 我的觀念是 如果執行 JMP的時候, 8051有把目前的address存入 stack, 那這樣寫應該是不會有問題, 但是我不知道 JMP會不會把 目前的address存入stack (Call當然會) 如果JMP可以做到相同的事, 那似乎8051可以不必有 CALL這個指令囉 ? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.114.39.67

06/20 14:18, , 1F
ret才會從stack拉出 jmp不會 jmp是位直直接跳的
06/20 14:18, 1F

06/20 21:53, , 2F
那用Jmp之後,在副程式最後硬是RET會怎樣 ?
06/20 21:53, 2F

06/20 22:02, , 3F
應該是位址會亂跳...回不到正確
06/20 22:02, 3F

06/21 00:56, , 4F
硬要RET不是不行,這時候要看你STACK裡有啥
06/21 00:56, 4F

06/21 00:57, , 5F
有位址就會跳到那位址,沒位址就Stack Under Flow
06/21 00:57, 5F

06/21 00:58, , 6F
至於Stack Under Flow硬體如何處理看IC類型和編譯器設定
06/21 00:58, 6F

06/21 00:58, , 7F
可以的,在某些特別的應用上會用到這些技巧
06/21 00:58, 7F

06/21 00:59, , 8F
具體的方法是在JMP前先把你要RET回來的address先push進
06/21 00:59, 8F

06/21 00:59, , 9F
stack,這樣就會在ret時跳回來
06/21 00:59, 9F

06/21 01:00, , 10F
一定要手動push address ,所以會比call還花時間
06/21 01:00, 10F

06/21 01:31, , 11F
rue大所說的方式是指先把PC值讀出來,然後push進stack嗎 ?
06/21 01:31, 11F

06/21 01:47, , 12F
也不一定,如果是個多重入口的FUNCTION就可以利用JMP
06/21 01:47, 12F

06/21 01:48, , 13F
做函式串接,不過這算是高階技巧而且是結構化程式大忌
06/21 01:48, 13F

06/21 07:08, , 14F
像五隻尼克寫得Apple2的Monitor(BIOS)就很多這種技巧
06/21 07:08, 14F

06/21 21:02, , 15F
工作上的code常看到 a call b, b jmp c, c ret 這種
06/21 21:02, 15F

06/22 15:19, , 16F
空間不夠用時會常常這樣做,更甚一堆程式同用一個RET XDDD
06/22 15:19, 16F

06/22 22:06, , 17F
因為return前需要些重複的工作,這樣寫可以省很多事
06/22 22:06, 17F

06/22 22:07, , 18F
另一種情況是,一個function有多重入口一個出口
06/22 22:07, 18F

06/22 22:08, , 19F
還有另一種比較罕見的用途是:查表法
06/22 22:08, 19F

06/22 22:26, , 20F
話說……用查表法來建立一個SIN波XDDDDD
06/22 22:26, 20F

06/22 22:41, , 21F
查表在小容量單晶片很常用PC+RETL 尤其是複雜數學運算
06/22 22:41, 21F

06/23 01:24, , 22F
在CISC(8051是一種CISC)上用這種方法查表並不常見 ^^;
06/23 01:24, 22F

06/25 09:14, , 23F
收穫良多~~~thx all
06/25 09:14, 23F
文章代碼(AID): #1FuJOj62 (ASM)
文章代碼(AID): #1FuJOj62 (ASM)