[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 伍 - 程序流程控制 | 2. JMP (跳转) 指令
注意:本文经过原作者授权转译,转载请标明出处
原文地址:http://mrjester.hapisan.com/04_MC68/Sect05Part02/Index.html
条件允许建议阅读原文,网上非中文资料还是较多,当作锻炼英文岂不美哉
翻译若有不足之处欢迎批评指正
译文:
"生命在于冒险。你要学会从悬崖边纵身一跃,然后在下坠的过程中长出翅膀!" (@朱伟老师 译) ---- 雷 布莱伯利 (Ray Bradbury, 1920-2012),美国科幻、奇幻、恐怖小说作家
简介
JMP (JuMP unconditionally) - 无条件跳转
这条指令会把目的操作数放到PC里,然后由 m68k 从目的操作数里表示的地址开始执行指令
简单的例子
我又列了一串指令:
move.w d0, d1
add.w d1, d1
add.w d1, d0
jmp SkipCode
add.w d2, d3
asr.w #$04, d0
SkipCode:
move.w d0, d2
这是一些我随便写的指令,但是在中间你可以看到一条JMP指令:
jmp SkipCode
这条指令会让 m68k 跳过一堆指令而直接到SkipCode那里,你可能注意到在那串指令快结束的地方有个SkipCode:,我们称之为标记 (lable,或者是标签 (label)),而这里就是 m68k 将会跳转到的地方
所以想象一下,处理器在读取这些指令:
- 首先,
move.w d0,d1指令先被处理 - 然后是
add.w d1,d1指令 - 再然后是
add.w d1,d0
接下来的一条指令就是jmp SkipCode,那么执行这条指令会发生什么呢,m68k 会直接跳过add.w d2,d3和asr.w #$04,d0这两条指令而直接降落到SkipCode:,直接执行move.w d0,d2这条指令
这里是一张看起来更简化的图:

使用
JMP指令你可以跳转到几乎程序的任何位置,甚至是往回跳转
复杂的例子
这条指令工作的原理就是它会把SkipCode的地址放到PC (Program Counter,程序计数器) 里,从而引发了 m68k 自动的读取PC之后,直接读取并执行那个地址的指令
这里是指令在内存中的样子,可能理解起来会更清楚:
| 偏移量 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ... | ||||||||||||||||
| 00244200 | 32 | 00 | D2 | 41 | D0 | 41 | 4E | F9 | 00 | 24 | 42 | 10 | D6 | 42 | E8 | 40 |
| 00244210 | 34 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
| 00244220 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
| 00244230 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
| ... |
注意到jmp SkipCode指令的地址是244206,4EF9表示jmp而00244210是将要跳转的地址
对于00244210来说,高位的00会被忽略,剩下的244210会被放到PC里,之后 m68k 就会读PC然后跳转到00244210的位置,也就是3400 (move.w d0,d2)的位置
很简单不是吗,不过要记住一点,PC是24 位的,也就是说如果JMP指令的目标是F2049800,那么F2就会被忽略,只有049800会被读取,而 m68k 也会跳转到00049800。这也就是说 m68k 的内存范围事实上是从00000000到00FFFFFF.. 也就是理论上16MB的内存空间
当然关于这条指令还有其他一些可用的地址模式,我们会在之后有所详述
目录
上一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 伍 - 程序流程控制 | 1. PC (Program Counter) 程序计数器
下一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 伍 - 程序流程控制 | 3. BRA (分支) 指令
浙公网安备 33010602011771号