Programación - Lenguaje Ensamblador
Programación - Lenguaje Ensamblador
Programación - Lenguaje Ensamblador
Características generales
Procesadores creados hacia mediado y fines de los ’70. Son los primeros procesadores
de 16 bits, es decir, de longitud iniciaron la era de los procesadores x86. El 8088 fue
utilizado en la IBM PC (IBM Personal Computer o Computador Personal IBM). Ellos
tenías características muy similares, iguales en muchos casos, pero si se
diferenciaban en el bus de datos. El 8086 tenía un bus de datos de 16 bits y el 8088,
en cambio, de 8 bits.
Grupo de instrucciones
Tipos de datos
• ASCII
• BCD
1
© Universidad de Palermo Prohibida la reproducción total o parcial de imágenes y textos.
• 8 bits: [0, 255]
Registros
Los registros que finalizan con “X” pueden ser tratados como un
todo, es decir operando con sus 16 bits (2 bytes), o pueden
operarse de a 1 byte. El byte menos significativo se denominará
con la letra final “L” (por Low) y el byte más significativo se
denominará con la letra final “H” (por High). Como ejemplo de
esto se puede ver como se suman dos operandos de 16 bits o dos
de 8 bits:
2
© Universidad de Palermo Prohibida la reproducción total o parcial de imágenes y textos.
Registros de banderas
• IF: Interrupción ("Interrupt Flag") En “1” habilita que el procesador atienda las
interrupciones de hardware enmascarables. En “0” las ignora
• TF: Trampa ("Trap Flag") En “1”, el procesador genera automáticamente una
interrupción del Tipo 1 después de la ejecución de cada instrucción para permitir
insertar código depurador de programa. Normalmente está en “0”
• AF: Acarreo auxiliar (“Auxiliary Carry Flag”) Indicador de acarreo entre bit 7 y
bit 8 de los registros AX, BX, CX y DX utilizado para el ajuste en operaciones
aritméticas en BCD (Binary Coded Decimals)
• PF: Paridad ("Parity Flag") Si está en “1” indica un número par de unos en el
registro resultado de la operación
• CF: Acarreo ("Carry Flag") Indicador de acarreo del bit más significativo que
puede ocurrir en las operaciones aritméticas de suma y resta
Nótese que se indican todos los registros antes mencionados junto con su contenido
en hexadecimal después del “=” excepto las banderas. Se pueden ver 8 de las 9
banderas antes descriptas pero en lugar de ver su valor con “0” o “1” existen pares
de letras cuyo significado se detalla a continuación:
3
© Universidad de Palermo Prohibida la reproducción total o parcial de imágenes y textos.
Bit Indicador Si su valor es “1” Si su valor es “0”
DIRECCIONAMIENTO DE MEMORIA
Para esto, Intel define que cada segmento será de 64K posiciones de memoria, es
decir, de 0000h a FFFFh, que son 16 bits. Dentro de cada segmento se podrá
“direccionar” cada posición de memoria a través del Desplazamiento.
A las primeras 64K direcciones formarán parte del Segmento 0, es decir, las primeras
64K direcciones se podrán encontrar desde 0000:0000 hasta 0000:FFFF, todos valores
hexadecimales. La posición cero será 0000:0000, la 1 será 0000:0001 y así
sucesivamente.
4
© Universidad de Palermo Prohibida la reproducción total o parcial de imágenes y textos.
De esta manera, la posición absoluta 16 (00000h) de la memoria es, según el segmento
0, la dirección 0000:0010, si nos referimos desde el segmento 1 será 0001:0000. La 17
será 0001:0001, la 18 0001:0002 y así sucesivamente.
Como podemos ver, una misma dirección absoluta de memoria puede tener más de
una dirección segmentada o relativa al segmento que se tome como referencia.
Veamos por ejemplo la posición de memoria absoluta 6.250 = (0186Ah). ¿Cómo podré
direccionarla en la memoria segmentada? Tomemos el ejemplo de direccionamiento
tomando como base los segmentos 0,1, 2 y 3.
• Multiplicando el valor del segmento por 16d o 10h, es decir, se lo desplaza hacia la
izquierda inyectando un “0” por derecha
Ejemplo: 12B4:8765
5
© Universidad de Palermo Prohibida la reproducción total o parcial de imágenes y textos.
• 12B40h + 8765h = 1B2A5h
El D.O.S. DEBUG
Acceso al DEBUG
• Una vez abierta una ventana con el símbolo del sistema, tipear “debug” y
presionar <Enter>
6
© Universidad de Palermo Prohibida la reproducción total o parcial de imágenes y textos.
• Para salir del debug tipear “q” y presionar <Enter>
• Alterar su extensión y cambiar el “.txt” final por “.exe”. Si no puede ver las
extensiones de los archivos debe buscar la opción “Cambiar opciones de carpeta y
bpusqueda” y en la solapa <Ver> ubicar la marca “Ocultar las extensiones de
archivos ara tipos e archivos conocidos” y desmarcarla. Presionar <Aplicar> y
<Aceptar>. Ahora debieran verse.
• Ir al final y después de “# You can put your MOUNT lines here.“, verificar que
existan las siguientes líneas; sino, agregarlas
7
© Universidad de Palermo Prohibida la reproducción total o parcial de imágenes y textos.
• Estamos en condiciones de comenzar a trabajar con el DEBUG tipeando “debug” y
presionando <Enter>
Utilizando el DEBUG
Una vez ejecutado el programa DEBUG, aparecerá el símbolo “-“ como indicador para
tipear los comandos del DEBUG como se muestra en la siguiente pantalla:
Todos los comandos del DEBUG deben tipearse y finalizarse presionando el <Enter>.
8
© Universidad de Palermo Prohibida la reproducción total o parcial de imágenes y textos.
Q (Quit)
SINTAXIS: q
Tipeando “q” o “Q” se vuelve a la línea de comandos del D.O.S. Para salir del D.O.S y
la máquina virtual se debe tipear “exit” y presionar <Enter>.
R (Register)
Tipeando “r” o “R” se podrá ver el contenido de todos los registros y debajo de ellos
se ve la posición de memoria donde apunta en contador de programa y cuál es la
instrucción que en ese lugar existe.
D (Dump)
SINTAXIS: d [rango]
9
© Universidad de Palermo Prohibida la reproducción total o parcial de imágenes y textos.
Se puede pedir ver un rango de “N” bytes a partir de una dirección específica hasta
otra dirección.
E (Edit)
Si se usa solo la dirección, se editarán los datos byte por byte de la siguiente
manera. Se cambiará el dato que está en la dirección DS:0204. Primero se muestra la
memoria antes del cambio y luego después del cambio. Al tipear “e 204” se muestra
el contenido que es “3Ch” y aparece un guión titilante para tipear el dato que se
quiere colocar en esa posición de memoria. Si tipeamos “45h” y presionamos <Enter>
el dato se habrá modificado.
10
© Universidad de Palermo Prohibida la reproducción total o parcial de imágenes y textos.
En cada flecha “amarilla” se presionó la <Barra espaciadora> y en la flecha “Naranja”
se presionó <Enter>. Se pueden ver las posiciones de memoria cambiadas recuadradas
en “verde”.
A (Assemble)
SINTAXIS: a [dirección]
11
© Universidad de Palermo Prohibida la reproducción total o parcial de imágenes y textos.
Si tipeamos MOV AX, 1234 se ingresará en binario B83412. El código de operación
para mover datos la registro AX en forma inmediata es B8 y el dato se guarda en
Little endian siendo 1234h guardado como 3412.
A medida que ingresamos las instrucciones vemos cómo se van incrementando las
posiciones de memoria en función de los bytes que ocupa cada instrucción.
Recordemos que esta arquitectura tiene instrucciones de longitud variable por ser
CISC (Complex Instruction Set Computing). Veamos el siguiente ejemplo:
U (Unassemble)
SINTAXIS: a [rango]
12
© Universidad de Palermo Prohibida la reproducción total o parcial de imágenes y textos.
Podemos ver como se listaron instrucciones desde la posición 073F:0100 hasta la
011F, 20 bytes. También podemos ver a la derecha de cada una de las direcciones de
memoria los respectivos binarios de cada instrucción. Por ejemplo “INC AX” ocupa
solo 1 byte.
Para usar el rango, podremos listar las instrucciones desde una posición y por una
cantidad de bytes específica, como por ejemplo, lo siguiente:
Vemos que el comando “u 0100 L 12” listará los 12h bytes a partir de la dirección
CD:0100 mostrándolo como instrucciones. Este comando tiene el mismo efecto que
tipear “u 100 112”.
T (Trace)
Si se usa este comando en las sentencias CALL (llamado a subrutina) o INT (llamado a
subrutina de interrupción) se depurarán las subrutinas entrando instrucción por
instrucción en ellas. Lo mismo ocurrirá con la sentencia LOOP (bucle) que permitirá
13
© Universidad de Palermo Prohibida la reproducción total o parcial de imágenes y textos.
dar seguimiento a cada paso del bucle hasta que CX sea = 0. Más adelante se verán
ejercicios con estos casos.
P (Proceed)
G (Go)
El punto de ruptura se utiliza para que la unidad de ejecución frene en esa posición.
Vemos en el ejemplo:
Aquí primero con el comando “u” mostramos el programa. Luego con el comando “g
=cs:0108 cs:010E” la unidad de control comienza la ejecución del programa en la
CS:0108 y finaliza en la CS:010E sin ejecutarla. Este comando no muestra los registros
ni pasos intermedios desde el inicio de la ejecución hasta el final o punto de ruptura.
14
© Universidad de Palermo Prohibida la reproducción total o parcial de imágenes y textos.