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
,目标目的地是以下各项的总和:
pc
的内容
0x04
d0
的内容
(考虑到我将自己限制在 68000,我在扩展词中省略了对 size
和 scale
的任何考虑)。
根据参考手册中如何描述这种寻址模式,我将其发送为:
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)
我一直在为 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
,目标目的地是以下各项的总和:
pc
的内容0x04
d0
的内容
(考虑到我将自己限制在 68000,我在扩展词中省略了对 size
和 scale
的任何考虑)。
根据参考手册中如何描述这种寻址模式,我将其发送为:
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)