[转译][马基 杰斯特(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,d3asr.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指令的地址是2442064EF9表示jmp00244210是将要跳转的地址

对于00244210来说,高位的00会被忽略,剩下的244210会被放到PC里,之后 m68k 就会读PC然后跳转到00244210的位置,也就是3400 (move.w d0,d2)的位置

很简单不是吗,不过要记住一点,PC24 的,也就是说如果JMP指令的目标是F2049800,那么F2就会被忽略,只有049800会被读取,而 m68k 也会跳转到00049800。这也就是说 m68k 的内存范围事实上是从0000000000FFFFFF.. 也就是理论上16MB的内存空间

当然关于这条指令还有其他一些可用的地址模式,我们会在之后有所详述

目录
上一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 伍 - 程序流程控制 | 1. PC (Program Counter) 程序计数器
下一篇:[转译][马基 杰斯特(MarkeyJester) 摩托罗拉68000 入门教程] 伍 - 程序流程控制 | 3. BRA (分支) 指令

posted @ 2020-03-07 10:15  草帽过客  阅读(521)  评论(0编辑  收藏  举报