8

之间有什么区别吗

LEA $1000,A0

MOVE #$1000,A0

将地址放入地址注册表?

4

5 回答 5

10

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

于 2012-06-18T17:07:13.903 回答
5

lea指令不会影响标志,而指令move会影响。具体ZC之后会清零move #$1000,a0

于 2012-05-24T15:52:30.490 回答
5

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

MOVE xx,an 不是真正的指令,它是汇编程序允许的,但是如果您查看反汇编结果,您会发现实际指令是 MOVEA。

于 2013-05-02T17:59:38.050 回答
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是显而易见的,否则需要大量代码来计算地址。

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

LEA ($1000),A0

和:

MOVE #$1000,A0

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

于 2020-10-28T10:58:29.427 回答
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- 我不确定。但是,要谈论这LEAMOVE.L处理地址寄存器之间的区别,这绝对是必须考虑的事情。

于 2013-11-04T00:49:54.703 回答