注意:本文经过原作者授权转译,转载请标明出处
原文地址: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
然后跳转到00
244210
的位置,也就是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 (分支) 指令