之间是否有任何差异
LEA $1000,A0
和
MOVE #$1000,A0
将地址放在地址注册表中?
答案 0 :(得分:8)
在这种情况下,将没有可观察到的差异(与接受的答案声明不同 - MOVE示例将组合为MOVEA,它不改变CCR,请参阅M68K参考手册第4-116页至4-120)。
答案 1 :(得分:5)
lea
指令不影响move
指令所在的标志。具体而言,Z
和C
将在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),A1
,A1
寄存器将加载A0
值,例如A1 := A0
,其中MOVE (A0),A1
加载单词(默认大小)值从A0
寄存器的存储位置开始,将符号扩展为long(地址寄存器始终为整个寄存器)并将其保存在A1
寄存器中。
因此LEA
提供了地址计算中的地址结果,然后才使用该地址实际进行内存访问。这也是为什么没有LEA #<data>
格式(寻址模式)的原因,因为#<data>
的地址将位于程序空间(与PC相关)中,因为立即数数据是指令的一部分。
当使用更复杂的寻址模式时,LEA
中的真正优势显而易见,否则将需要大量代码来计算地址。
因此,可以使用地址注册目的地的以下非法代码更好地说明原始问题在LEA
和MOVE
上的实际差异:
LEA ($1000),A0
和:
MOVE #$1000,A0
这更清楚地表明LEA
提供了间接寻址的地址,而不实际进行内存访问。
答案 4 :(得分:0)
当我学习如何使用汇编语言(68k)进行编程时,在处理地址寄存器时,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
之间的区别,这绝对是必须要考虑的事情。