54822253 Lenguaje Assembler

43
Programación en assembler Programación en assembler bajo emu8086 bajo emu8086 Organización de Computadoras Depto. de Cs. e Ing. de la Computación

Transcript of 54822253 Lenguaje Assembler

Page 1: 54822253 Lenguaje Assembler

Programación en assemblerProgramación en assemblerbajo emu8086bajo emu8086

Organización de Computadoras

Depto. de Cs. e Ing. de la Computación

Page 2: 54822253 Lenguaje Assembler

2

CopyrightCopyright

Copyright © 2010 A. G. Stankevicius

Se asegura la libertad para copiar, distribuir y modificar este documento de acuerdo a los términos de la GNU Free Documentation License, Version 1.2 o cualquiera posterior publicada por la Free Software Foundation, sin secciones invariantes ni textos de cubierta delantera o trasera.

Una copia de esta licencia está siempre disponible en la página http://www.gnu.org/copyleft/fdl.html.

La versión transparente de este documento puede ser obtenida de la siguiente dirección:

http://cs.uns.edu.ar/~ags/teaching

Page 3: 54822253 Lenguaje Assembler

3

ContenidosContenidos

Entorno de programación.Partes de un programa.Directivas al compilador.Arquitectura i8086.Estructuras de control.Accediendo al sistema operativo.Definición de procedimientos.Dispositivos virtuales.

Page 4: 54822253 Lenguaje Assembler

4

Entorno de programaciónEntorno de programación

El lenguaje assembler nos permite hacer un uso de la computadoraa muy bajo nivel.Para mantener a raya la posibilidad de dañar al hardware y/o al software, haremos uso del simulador emu8086.Este simulador no solo recrea al hardware de la PC sino también parte del software de la misma (su BIOS, algunas funciones del SO, etc.).

Page 5: 54822253 Lenguaje Assembler

5

Ciclo de desarrollo bajo Ciclo de desarrollo bajo emu8086emu8086

Escribir el código fuente.Podemos hacer uso del editor propio del entorno o bien editar el código fuente en cualquier otro editor externo.

Simular la ejecución del programa.El entorno de programación compila el código fuente al momento de solicitar su ejecución.De no haber errores, el código máquina resultante es cargado en el CPU simulado y queda listo para su ejecución.

Page 6: 54822253 Lenguaje Assembler

6

Pasos para depurar un Pasos para depurar un programaprograma

En la mayoría de los lenguajes de programación es complicado escribir código 100% libre de errores.Peor aun... en assembler, es todavía más difícil.Por suerte el propio entorno de ejecución, hace las veces de un poderoso entorno de depuración (debugger).

Page 7: 54822253 Lenguaje Assembler

7

Estructura de un archivo Estructura de un archivo fuentefuente

Los archivos fuente son esencialmente archivos de texto.Están compuestos de diferentes secciones, dependiendo del tipode ejecutable que se desea obtener.

En general trabajaremos en el marco dela plantilla para obtener .com, por lo que no va a hacer falta distinguir las distintas secciones de nuestro código fuente.

Page 8: 54822253 Lenguaje Assembler

8

Directivas al compiladorDirectivas al compilador

Las directivas instruyen al compilador, sin generar código máquina.name fija el nombre del programa que estamos escribiendo:name “holamundo”

include nos permite incorporar código de otros archivos fuente:include “mismacros.inc”

equ asocia el resultado de una expresión constante a una etiqueta:TOPE equ 25*4

Page 9: 54822253 Lenguaje Assembler

9

Directivas al compiladorDirectivas al compilador

Existen dos directivas para reservar locaciones de memoria:

db, para reservar un byte:contador db 0

dw, para reservar un word:resultado dw 0

Si no interesa inicializar su contenido, se puede hacer uso de un “?”.Cada locación de memoria puede tener una etiqueta asociada.

Page 10: 54822253 Lenguaje Assembler

10

EtiquetasEtiquetas

Las etiquetas son básicamente direcciones de memoria.Pueden apuntar a locaciones que contienen datos o bien código.

A la izquierda del dato al cual se asocian:arreglo db 16 dup(?)

A la izquierda de la instrucción a la cual se asocian, pero separada por un “:”:lazo: mov ax, 1234h

Page 11: 54822253 Lenguaje Assembler

11

Arquitectura i8086Arquitectura i8086

La arquitectura i8086 fue introducida en 1978.Su éxito dio a lugar a la serie de procesadores 8086, 8088, 80186, 80286, 80386, 80486, Pentium, etc.

Page 12: 54822253 Lenguaje Assembler

