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.
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