Motorola 68000 汇编器语法,用于带索引的间接程序计数器

Motorola 68000 assembler syntax for Program Counter Indirect with Index

我一直在为 Sega Mega Drive ROMs, basing my initial work on the MOTOROLA M68000 FAMILY Programmer’s Reference Manual. Having disassembled a considerable chunk of the ROM, I've attempted to reassemble this disassembled output, using VASM as it can accept the Motorola assembly syntax, using its mot syntax module.

组装我自己的反汇编程序

现在,对于绝大多数重组来说,这种方法运行良好,但是对于具有由“程序计数器间接索引(8 位位移)模式”定义的有效地址的操作存在一个问题。鉴于我现在才学习摩托罗拉68000汇编,我想确认一下我的理解并问:这些操作的正确语法是什么?

解读

例如,如果我有两个词:

4ebb 0004

我将其解释为 JSR,目标目的地是以下各项的总和:

(考虑到我将自己限制在 68000,我在扩展词中省略了对 sizescale 的任何考虑)。 根据参考手册中如何描述这种寻址模式,我将其发送为:

jsr (,pc,d0)

用 VASM 组装

但是,当我将其反馈给 VASM 时,它会发出以下错误:

error 2030 in line X of "XXXX.asm": displacement out of range
>  jsr (,pc,d0)

这似乎是一个非常奇怪的错误,因为由于使用了 d0 寄存器,直到运行时才能知道位移。玩弄这个,它似乎使用操作数的第一部分(</code>)作为绝对目标目的地,并据此计算不同的位移。</p> <h3>使用 GNU 进行汇编 <code>as

如果我切换到 GNU as,提供与原始 ROM 相同输出的语法是:

jsr %pc@(0x04,%d0:w)

这似乎表明操作数的第一部分是位移。但是,当我使用 objdump 反汇编它时,列出的指令是:

jsr %pc@(0x6,%d0:w)

这似乎表明,在 as 使用的 MIT 语法中,操作数的第一部分再次是绝对地址。

终极问题

这两种语法之间甚至 as 汇编和随后的反汇编之间的这种混淆让我想知道正确的语法应该是什么,或者使用这种寻址模式的指令是否倾向于由汇编程序生成为宏或其他更高级别构造的一部分。

调查结果摘要

思考@tofro 的观点让我走上了正确的方向,这就是我所达到的目标:

使用标签

我测试过的两个汇编程序(VASM 和 GNU as)都可以正确处理我认为是操作数“位移”部分的标签,并将根据当前 PC 和目标标签。从程序员的角度和@tofro 的观察来看,这很方便,我想说这就是这种寻址的使用方式。

因此,用 vasm 组装以下内容:

  org   

  jsr   (label,pc,d0)
  nop

label:
  nop

生成如下列表文件:

Sections:
00: "seg80" (80-88)


Source: "vasm-label.asm"
                                     1:   org   
                                     2: 
00:00000080 4EBB0004                 3:   jsr   (label,pc,d0)
00:00000084 4E71                     4:   nop
                                     5: 
                                     6: label:
00:00000086 4E71                     7:   nop
                                     8: 


Symbols by name:
label                            A:00000086

Symbols by value:
00000086 label

并用 as 组装以下内容:

  .org  0x80

  jsr   %pc@(label,%d0:w)
  nop

label:
  nop

生成如下列表文件:

68K GAS  as-label.asm           page 1


   1 0000 0000 0000       .org  0x80
   1      0000 0000 
   1      0000 0000 
   1      0000 0000 
   1      0000 0000 
   2                
   3 0080 4EBB 0004       jsr   %pc@(label,%d0:w)
   4 0084 4E71            nop
   5                
   6                label:
   7 0086 4E71            nop
68K GAS  as-label.asm           page 2


DEFINED SYMBOLS
        as-label.asm:6      .text:0000000000000086 label

NO UNDEFINED SYMBOLS

我们可以看到两个汇编器都为指令输出相同的两个词(按照我原来的例子):

4ebb 0004

展望未来,在我的反汇编中正确识别所有标签后,这将是最用户友好的格式。

使用直接“位移”

这是两者的不同之处,归结为它们是将提供的操作数“位移”部分视为位移还是目标地址。

回到vasm,组装:

  org   

  jsr   (,pc,d0)
  nop

label:
  nop

产生:

Sections:
00: "seg80" (80-88)


Source: "vasm-disp.asm"
                                     1:   org   
                                     2: 
00:00000080 4EBB0082                 3:   jsr   (,pc,d0)
00:00000084 4E71                     4:   nop
                                     5: 
                                     6: label:
00:00000086 4E71                     7:   nop
                                     8: 


Symbols by name:
label                            A:00000086

Symbols by value:
00000086 label

显示提供的位移(</code>)被视为操作数的基本目标,并计算并发出负偏移量​​(<code>0x82-0x7e)。

将此与 as 进行对比,其中汇编:

  .org  0x80

  jsr   %pc@(0x04,%d0:w)
  nop

label:
  nop

产生:

68K GAS  as-disp.asm            page 1


   1 0000 0000 0000       .org  0x80
   1      0000 0000 
   1      0000 0000 
   1      0000 0000 
   1      0000 0000 
   2                
   3 0080 4EBB 0004       jsr   %pc@(0x04,%d0:w)
   4 0084 4E71            nop
   5                
   6                label:
   7 0086 4E71            nop
68K GAS  as-disp.asm            page 2


DEFINED SYMBOLS
         as-disp.asm:6      .text:0000000000000086 label

NO UNDEFINED SYMBOLS

显示提供的值 (0x04) 被认为是位移,并直接编码到输出字节中。

在我的情况下,在使用 VASM 时能够在操作数中传递未解析标签的完整地址在微调反汇编算法时非常有用,所以这很可能是我现在要使用的.

在我看来,两者都

  jsr <displacement>(pc,<data register>)

  jsr (<displacement>,pc,<data register>)

是正确的语法。但是

没有人会把这样的代码写入汇编程序。在计算 PC 偏移量时,每个汇编程序所期望的(监控程序可能不同)是(可重定位的)label 而不是文字数字。然后它会根据当前 PC 和标签之间的距离计算数字位移。你只是混淆了那个机制。

您可能会发现,如果您使用除 PC 之外的任何其他地址寄存器,您的语法可能会被接受。大多数汇编器根本不喜欢字面上的 PC 偏移量。您应该期待与短相对分支类似的东西,例如

 bra.s -4

编辑:

如果通过将位移与“*”(当前 PC)相关联,如

 jsr *-4(pc,d0.w)

(虽然没有尝试 vasm)