Diferença entre LEA e mover.L?
Existem diferenças entre
LEA $1000,A0
e
MOVE #$1000,A0
Para colocar uma morada no registo de endereços?
4 answers
Neste caso, não haverá diferença observável (ao contrário das alegações de resposta aceites-o exemplo de movimento irá montar como MOVEA que não altera o CCR, Ver Manual de referência M68K Pg 4-116 a 4-120).
A instrução {[[0]} não afecta as bandeiras, onde a instrução move
afecta. Especificamente Z
e C
serão limpos após move #$1000,a0
.
Durandal está correcto, as operações que envolvem um registo de endereços não têm geralmente impacto nas opções do processador, neste caso específico as duas instruções irão comportar-se da mesma forma e ter o mesmo tempo de cpu (8 ciclos usando o modo de endereçamento curto ou 12 usando o modo longo).
Mover xx, an não é uma instrução real, é algo que os Montadores permitem, mas se você olhar para o resultado desmontado você verá que a instrução real é MOVEA.
Quando eu estava aprendendo a programar em linguagem de montagem (68k) havia uma diferença apontada em relação a este exemplo de LEA
e MOVE.L
quando se trata de lidar com registros de endereços. Em termos de utilização de rótulos, há definitivamente uma grande diferença.
Diz que tens um rótulo Foo
para alguns DC.*
.
LEA Foo, A0 ;Loads Foo into Address Register A0
MOVE.L #Foo, A0 ;Loads Foo into Address Register A0
A lição foi que, em condições normais, as duas instruções acima de fato realizariam a mesma coisa. No entanto, devido à" deslocalização " em sistemas da vida real, a parte inferior pode causar problemas.
É mais seguro usar a abordagem LEA
. Se pode ou não haver um problema ao usar $1000
- Não tenho a certeza. No entanto, falar sobre a diferença entre este LEA
e MOVE.L
ao lidar com registos de Endereços é definitivamente algo que tem de ser considerado.