domingo, 28 de octubre de 2018

Lenguaje Ensamblador ( I )

El estudio de este lenguaje de me ha permitido ver la programación desde un punto de vista diferente, si bien es cierto que el desarrollo puede ser inicialmente menos fluido que con los lenguajes de alto nivel, me parece que nos permite tener un mejor conocimiento sobre como funcionan nuestros programas.

Este lenguaje nos permite entonces interactuar de una manera diferente con la máquina diría yo que algo mas de tu a tu, puesto que vemos con algo mas de detalle como el procesador interactua con la información que vamos suministrando al programa y los resultados que el va generando.

Empecemos por el principio, el procesador de una computadora basa su trabajo en unos elementos llamados Registros, los cuales utiliza para obtener información, procesarla y devolver resultados, tareas que realiza mediante su conjunto de instrucciones ambos elementos tanto los registros como el conjunto de instrucciones dependen de su arquitectura.

Las entradas que escribo de momento corresponden a la arquitectura intel x86_64.



Los Registros 


La siguiente tabla nos muestras los registros de propósito general del procesador:


64 Bits
32 Bits
16 Bits
8 Bits
4B Altos
4B Bajos
RAX
EAX
AX
AH
AL
RBX
EBX
BX
BH
BL
RCX
ECX
CX
CH
CL
RDX
EDX
DX
DH
DL
RSI
ESI
SI
SIH
SIL
RDI
EDI
DI
DIH
DIL
RBP
EBP
BP
BPH
BPL
RSP
ESP
SP
SPH
SPL
R8
R8D
R8W
R8B
R9
R9D
R9W
R9B
R10
R10D
R10W
R10B
R11
R11D
R11W
R11B
R12
R12D
R12W
R12B
R13
R13D
R12W
R12B
R14
R14D
R14W
R14B
R15
R15D
R15W
R15B

Como mencionaba mas arriba estos registros son los que usa el procesador para recibir y devolver información, esto nos lleva a que no se usan tipos de variables como en los lenguajes de alto nivel, en lugar de ello solo hay tamaños de variables con las que trabajamos.

En teoría podemos usar estos registros de la manera como mejor nos convenga solo que en la práctica existen algunas convenciones que es mejor respetar como las siguientes:

Registro Stack Pointer ( RSP )

Este registro habitualmente contiene un puntero un al tope del Stack o Pila, ese espacio que usamos para almacenar las variables locales, por lo que no suelen dársele otro tipo de usos. 


Registro Base Pointer ( RBP )

Similar al anterior este registro no suele asignarselen tareas diferentes porque habitualmente contiene un puntero a la base del Stack o Pila. 


Registro Puntero a Instrucción ( RIP )


Adicional a los registros de propósito general, existen registros especiales como este el cual es un puntero a la siguiente instrucción a ejecutar. 


Registro Flag ( rFlags )


El registro rFlags es usado por la CPU para guardar estados y controlar la información. Este registro es actualizado por la CPU con cada instrucción que se ejecuta y no es directamente accesible por los programas.


Nombre
Simbolo
Bit
Uso
Acarreo
C
0
Usado para indicar que la operación previa genero un acarreo es decir cuando una suma sin signo excede el tamaño de almacenamiento de la variable de destino o cuando se resta un entero grande a uno mas pequeño.
Paridad
P
2
Usado para indicar si como resultado de la operación previa el ultimo byte contiene una cantidad par de 1’s .
Ajuste
A
4
Usado para soportar operaciones Decimal codificado en Binario.
Zero
Z
6
Usado para indicar si el resultado de la operación previa genero un 0 en el operando de destino.
Signo
S
7
Usado para indicar si el resultado de la operación previa genero un cambio de signo en el operador de destino.
Direccion
D
10
Usado para especificar la dirección (Incremento o Decremento) en operaciones con cadenas.
Overflow
O
11
Usado para indicar si el resultado de la operación previa genero un desbordamiento con cambio de signo en el operando de destino.
  
Representación de datos

La representación de los datos para el procesador siempre es la misma solo uno 1’s y 0’s por tanto somos nosotros quienes dotamos de un contexto la información y al interpretamos de diferentes formas. Dado que operar en el sistema binario, es mas complejo de lo que quisieramos para trabajar cuando se programa en ensamblador se suele entonces realizar las operaciones en decimal o hexadecimal.

Por tanto es importante familiarizarnos con el sistema hexadecimal, si queremos obtener fluides en la lectura de programas cuando usamos un depurador, en lo que respecta a este documento hablare solo de las longitudes de variables.



Tamaño
Bits
Bytes
Rango sin Signo
Rango con signo
Equivalencia en C
Byte
8
1
0 – 255
-128 – 127
Char
Word
16
2
0 – 65535
-32768 – 32767
Short
Dword
32
4
0 – 4924967295
-2,147,463,648 – 2,147,463,647
Int, long, Float
QWord
64
8
0 – 264-1
232 – 232-1
Long long, double, punteros

No hay comentarios.:

Publicar un comentario