12

Registros disponiblesRegistros disponibles

La arquitectura i8086 tiene apenas 8 registros de 16 bits.

SP y BP: suelen tener un rol específico.AX, BX, CX, DX, SI, DI: registros de propósito general.

También cuenta con cuatro registros auxiliares de segmento:

CS (code segment), DS (data segment), ES (extra segment) y SS (stack segment).

Page 13: 54822253 Lenguaje Assembler

13

Registros disponiblesRegistros disponibles

Algunos de estos registros permiten a su vez acceder a los dos campos de 8 bits que lo componen.

Por caso: AX se compone de AH (los 8 bits más significativos) y AL (los 8 bits menos significativos).

El procesador está en modo real:A diferencia de los nuevos procesadores, no brinda protección de memoria.Los distintos procesos comparten el mismo espacio de direcciones.

Page 14: 54822253 Lenguaje Assembler

14

Organización de la Organización de la memoriamemoria

i8086 cuenta con un espaciode direcciones de 20 bits.

Esto es, ¡¡¡apenas 1 megabyte!!! (menos que la memoria disponible en un teléfono celular berreta).

Cómo los registros son de sólo 16 bits, se apela a la segmentación para poder acceder a la totalidad de la memoria.

Para obtener la dirección efectiva se debe hacer uso de un registro de segmento.

Page 15: 54822253 Lenguaje Assembler

15

Organización de la Organización de la memoriamemoria

El registro de segmento que se debe usar se determina según el contexto.Por caso, si BX contiene al valor 1234h y DS al valor 5678h, la referencia [BX] denota en realidad a la locación de memoria 579B4h.Matemáticamente:

EA = BX + DS * 10h579B4h = 1234h + 5678h * 10h

Page 16: 54822253 Lenguaje Assembler

16

Instrucción MOVInstrucción MOV

Sintaxis: mov dest, origenmov bx, 3 ; guarda un 3 en bxmov ax, bx ; copia bx en axmov ax, CONT ; guarda CONT en ax

Restricciones:El destino no puede ser constante.Puede referencia a lo sumo una dirección de memoria.Origen y destino deben ser compatibles, esto de, de igual cantidad de bits.

Page 17: 54822253 Lenguaje Assembler

17

Accediendo a memoriaAccediendo a memoria

Los corchetes denotan el modo de direccionado indirecto:mov bx, CONT ; guarda CONT en bxmov cx, [bx] ; guarda el contenido ; de CONT en cxmov cx, [CONT] ; inst. equivalente

¡No todos los registros pueden ser utilizados para acceder a la memoria!mov ax, [bx] ; válidomov bx, [ax] ; inválido

Page 18: 54822253 Lenguaje Assembler

18

Accediendo a memoriaAccediendo a memoria

La arquitectura i8086 sólo permite acceder a la memoria mediante los registros BX, SI, DI y BP.Estos registros se combinan entre sí para obtener un modo de direccionado base-indexado.También es posible incluir un desplazamiento constante:

bxó

bp

sió

dioffset++[ ]

Page 19: 54822253 Lenguaje Assembler

19

Accediendo a memoriaAccediendo a memoria

Ya que ambos operandos tienen que ser compatibles, en ocasiones debemos explicitar el tamaño:mov word prt [CONT], 1mov bx, CONTmov ax, [CONT]mov byte ptr [bx], FFh

Los modificadores son byte ptr y word ptr.

Page 20: 54822253 Lenguaje Assembler

20

Instrucciones aritméticasInstrucciones aritméticas

La arquitectura i8086 cuenta con las operaciones aritméticas usuales:add destino, operandosub destino, operandoinc destinodec destinonot destinoneg destinomul operando / imul operandodiv divisor / idiv divisor

Page 21: 54822253 Lenguaje Assembler

21

Estructuras de controlEstructuras de control

Los lenguajes de alto nivel hacen uso de diversas estructuras de control.Assembler es más básico, sólo cuenta con las siguientes facilidades:

La instrucción cmp: para comparar magnitudes entre sí.Los flags: para recordar el resultado de la última comparación u otras operaciones.Los saltos: para cambiar el flujo de ejecución de forma condicionada o no.

Page 22: 54822253 Lenguaje Assembler

22

Principales FlagsPrincipales Flags

La arquitectura i8086 cuenta con diversos flags, los cuales reflejan el resultado de la última comparación.

Para los enteros no signados se usan los flags zero (ZF) y carry (CF).Para los enteros signados se usan los flags overflow (OF) y sign (SF).

