作者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