这两者之间有什么区别吗?
LEA $1000,A0
并且
MOVE #$1000,A0
将地址放入地址注册表中?
lea
指令不影响标志位,而move
指令会有影响。具体来说,在执行move #$1000,a0
后,Z
和C
会被清除。MOVE #$1000,A0
将立即数$1000移入寄存器A0
,因为助记符中使用了立即数标识"#"。指令LEA $1000,A0
将指向内存地址$1000,并将该地址加载到寄存器A0
中。在这个简单的例子中,结果相同,看起来只是一些简单的语法问题,缺少了立即数标识"#"。LEA
的实际作用:LEA (A0),A1
并且:
MOVE (A0),A1
LEA (A0),A1
指令,将A0
的值加载到A1
寄存器中,类似于A1 := A0
。而MOVE (A0),A1
指令则从A0
寄存器中加载字(默认大小)的值,对值进行符号扩展至长整型(地址寄存器始终为整个寄存器),并将该值保存在A1
寄存器中。
因此,LEA
提供了地址计算结果,然后再用该地址实际访问内存。这也是为什么没有LEA #<data>
格式(寻址模式),因为#<data>
的地址在程序空间中(PC相对),因为立即数据是指令的一部分。
当使用更复杂的寻址模式时,LEA
的真正优势就显现出来了,否则需要编写大量代码来计算地址。
因此,在原问题中,LEA
和MOVE
的实际区别可以更好地用以下非法代码来说明地址寄存器目的地(可能适用于数据寄存器目的地):
LEA ($1000),A0
并且:
MOVE #$1000,A0
LEA
提供间接寻址的地址,而实际上并没有进行内存访问。LEA (A0), A1
相当于简单的 A1 := A0
赋值吗?我觉得有点奇怪,因为 (A0)
是间接寻址模式,人们会期望它的意思是:将 A0
指向的数据加载到 A1
中。 - XouDo(A0)
所代表的间接寻址的地址是什么?当 LEA
提供源参数的地址时,LEA (A0), ...
中的源参数的值是什么? - Morten ZilmerA0
的值只是被复制到A1
中,我无法理解括号符号(A0)
在这里的含义,除非LEA
操作暗示提取源参数的地址。考虑到这一点,文档中的例子LEA Table,A0
会做什么呢?(我猜每种语言都有其不合逻辑/令人困惑的特点) - XouDo(A0)
中的括号符号是一种间接寻址方式,因此在进行MOVE
操作时,将访问由A0
给出的地址处的数据。关于LEA Table,A0
,它意味着获取Table
的地址,因为Table
是一个地址值,而不是立即数,这也在上面的答案中有所涉及。您可以通过下载EASy68K模拟器来尝试此操作。 - Morten ZilmerLEA($1000)。w,A0
和LEA($1000)。l,A0
实际上是有效的LEA寻址模式。 - flamewinglea (A0),A1
等同于 movea.l A0,A1
?我想知道是否存在无法通过调整的 movea
表达 lea
的情况。我认为 lea ($1234,A0),A0
可能是其中之一,但你可以使用 adda.l #$1234,A0
。 - Robert S.LEA
和MOVE.L
的区别。在使用标签方面,确实存在重大差异。Foo
用于某个DC.*
。LEA Foo, A0 ;Loads Foo into Address Register A0
MOVE.L #Foo, A0 ;Loads Foo into Address Register A0
这个教训告诉我们,在正常情况下,上述两个指令实际上会完成相同的事情。然而,在现实系统中由于“可重定位性”,下面的指令可能会引起问题。
最安全的方法是只使用LEA
方法。关于在使用$1000
时是否会出现问题,我不确定。然而,当处理地址寄存器时,谈论这种LEA
和MOVE.L
之间的区别,这绝对是必须考虑的。