La mayoría de las operaciones aritméticas también afectan los flags.

Page 23: 54822253 Lenguaje Assembler

23

Instrucción CMPInstrucción CMP

Sintáxis: cmp primero, segundo Computa primero – segundo y luego modifica los flags de manera acorde:

Si resultado = 0 (primero == segundo):ZF = 1; CF = 0

Si resultado > 0 (primero > segundo):ZF = 0; CF = 0SF = OF

Si resultado < 0 (primero < segundo):ZF = 0; CF = 1SF != OF

Page 24: 54822253 Lenguaje Assembler

24

Instrucción JMPInstrucción JMP

Sintaxis: jmp dest / jmp short destjmp infinite-loopjmp short label-cercano

Los saltos incondicionales siempre transfieren el control a una cierta dirección de memoria sin tener en cuenta el estado de los flags.La instrucción a continuación de un jmp jamás se ejecuta...

...salvo que sea el destino de un salto.

Page 25: 54822253 Lenguaje Assembler

25

Saltos condicionalesSaltos condicionales

En los saltos condicionales no siempre se produce la transferencia de control.El salto se realiza o no dependiendo del estado de uno o más flags.Los saltos más sencillos dependende sólo un flag (no son frecuentes).Los saltos más complejos dependende múltiples flags a la vez (son más frecuentes).

Page 26: 54822253 Lenguaje Assembler

26

Saltos condicionalesSaltos condicionales

Saltos simples:jz dest / jnz dest: depende de ZF.jo dest / jno dest: depende de OF.js dest / jns dest: depende de SF.jc dest / jnc dest: depende de CF.jp dest / jnp dest: depende de PF.

Si el flag en cuestión está activo se produce el salto.Caso contrario, la ejecución continúa en la instrucción que sigue al salto.

Page 27: 54822253 Lenguaje Assembler

27

Saltos condicionalesSaltos condicionales

Saltos condicionales para magnitudes signadas (suponiendo que se acabade ejecutar cmp ax, bx):je dest: salta si ax == bx.jne dest: salta si ax != bx.jl dest / jnge dest: salta si ax < bx.jle dest / jng dest: salta si ax <= bx.jg dest / jnle dest: salta si ax > bx.jge dest / jnl dest: salta si ax >= bx.

Page 28: 54822253 Lenguaje Assembler

28

Saltos condicionalesSaltos condicionales

Saltos condicionales para magnitudes no signadas (suponiendo que se acaba de ejecutar cmp ax, bx):je dest: salta si ax == bx.jne dest: salta si ax != bx.jb dest / jnae dest: salta si ax < bx.jbe dest / jna dest: salta si ax <= bx.ja dest / jnbe dest: salta si ax > bx.jae dest / jnb dest: salta si ax >= bx.

Page 29: 54822253 Lenguaje Assembler

29

IF-THEN-ELSEIF-THEN-ELSE

La estructura de control condicional se codifica fácilmente:

; if (a > 15) { b = 32; }; else { a = a + 1; }mov ax, [a]cmp ax, 15 ; comparo a con 15jng else ; ir a “else” si <=mov word ptr [b], 32 ; brazo “then”jmp seguir ; else: inc ax ; brazo “else”seguir: … ;resto del programa

Page 30: 54822253 Lenguaje Assembler

30

Estructuras de controlEstructuras de control

Las restantes estructuras de control también se pueden codificar de una manera similar.Ejercicios para ir pensando:

¿Cómo se codifica una secuencia?¿Cómo se codifica una repetición estilo while o repeat-until? ¿Y una estilo for?

En este punto, estamos en condiciones de comenzar a resolver el Práctico 8.

Page 31: 54822253 Lenguaje Assembler

31

Nuestro primer ¡hNuestro primer ¡hola ola mundo!mundo!

Para poder encarar nuestro primer “hola mundo” en assembler, sólo resta resolver un aspecto: la entrada/salida.El sistema operativo es el encargado de gestionar ese aspecto.El entorno de programación también emula una parte de un antiguo sistema operativo llamado DOS.También se emula una parte del propio BIOS de la máquina.

Page 32: 54822253 Lenguaje Assembler

32

Llamadas al sistemaLlamadas al sistema

La invocación a los servicios provistos por el sistema operativo se realiza mediante las interrupciones.

Por caso, el DOS brinda muchos de sus servicios mediante la interrupción 21h.

El servicio solicitado se suele especificar mediante alguno delos registros de la máquina.

Bajo DOS, el valor del registro AH al momento de la interrupción indicael servicio solicitado.

