¿Hay diferencias entreDiferencia entre LEA y MOVE.L?
LEA $1000,A0
y
MOVE #$1000,A0
para poner una dirección en el registro de direcciones?
¿Hay diferencias entreDiferencia entre LEA y MOVE.L?
LEA $1000,A0
y
MOVE #$1000,A0
para poner una dirección en el registro de direcciones?
En este caso, no habrá diferencia observable (a diferencia de las reivindicaciones respuesta aceptada - el ejemplo de MOVE ensamblará como MOVEA que hace no alterar la CCR, ver M68K Manual de referencia Pg 4-116 a 4-120) .
La instrucción lea
no afecta a los indicadores, donde la instrucción move
sí lo hace. Específicamente, Z
y C
se borrarán después del move #$1000,a0
.
Durandal es correcto, las operaciones que implican un registro de dirección generalmente no tienen impacto en las banderas del procesador; en este caso las dos instrucciones se comportarán igual y tomarán exactamente el mismo tiempo de CPU (8 ciclos usando el modo de direccionamiento corto o 12 usando modo largo).
MOVE xx, an no es una instrucción real, es algo que los ensambladores permiten, pero si observa el resultado desensamblado, verá que la instrucción real es MOVEA.
Cuando estaba aprendiendo a programar en lenguaje ensamblador (68k), se observó una diferencia con respecto a este ejemplo de LEA
y MOVE.L
cuando se trata de registros de direcciones. En términos de usar etiquetas definitivamente hay una gran diferencia.
Digamos que usted tiene una etiqueta Foo
para algunos DC.*
.
LEA Foo, A0 ;Loads Foo into Address Register A0
MOVE.L #Foo, A0 ;Loads Foo into Address Register A0
La lección fue que, en condiciones normales, las dos instrucciones anteriores lograrían lo mismo. Sin embargo, debido a la "reubicación" en los sistemas de la vida real, la de abajo puede causar problemas.
Es más seguro usar el enfoque LEA
. Si o no puede haber un problema al usar $1000
- No estoy seguro. Sin embargo, para hablar sobre la diferencia entre este LEA
y MOVE.L
cuando se trata de registros de direcciones, esto definitivamente es algo que debe considerarse.
No creo que esta afirmación sea completamente correcta. De hecho, hay una diferente en 'reubicación', pero solo si has usado el modo relativo de pc para lea. LEA Foo (pc), A0 es de hecho independiente de la posición, pero LEA Foo, A0 como move.l # Foo, A0 hará que el ensamblador genere una tabla de reubicación para la referencia de la etiqueta. Por supuesto, la versión relativa de la PC tiene algunos inconvenientes, la etiqueta referida tiene que estar en +/- 32k bytes de la instrucción. –
@ yes123 Hoy raramente escribo algo en ensamblaje, pero todavía veo con bastante frecuencia el ensamblado generado por gcc - para comprobar si no se ha vuelto a estropear :-) Pero en ese momento era dueño de una computadora basada en 68k (Atari ST :-)) montaje de escritura era una tarea bastante común para acelerar las rutinas críticas. – hirschhornsalz
otra pequeña diferencia si le interesa :) http://stackoverflow.com/questions/10766855/why-address-register-postincrement-is-a0 – dynamic