繁体   English   中英

LEA 和 MOVE.L 的区别?

[英]Difference between LEA and MOVE.L?

之间有什么区别吗

LEA $1000,A0

MOVE #$1000,A0

把一个地址在地址注册?

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

lea指令不会影响标志,而move指令会影响标志。 具体来说, ZC将在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),A1A1寄存器加载A0值,如A1 := A0 ,其中MOVE (A0),A1A0寄存器的内存位置加载字(默认大小)值,符号将值扩展为 long(对于地址寄存器总是整个寄存器)并将值保存在A1寄存器中。

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

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

因此,原始问题中LEAMOVE的实际差异可以用此地址寄存器目的地(可能是数据寄存器目的地)的非法代码来更好地说明:

LEA ($1000),A0

和:

MOVE #$1000,A0

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

当我学习如何使用汇编语言 (68k) 进行MOVE.L时,在处理地址寄存器时指出了关于LEAMOVE.L这个示例的不同之处。 在使用标签方面肯定有很大的不同。

假设你有一个DC.*的标签Foo

LEA Foo, A0       ;Loads Foo into Address Register A0

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM