La explicación de los "flags" viene a cuento de los saltos condicionales.
Los que hay is visto un mínimo de otros lenguajes recordar‚is las sentencias
FOR y NEXT ( en Basic ), o el IF/THEN/ELSE tambi‚n en estilo Basic pero
encontrable en otros lenguajes. Pues bien, los flags y las instrucciones
condicionales va a ser lo que os encontr‚is en ‚ste capítulo del curso de
Ensamblador.
Vamos con el registro de flags.
A las flags, "banderas", las agrupa un sólo registro de 16 bits, aunque
‚ste no est utilizado por completo, ya que cada flag ocupa un sólo bit.
Pero bueno, ¨ qu‚ son los flags a todo ‚sto ?
Se trata de varios bits, que como siempre pueden valer uno o cero, y
dependiendo de su valor indican varias cosas. El registro de flags es como
sigue:
ÚÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄÂÄÄÄ¿
³ ± ³ ± ³ ± ³ ± ³ O ³ D ³ I ³ T ³ S ³ Z ³ ± ³ A ³ ± ³ P ³ ± ³ C ³
ÀÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÁÄÄÄÙ
O: Overflow D: Dirección I: Interrupciones rehabilitadas
T: Trampa S: Signo Z: Cero
A: Acarreo auxiliar P: Paridad C: Acarreo ±: No utilizado
Cada cuadrito representa un bit como es f cil adivinar. Tambi‚n os dar‚is
cuenta de que cada bit que se utiliza tiene un nombre, y como ver‚is tambi‚n
una utilidad. Aquí explico el significado de cada uno, o al menos de los
m s importantes:
EL FLAG DE ACARREO
Hay veces en la operaciones en las que el número se desborda, o sea, no
cabe en el registro o en la posición de memoria. Imaginemos que tenemos en
AX el número 0FFFFh y le sumamos 0CCCCh. Como es lógico, el resultado no nos
cabr en AX. Al realizar ‚sta suma, tenemos que tener en cuenta que el
siguiente número a 0FFFFh es 0000h, con lo que podremos ver el resultado.
Igual pasar si a 0000h le restamos por ejemplo 1 ( el resultado ser
0FFFFh ). Pero de alguna manera nos tenemos que DAR CUENTA de que ‚sto ha
sucedido.
Cuando se opera y hay acarreo en el último bit sobre el que se ha
operado, el flag de acarreo se pone a uno. O sea, cuando ese número se ha
desbordado. Hay que recordar tambi‚n que las instrucciones INC y DEC no
afectan a ‚ste flag. Veamos los efectos de ‚stas operaciones:
MOV AX,0FFFFh
INC AX ; AX vale ahora 0, el flag de acarreo tambi‚n
DEC AX ; AX vale 0FFFFh, y el flag sigue inalterado
ADD AX,1 ; AX vale 0, y el flag de acarreo est a 1
MOV BX,0000h
ADD BX,50h ; El flag de acarreo se pone a 0, no ha habido
;acarreo en ‚sta operación
SUB AX,1 ; Ahora AX vale otra vez 0FFFFh, y el flag de acarreo
;se pone de nuevo a uno
En resumen, se activa cuando tras una operación hay un paso del valor
m ximo al mínimo o viceversa
Este flag nos va a ser tambi‚n útil al comprobar errores, etc. Por
ejemplo, si buscamos el primer archivo del directorio y no hay ninguno,
‚ste flag se activar , con lo que podremos usar los saltos condicionales,
pero ‚sto ya se explica m s adelante.
EL FLAG DE SIGNO
A veces interesa conocer cuando un número con signo es negativo o positivo.
Evidentemente, ‚sto sólo tiene efecto cuando EFECTIVAMENTE estamos tratando
con números enteros con signo, en complemento a dos. Indica cuando tras una
operación aritm‚tica ( ADD, SUB, INC, DEC o NEG ) o lógica ( AND, OR o XOR )
el resultado es un número en complemento a dos. En realidad es la copia del
bit de mayor peso del byte, el que indica cuando el número es negativo.
Por lo tanto, cuando vale 1 es que el número es negativo y si vale 0 es
que es positivo
EL FLAG DE DESBORDAMIENTO ("Overflow")
Se trata de un flag bastante parecido al de acarreo, pero que actúa con
números en complemento a dos y se activa cuando se pasa del mayor número
positivo ( 127 en un sólo byte ) al menor negativo ( -128 en tama¤o de un
byte ).
Este flag, al contrario que el de acarreo, SI es afectado por las
instrucciones de decremento e incremento.
EL FLAG DE CERO
De los m s sencillitos de comprender. Símplemente se activa cuando el
resultado de una operación aritm‚tica o lógica es cero. A los avispados se
os estar ya ocurriendo la gran utilidad del flag,... tenemos por ejemplo
dos registros, AX y CX, que queremos comparar para saber si son iguales.
Para saberlo, no tendríamos m s que restar uno del otro, y si el resultado
es cero ( o sea, si el flag de cero se pone en uno ), podremos hacer un
salto condicional ( ‚sto lo explico en el próximo número.
O sea, de un
SUB CX,AX
Si son iguales, el flag de cero se pondr a uno.
EL FLAG DE PARIDAD
Se utiliza especialmente en la transmisión de datos para la comprobación
de errores, ya que comprueba si el resultado de la última operación
aritm‚tica o lógica realizada tiene un número par o impar de bits puestos
a uno. Se pondr a uno cuando haya un número par de bits, y a cero cuando
sea impar.
RESTO DE FLAGS
No describir‚ m s flags detalladamente, ya que su importancia es casi
nula; por ejemplo est el flag de interrupción que cuando est activado
evita la posibilidad de interrupciones en secciones críticas de código, o
el de trampa, que cuando est activado provoca una INT 1h cada vez que se
ejecuta otra instrucción, pero creo que su inter‚s es escaso, al menos por
el momento.
INSTRUCCIONES DE COMPARACION
No ibamos a terminar la lección sin ense¤ar nuevas instrucciones !
Nos van a servir bastante para realizar las comparaciones, y son:
CMP y TEST
CMP compara dos registros, o un registro y una dirección de memoria,...
tiene el mismo formato que el SUB ( por ejemplo CMP AX,BX ), tan sólo que
ninguno de los registros es alterado. Si por ejemplo son iguales, el flag
de cero se pondr en uno. Es en realidad un SUB del que no se almacena el
resultado.
TEST, comprobar, se puede realizar con el mismo formato de AND, ya que
es equivalente a ella, tan sólo que no se guarda el resultado, aunque sí se
modifican los flags.
Y en el próximo capítulo veremos como se aplican ‚stos flags, y como
realizar los saltos comparativos.