Motorola 68k 寻址错误
Motorola 68k Addressing errors
所以,基本上,我周三考试,周五开始学习68k汇编,因为我一直忙着准备数学考试,周五通过了(我知道你不在乎,但我这样说是为了让您不认为我是******。)无论如何,我正在尝试编写一个子例程,将 [i] 与数字 #12 进行比较。 IF [i]=#12, then memory offset ($8200+[i])=D3-#1, ELSE memory offset($8100+[i])=2*D3.当我尝试 assemble 这个(使用 ASIMTOOL)时,它给了我这些错误
ERROR in line 10: Displacement out of range
ERROR in line 12: Displacement out of range
ERROR in line 15: Invalid syntax
ERROR in line 16: Invalid syntax
我知道这段代码是一大堆废话,但我没有人帮助我,我正在尝试自己完成。如果你能帮忙,那就太棒了,谢谢。这是代码:
ORG 00
START MOVE.l #0,D3
MOVEA.l #00,a0
MOVEA.l #00,a1
CMP.w #12,i
BEQ.s VERO
JMP FALSO
VERO: SUB.w #1,D3
MOVE.l D3,i(a0)
FALSO: MULU.w #2,D3
MOVE.w D3,i(a1)
STOP #2000
i DC.w 12
x DC.w #4
y DC.w #3
END START
您可能需要下载 M68000 程序员参考手册。以下是该文档 ("Table 2-4. Effective Addressing Modes and Categories") 中寻址模式的摘要:
Addressing Modes Syntax
Register Direct
Data Dn
Address An
Register Indirect
Address (An)
Address with Postincrement (An)+
Address with Predecrement -(An)
Address with Displacement (d16,An)
Address Register Indirect with Index
8-Bit Displacement (d8,An,Xn)
Base Displacement (bd,An,Xn)
Memory Indirect
Postindexed ([bd,An],Xn,od)
Preindexed ([bd,An,Xn],od)
Program Counter Indirect
with Displacement (d16,PC)
Program Counter Indirect with Index
8-Bit Displacement (d8,PC,Xn)
Base Displacement (bd,PC,Xn)
Program Counter Memory Indirect
Postindexed ([bd,PC],Xn,od)
Preindexed ([bd,PC,Xn],od)
Absolute Data Addressing
Short (xxx).W
Long (xxx).L
Immediate #<xxx>
匹配MOVE.l D3,i(a0)
的寻址方式为"Register Indirect, Address with Displacement"。问题是您似乎试图从变量中加载值并将其用作单个指令中的位移。位移需要是一个立即常数,所以这就是它不起作用的原因。您可以做的是使用 ADDA
将 i
的值添加到 a0
,然后执行 move.l d3,(a0)
.
而且您可能应该从 DC.w
中删除 #
标志。
所以,基本上,我周三考试,周五开始学习68k汇编,因为我一直忙着准备数学考试,周五通过了(我知道你不在乎,但我这样说是为了让您不认为我是******。)无论如何,我正在尝试编写一个子例程,将 [i] 与数字 #12 进行比较。 IF [i]=#12, then memory offset ($8200+[i])=D3-#1, ELSE memory offset($8100+[i])=2*D3.当我尝试 assemble 这个(使用 ASIMTOOL)时,它给了我这些错误
ERROR in line 10: Displacement out of range
ERROR in line 12: Displacement out of range
ERROR in line 15: Invalid syntax
ERROR in line 16: Invalid syntax
我知道这段代码是一大堆废话,但我没有人帮助我,我正在尝试自己完成。如果你能帮忙,那就太棒了,谢谢。这是代码:
ORG 00
START MOVE.l #0,D3
MOVEA.l #00,a0
MOVEA.l #00,a1
CMP.w #12,i
BEQ.s VERO
JMP FALSO
VERO: SUB.w #1,D3
MOVE.l D3,i(a0)
FALSO: MULU.w #2,D3
MOVE.w D3,i(a1)
STOP #2000
i DC.w 12
x DC.w #4
y DC.w #3
END START
您可能需要下载 M68000 程序员参考手册。以下是该文档 ("Table 2-4. Effective Addressing Modes and Categories") 中寻址模式的摘要:
Addressing Modes Syntax
Register Direct
Data Dn
Address An
Register Indirect
Address (An)
Address with Postincrement (An)+
Address with Predecrement -(An)
Address with Displacement (d16,An)
Address Register Indirect with Index
8-Bit Displacement (d8,An,Xn)
Base Displacement (bd,An,Xn)
Memory Indirect
Postindexed ([bd,An],Xn,od)
Preindexed ([bd,An,Xn],od)
Program Counter Indirect
with Displacement (d16,PC)
Program Counter Indirect with Index
8-Bit Displacement (d8,PC,Xn)
Base Displacement (bd,PC,Xn)
Program Counter Memory Indirect
Postindexed ([bd,PC],Xn,od)
Preindexed ([bd,PC,Xn],od)
Absolute Data Addressing
Short (xxx).W
Long (xxx).L
Immediate #<xxx>
匹配MOVE.l D3,i(a0)
的寻址方式为"Register Indirect, Address with Displacement"。问题是您似乎试图从变量中加载值并将其用作单个指令中的位移。位移需要是一个立即常数,所以这就是它不起作用的原因。您可以做的是使用 ADDA
将 i
的值添加到 a0
,然后执行 move.l d3,(a0)
.
而且您可能应该从 DC.w
中删除 #
标志。