LEA和MOVE.L之间的区别?

时间:2012-05-24 15:08:11

标签: assembly 68000

之间是否有任何差异
LEA $1000,A0

MOVE #$1000,A0

将地址放在地址注册表中?

5 个答案:

答案 0 :(得分:8)

在这种情况下,将没有可观察到的差异(与接受的答案声明不同 - MOVE示例将组合为MOVEA,它改变CCR,请参阅M68K参考手册第4-116页至4-120)。

答案 1 :(得分:5)

lea指令不影响move指令所在的标志。具体而言,ZC将在move #$1000,a0之后被清除。

答案 2 :(得分:3)

Durandal是正确的,涉及地址寄存器的操作通常对处理器标志没有影响,在这种特殊情况下,两条指令的行为相同并且采用完全相同的cpu时间(使用短寻址模式的8个周期或使用长的12个周期)模式)。

MOVE xx,一个不是真正的指令,它是汇编程序允许的东西,但是如果你看一下反汇编的结果,你会看到实际的指令是MOVEA。

答案 3 :(得分:1)

使用LEA而不是仅使用MOVE的动机是,LEA可以根据不同的寻址模式访问地址计算的结果。

MOVE #$1000,A0指令将立即数$ 1000移到A0寄存器中,因为助记符中使用了立即指示“#”。 LEA $1000,A0指令指向存储器地址$ 1000,并将该地址加载到A0寄存器中。在这个简单的示例中,结果是相同的,看起来只是一些简单的语法问题,缺少立即指示符“#”。

LEA的实际作用可能会更容易理解:

LEA (A0),A1

和:

MOVE (A0),A1

对于LEA (A0),A1A1寄存器将加载A0值,例如A1 := A0,其中MOVE (A0),A1加载单词(默认大小)值从A0寄存器的存储位置开始,将符号扩展为long(地址寄存器始终为整个寄存器)并将其保存在A1寄存器中。

因此LEA提供了地址计算中的地址结果,然后才使用该地址实际进行内存访问。这也是为什么没有LEA #<data>格式(寻址模式)的原因,因为#<data>的地址将位于程序空间(与PC相关)中,因为立即数数据是指令的一部分。

当使用更复杂的寻址模式时,LEA中的真正优势显而易见,否则将需要大量代码来计算地址。

因此,可以使用地址注册目的地的以下非法代码更好地说明原始问题在LEAMOVE上的实际差异:

LEA ($1000),A0

和:

MOVE #$1000,A0

这更清楚地表明LEA提供了间接寻址的地址,而不实际进行内存访问。

答案 4 :(得分:0)

当我学习如何使用汇编语言(68k)进行编程时,在处理地址寄存器时,LEAMOVE.L的这个例子有所不同。在使用标签方面肯定存在重大差异。

假设您为某些Foo设置了标签DC.*

LEA Foo, A0       ;Loads Foo into Address Register A0

MOVE.L #Foo, A0   ;Loads Foo into Address Register A0

经验教训是,在正常情况下,上述两条指令实际上会完成同样的事情。但是,由于现实生活系统中的“可重新定位”,底层可能会导致问题。

使用LEA方法最安全。使用$1000时是否存在问题 - 我不确定。但是,在处理地址寄存器时,要谈谈这个LEAMOVE.L之间的区别,这绝对是必须要考虑的事情。