#MAV-001: Casualidades [cltd y división en IA-32]

001-Casualidad

 

Bueno, esta es la primera tira de MIpS aventuras por la vIA-32 (MAV-32)… Y aunque el chiste sea bastante malo igual voy a explicarlo, probablemente sea instructivo para algún lector.

En principio es importante decir que la división siempre es una de esas operaciones aritméticas que suelen enredar un poco a los principiantes en lenguaje ensamblador IA-32, ya que, la división tiene varios procesos que son tácitos.

A continuación voy a explicarles un poco el proceso de división y el papel que juega la instrucción cltd.

En principio una operación típica de división tendría la siguiente forma:

cltd
idivl Divisor

Estas dos simples instrucciones hacen todo lo siguiente:

La instrucción cltd toma el valor del signo del registro %eax y lo extiende en el registro %edx. En otras palabras, el valor de 32 bits que tiene el %eax y lo convierte en un valor de 64 bits conformado por el %edx y el %eax. De hecho, cltd significa convert long (valor de 32 bits) to double (valor de 64 bits).

Dado que la representación de los registros es complemento a dos, el cltd coloca ceros si el número es positivo o unos (representación del -1 en complemento a dos) si el número es negativo (explicando así el chiste malo).

Advertencia: recuerda que luego del cltd se pierde cualquier valor que el %edx hubiera tenido.

Luego la instrucción idivl concatena %edx con %eax que lo representaremos [%edx:%eax] y lo divide entre lo que pases como divisor, por ejemplo %ebx. El cociente de la división es un valor entero que queda en el registro %eax y el resto o residuo queda en %edx.