[英]Difference between LEA and MOVE.L?
之间有什么区别吗
LEA $1000,A0
和
MOVE #$1000,A0
把一个地址在地址注册?
在这种情况下,将没有可观察到的差异(与公认的答案声明不同 - MOVE 示例将组装为不改变 CCR 的 MOVEA,请参阅 M68K 参考手册第 4-116 页到第 4-120 页)。
lea
指令不会影响标志,而move
指令会影响标志。 具体来说, Z
和C
将在move #$1000,a0
后清零。
Durandal 是正确的,涉及地址寄存器的操作通常对处理器标志没有影响,在这种特殊情况下,两条指令的行为相同并占用完全相同的 cpu 时间(使用短寻址模式的 8 个周期或使用长模式的 12 个周期)。
MOVE xx,an 不是真正的指令,它是汇编器允许的,但是如果您查看反汇编结果,您将看到实际指令是 MOVEA。
使用 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
提供了间接地址,而没有实际进行内存访问。
当我学习如何使用汇编语言 (68k) 进行MOVE.L
时,在处理地址寄存器时指出了关于LEA
和MOVE.L
这个示例的不同之处。 在使用标签方面肯定有很大的不同。
假设你有一个DC.*
的标签Foo
。
LEA Foo, A0 ;Loads Foo into Address Register A0
MOVE.L #Foo, A0 ;Loads Foo into Address Register A0
教训是,在正常情况下,上述两条指令实际上会完成相同的事情。 然而,由于现实生活系统中的“可重定位性”,最底层的可能会导致问题。
仅使用LEA
方法是最安全的。 使用$1000
时是否会出现问题 - 我不确定。 然而,在处理地址寄存器时,要谈论这个LEA
和MOVE.L
之间的区别,这绝对是必须考虑的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.