mot
语法模块。现在,对于绝大多数重新组装,这个方法很有效,但是有一个问题是操作的有效地址由“程序计数器间接带索引(8位位移)模式”定义。考虑到我现在才开始学习Motorola 68000汇编语言,我想确认我的理解并问一下:这些操作的正确语法是什么?
例如,如果我有两个单词:
4ebb 0004
我将其解释为目标地址是以下内容的JSR:
pc
的内容0x04
d0
的内容
jsr ($04,pc,d0)
使用VASM进行汇编
然而,当我将此反馈到VASM时,它会发出以下错误:
error 2030 in line X of "XXXX.asm": displacement out of range
> jsr ($04,pc,d0)
这个错误看起来很奇怪,因为由于使用 d0
寄存器,位移量直到运行时才能确定。通过尝试,似乎它使用操作数的第一部分($04
)作为绝对目标地址,并基于此计算不同的位移量。
使用 GNU 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 $80
jsr (label,pc,d0)
nop
label:
nop
生成一个类似如下的清单文件:
Sections:
00: "seg80" (80-88)
Source: "vasm-label.asm"
1: org $80
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 $80
jsr ($04,pc,d0)
nop
label:
nop
生成:
Sections:
00: "seg80" (80-88)
Source: "vasm-disp.asm"
1: org $80
2:
00:00000080 4EBB0082 3: jsr ($04,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
展示了提供的位移(
$04
)被视为操作数的基本目标,并计算并发出一个负偏移量(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调整反汇编算法时,能够传递未解析标签的完整地址作为操作数是非常有用的,因此这很可能是我现在要使用的方法。