【问题标题】:Calculating Offset (Motorola 68k)计算偏移量(摩托罗拉 68k)
【发布时间】:2015-10-29 23:49:22
【问题描述】:

我有一个问题要找到这样的偏移量:

假设指令 BNE HERE 位于内存位置 $FF1234,标签 HERE 代表地址 $FF12C0 处的指令。计算该指令的偏移量(位移)。偏移量是否会被典型的汇编器存储为 8 位或 16 位值?为什么?

我尝试这样做以找到位移:

FF1234 + offset = HERE = FF12C0
I tried solving for Offset which is:

 FF1234
-FF12C0

等于:33432820?

这是计算偏移量的正确方法吗?

【问题讨论】:

  • 不,显然如果FF1234 + offset = FF12C0 那么offset = FF12C0 - FF1234。还要检查 68k 是否使用当前或下一条指令作为基础。
  • 好吧,有道理,但是是 8 位还是 16 位?
  • 由于偏移量是8C 并且超出了 8 位有符号的范围,因此它将是 16 位。
  • 那么8位有符号的范围是多少?如果一个值落在该范围内,那么它必须是 8 位?我理解正确吗?
  • 范围是十进制的 -128 到 +127,不,在这种情况下它必须为 8 位,因为所有这些都可以表示为 16 位也。但是,超出该范围的任何内容都不能是 8 位。

标签: assembly 68000


【解决方案1】:

首先:查看 BNE 指令如何使用偏移量,以及如果发生跳转,使用什么 PC 值计算下一个 PC 值。

来自http://68k.hax.com/Bcc

说明:如果指定条件为真,程序执行 在位置 (PC) + 位移处继续。 PC 包含地址 Bcc指令的指令字加二。这 位移是一个二进制补码整数,表示相对 从当前 PC 到 16 位位移的距离(以字节为单位)( 紧跟在指令后面的词)被使用。如果 8 位 指令字中的位移字段全为 1 ($FF),则 32 位位移(紧跟指令的长字)是 用过。

因此,如果BNE 指令位于$FF1234,则作为要添加的偏移量的基数的PC 的值是$FF1236

OTOH,PC 目标值为$FF12C0,所以$FF1236 + offset = $FF12C0offset 将是一个正值。你应该没问题。

关于另一个问题:

偏移量是否会被典型的存储为 8 位或 16 位值? 汇编?为什么?

我不知道它的意思是“典型的汇编程序”。我不知道它是指任何架构的典型汇编器,还是 m68k 架构的典型汇编器。我只能猜测这是指“典型的汇编程序生成 m68k 目标代码”,在这种情况下,您应该能够通过查看偏移值所需的位大小和 BNE 的编码选项来回答这个问题说明,可在上述网页中找到:

指令格式:\i3-++-4条件,88位位移,

如果 8 位位移 = $00,则为 016 位位移,

如果 8 位位移 = $FF,则为 032 位位移,

指令字段(寄存器移位):条件字段——二进制 表中列出的条件之一的代码。 8 位位移 field -- 二进制补码整数,指定字节数 在分支指令和要执行的下一条指令之间 如果满足条件。 16 位位移字段——用于 当 8 位位移字段包含 $00 时的位移。 32 位 位移域——8位时用于位移 位移字段包含 $FF。

注意:跳转到紧随其后的指令自动 matically 使用 16 位位移格式,因为 8 位 位移字段包含 $00(零偏移)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多