Page 33: 54822253 Lenguaje Assembler

33

Llamadas al sistemaLlamadas al sistema

Análogamente se pueden acceder a los servicios provistos por el BIOS.El propio DOS implementa el conjunto de servicios que brinda apelando a los servicios provistos por el BIOS.El listado preciso de los servicios emulados por el entorno se encuentra disponible en la ayuda del mismo.

Page 34: 54822253 Lenguaje Assembler

34

Ejemplo concretoEjemplo concreto

Por ejemplo, para mostrar una cadena de texto por pantalla podemos usar el servicio 09h de la interrupción 21h:

Cargar el número de servicio solicitado en el registro AH.Cargar el offset del mensaje que se quiere mostrar por pantalla en el registro DX.Invocar a la interrupción correspondiente.

Cabe acotar que DOS asume que toda cadenas de texto termina con un “$”.

Page 35: 54822253 Lenguaje Assembler

35

Nuestro primer programaNuestro primer programa

org 100hjmp comienzo ; ¿por qué hará falta?texto db 'Hola mundo!',10, 13, '$'comienzo:mov ah, 09hmov dx, offset textoint 21h ; el texto aparecerá en ; donde esté el cursorint 20h ; indicamos al DOS que ; la ejecución ha finalizado

Page 36: 54822253 Lenguaje Assembler

36

Invocación a Invocación a procedimientosprocedimientos

La invocación a un procedimiento no difiere en gran medida de los saltos convencionales:Se adopta la convención de dejar en el tope la pila la dirección a la cuál se debe retornar.Las instrucciones call y ret permiten simplificar la invocación a los procedimientos y el posterior retorno.

Page 37: 54822253 Lenguaje Assembler

37

Invocación a Invocación a procedimientosprocedimientos

Existen dos alternativas a la hora de evitar que se pierda información al invocar a un procedimiento:

Quien invoca puede encargarse de almacenar los registros que no desea se vean afectados por el procedimiento.O bien, quien es invocado puede ocuparse de guardar sólo los registros que serán usados por el procedimiento.

Ambas soluciones tienen ventajas y desventajas... ¿cuáles son?

Page 38: 54822253 Lenguaje Assembler

38

Ejemplo de “quien invoca Ejemplo de “quien invoca guarda”guarda”

mov ax, [unvalor]mov bx, [otrovalor]push bx ; alcena bxcall triplicar ; procedimiento para ; triplicar axpop bx ; restaura bx...

triplicar:mov cx, 3mul cx ; multiplica por 3ret ; retorna

Page 39: 54822253 Lenguaje Assembler

39

Ejemplo de “quien es Ejemplo de “quien es invocado guarda”invocado guarda”

mov ax, [unvalor]mov bx, [otrovalor]call triplicar ; procedimiento para... ; triplicar ax

triplicar:push cx ; almacena cxpush dx ; almacena dxmov cx, 3mul cx ; multiplica por 3pop dx ; recupera dxpop cx ; recupera cxret ; retorna

Page 40: 54822253 Lenguaje Assembler

40

Definición de un Definición de un procedimientoprocedimiento

A fin de mejorar la legibilidad del código fuente se puede hacer usode las directivas proc y endp.Por caso, la rutina del ejemplo anterior puede ser reescrita como el siguiente procedimiento:triplicar proc

... ; cuerpo del procedimientoret

triplicar endp

Page 41: 54822253 Lenguaje Assembler

41

Macros predefinidasMacros predefinidas

El entorno de programación brinda un conjunto de macros predefinidas para simplificar la gestión de la interacción con el usuario.

Consultar el documento “emu8086.inc”, presente en la carpeta “inc”.

Es posible definir nuestras propias macro mediante las directivas al compilador macro y endm.

La sintáxis es análoga a proc y endp.

Page 42: 54822253 Lenguaje Assembler

42

Dispositivos virtualesDispositivos virtuales

El entorno de programación emu8086 brinda acceso al programador a un conjunto de dispositivos virtuales.printer (simula una impresora).display (simula a un display de siete segmentos de varios dígitos).thermostate (simula a un termómetro calentado por un mechero bunsen)stepper_motor (simula a un motor eléctrico paso a paso)

Page 43: 54822253 Lenguaje Assembler

43

Dispositivos virtualesDispositivos virtuales

La comunicación con estos dispositivos es directa, sin pasar por el SO.Un determinado puerto de lectura y/o de escritura permite acceder a sus principales funciones.

Por ejemplo, el dispositivo display se controla enviando palabras al puerto 199.mov ax, 1234out 199, ax