之间有什么区别吗
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)编程时,在这个例子中指出了一个不同之处,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
处理地址寄存器之间的区别,这绝对是必须考虑的事情。