Codificar en Lenguaje ensamblador y Registro de estado
En este artículo explicamos cómo funciona el registro de estado y cómo se utilizan cuando programamos en lenguaje ensamblador.
Qué es el registro de estado
El registro de estado es un registro que contiene información sobre el estado actual del procesador, dependiendo de la arquitectura este será un registro de 64 bits o un registro de 32 bits (en arquitecturas actuales).
Actualmente solo se utiliza la parte baja del registro, exactamente los 32 bits de menos peso del registro (desde 0 a 31).
Cada bit representa a una bandera o flag que expresa en qué estado se encuentra el procesador.
En programación en lenguaje ensamblador consultamos el registro de estado a través del valor de un solo bit y dependiendo del valor de ese bit interpretaremos una cosa u otra.
Significado de los bits del registros de estado
En este apartado mostamos los bits de estado que vamos a utilizar en el ejemplo de programación en lenguaje ensamblador que hemos realizado.
El bit de Carry, Zero, Sign y Overflow son los que se utilizan más comúnmente y son los que utilizaremos en el ejemplo siguiente.
bit 0 CF
Carry Flag 0 = sin transporte en la operación.
Carry Flag 1 = se ha producido transporte.
bit 2 PF
Parity Flag 0 = número de bits 1 es impar.
Parity Flag 1 = número de bits 1 es par.
bit 6 ZF
Zero Flag 0 = el resultado no cero.
Zero Flag 1 = el resultado es cero.
bit 7 SF
Sign Flag 0 = el resultado no ha sido negativo.
Sign Flag 1 = el resultado ha sido negativo.
bit 11 OF
Overflow Flag 0 = la operación NO ha producido desbordamiento.
Overflow Flag 1 = la operación ha producido desbordamiento.
bit 1-3-5-15-22 y 31 Están sin asignación
Ejemplo de código en lenguaje ensamblador
Este primer ejemplo muestra un trozo de código escrito en lenguaje ensamblador y cómo funcionarían los bits del registro de estado.
Código lenguaje ensamblador
Para realizar este ejemplo el valor que tendrá la variable A será 400h (Hexadecimal).
MOV R1, [A]
MOV R2, [A+60h]
NOT R1
NOT R2
AND R1, [A+60h]
AND R2, [A]
OR R1, R2
Funcionamiento lenguaje ensamblador
En este apartado vamos a desarrollar pasa a paso el código escrito en lenguaje ensamblador:
MOV R1, [A]
Movemos el valor que tiene la memoria a la posición R1 440h, por lo tanto R1 tendrá ahora 440h.
– En este paso los bits del registro de estado estado estarían así:
Z= 0, S=0 , C= 0, V=0
MOV R2, [A+60h]
En este paso movemos el valor que tiene la memoria A más 60h al registro R2, por lo tanto R2 tendrá el valor de 4A0h (440h+60h).
– En este paso los bits del registro de estado quedarían así:
Z= 0, S=0 , C= 0, V=0
NOT R1
Realizamos la negación de R1, ahora R1 tiene este valor en binario 00000000.00000000.0000.0100.0100.0000, si lo negamos tendrá este valor 11111111.11111111.1111.1011.1011.1111, que pasado a hexadecimal es igual a
FFFFFBBFh
– En este paso los bits del registro de estado estarían así:
Z= 0, S=1 , C= 0, V=0
NOT R2
Volvemos a realizar mismo proceso y ahora tenemos el resultado de FFFFFB5Fh
– En este paso los bits del registro de estado quedarían así:
Z= 0, S=1 , C= 0, V=0
AND R1, [A+60h]
Ahora realizamos el AND (bit a bit) con el valor de R1 y el valor de A+60h
R1= 11111111.11111111.1111.1011.1011.1111
[A+60h]= 00000000.00000000.0000.0100.1010.0000
El resultado del AND sería:000000A0h que simplificado sería A0h
– En este paso los bits del registro de estado estarían así:
Z= 0, S=0 , C= 0, V=0
AND R2, [A]
Realizamos el AND de R2 y [A] y obtenemos el siguiente valor 00000040h
– En este paso los bits del registro de estado quedarían así:
Z= 0, S=0 , C= 0, V=0
OR R1, R2
Realizamos el OR (bit a bit) y finalmente tenemos este valor 000000E0h
– En este paso los bits del registro de estado quedarían así:
Z= 0, S=0 , C= 0, V=0
MOV R1,0
Movemos el valor 0 al registro R1, por lo tanto asignamos el valor 0 al registro R1.
– En este ultimo paso los bits del registro de estado quedarían así:
Z= 1, S=0 , C= 0, V=0