Karoshi MSX Community

Desarrollo MSX => Desarrollo (Español/Spanish) => Mensaje iniciado por: j4mk3 en 02 de Febrero de 2011, 04:40:08 pm



Título: Mitos y leyendas del mnemonico CP 0
Publicado por: j4mk3 en 02 de Febrero de 2011, 04:40:08 pm
Supongo que me vais a abuchear ::)...pero tengo que preguntarlo... ::)

¿Produciria el mismo resultado...
Código:
ld a,[HL]
and 00001111b
cp 0
jp z,ESZERO
que ...
Código:
ld a,[HL]
and 00001111b
jp z,ESZERO
?

¿Es cierto que los CP 0 no tienen sentido si la operación anterior ya da un resultado (cero o no) dado que pone el flag Z indicandolo ?
¿Que verdad hay en toda esta mitologia del CP 0 ?


Título: Re: Mitos y leyendas del mnemonico CP 0
Publicado por: OKI09 en 02 de Febrero de 2011, 06:22:20 pm
Al hacer una operacion logica con el acumulador, como es :

AND 00001111b

Si es cero el flag Z se activara solo, no tienes porque hacer el CP 0.

Funcionarian las dos opciones, pero la segunda ocuparia menos Bytes.


Título: Re: Mitos y leyendas del mnemonico CP 0
Publicado por: j4mk3 en 02 de Febrero de 2011, 06:58:52 pm
¿ Y tras un LD A,[HL] que lleve un cero a A?
¿ Se pone el flag Z a cero ?


Título: Re: Mitos y leyendas del mnemonico CP 0
Publicado por: pitpan en 02 de Febrero de 2011, 07:09:28 pm
No. En el Z80 las instrucciones de carga no actualizan las banderas de estado, salvo, claro está POP AF. Y puede que alguna otra un poco más rara, que tenga que ver con los registros I o R.

Ojo. Otras instrucciones aritméticas no actualizan la bandera de estado, como los incrementos y decrementos de 16 bits. Es decir, si haces INC HL o DEC BC o cualquiera de sus primos, olvídate de las banderas de acarreo, cero y todas las demás. Hay que comprobarlo a pelo después de la operación. Afortunadamente, las instrucciones ADC, SBC de 16 bits sí que cambian el estado. Pero no así ADD.

Así que la moraleja más sencilla es: RTFM! Es decir, conseguid un buen manual de referencia y aseguraos antes de que os pase como a cualquier hijo de vecino y tiréis a la basura horas tratando de depurar un programa en el que todo es correcto, excepto lo que el programador cree que va a hacer el Z80. A mí me resulta muy práctico tener a la vista el UNDOCUMENTED Z80 de Sean Young y herederos.

Si tenéis más dudas, RTFM. O preguntad aquí, que para eso estamos...



Título: Re: Mitos y leyendas del mnemonico CP 0
Publicado por: OKI09 en 02 de Febrero de 2011, 10:26:18 pm
No tenia ni idea de lo del incremento/decremento  en 16 bits.

Bueno, aunque es un poco logico, pues no actuan directamente sobre el acumulador. ¿no?


Título: Re: Mitos y leyendas del mnemonico CP 0
Publicado por: pitpan en 02 de Febrero de 2011, 10:40:38 pm
No, no es lógico. Todas las instrucciones de incremento / decremento de 8 bits sí que actualizan correctamente las banderas de estado del procesador. Incluso el INC/DEC [HL], es decir, con indirección incluida.

La primera vez que me enfrenté a esto fue programando para GAMEBOY clásica ;) Ah, qué tiempos aquellos, descubriendo el ensamblador...


Título: Re: Mitos y leyendas del mnemonico CP 0
Publicado por: OKI09 en 02 de Febrero de 2011, 10:52:10 pm
Oido cocina.  ;D


Título: Re: Mitos y leyendas del mnemonico CP 0
Publicado por: Metalbrain en 02 de Febrero de 2011, 11:07:28 pm
Y a todo esto, añadir que salvo alguna ocasión muy muy rara en la que querais cambiar con código automodificable el valor de la comparación, para comparar el acumulador con 0 es muchísimo mejor hacer AND A (o bien su equivalente en este caso OR A), con lo que se ahorra 1 byte y varios estados respecto al CP 0 (que hay que evitar).


Título: Re: Mitos y leyendas del mnemonico CP 0
Publicado por: burguera en 03 de Febrero de 2011, 01:12:57 pm
Yo tengo en todo momento abierto un listado de instrucciones del Z80 con indicaciones de como afectan a los flags.


Título: Re: Mitos y leyendas del mnemonico CP 0
Publicado por: aorante en 05 de Febrero de 2011, 11:57:48 am
como se agradece que exista este templo de sabidudida compartida!  :D