Programacion de Bajo Nivel

73
PROGRAMACIÓN DE BAJO NIVEL

Transcript of Programacion de Bajo Nivel

Page 1: Programacion de Bajo Nivel

PROGRAMACIÓN DE BAJO NIVEL

Page 2: Programacion de Bajo Nivel

LENGUAJE MÁQUINA

Page 3: Programacion de Bajo Nivel

Máquina Multinivel

Hardware

Lenguaje Ensamblador

Sistema Operativo

Lenguaje Alto Nivel

Aplicación

Bajo Nivel

Page 4: Programacion de Bajo Nivel

Lenguaje Máquina

Es el lenguaje que entiende el hardware del computador.

Es muy restringido y de bajo nivel Instrucciones y datos en forma de patrones

binarios. Normalmente expresados en sistema

hexadecimal. Instruction Set: Conjunto de Instrucciones

del lenguaje máquina de un procesador.

Page 5: Programacion de Bajo Nivel

Lenguaje Máquina El lenguaje máquina depende del

procesador. Existe una incompatibilidad innata entre los distintos procesadores

Cada instrucción tiene una representación determinada en forma de bits, almacenados en memoria.

Los distintos tipos de representación se denominan formato de instrucción

Page 6: Programacion de Bajo Nivel

Propiedades de las instrucciones máquina

• Realizan una única y simple función.

• La decodificación es sencilla

• Utilizan un número fijo de operandos

• Su codificación en bits es bastante sistemática

• Son autocontenidas• Contienen toda la información necesaria para su ejecución• Su interpretación no depende de su posición en el programa o en la memoria

Page 7: Programacion de Bajo Nivel

Propiedades de las instrucciones máquina

Son independientes No requieren de la información de otras

instrucciones para ejecutarse De transferencia de información Transferencia de control Aritméticas Lógicas Comparación Desplazamiento Acceso a bits individuales De entrada/salida Misceláneas

Page 8: Programacion de Bajo Nivel

Formatos de instrucción máquina Cada instrucción debe contener la siguiente información

Operación a realizar Dirección de los operandos Dirección del resultado Dirección de la siguiente instrucción Modo de representación de los operandos

Un formato es un conjunto de bits que contiene dicha información

La longitud del formato es el número de bits que lo componen

Su estructura es el el significado de cada bit dentro de la instrucción

Page 9: Programacion de Bajo Nivel

Formatos de instrucción máquina

Los formatos se dividen en campos “Cadenas de bits contiguas”

Tipos básicos de campos Código de operación

Indica la operación a realizar Dirección (uno o varios)

Indica la dirección de un dato, un resultado o una instrucción

Page 10: Programacion de Bajo Nivel

LENGUAJE ENSAMBLADORDefinición y características básicas

Page 11: Programacion de Bajo Nivel

Lenguaje Ensamblador• Debido a que el computador solo almacena

números, se requiere establecer un criterio para indicar las instrucciones a realizar.

• A cada acción que pueda realizar el computador, se le asocia un número, denominado código de operación (opcode) .

– Una calculadora programable simple podría asignar los opcodes:

1 = SUMA, 2 = RESTA,3 = MULTIPLICA,4 = DIVIDE

Page 12: Programacion de Bajo Nivel

Lenguaje Ensamblador• La descripción y uso de los opcodes, constituyen

el lenguaje de máquina. Es decir, la lista de códigos que la máquina interpreta como instrucciones.

• Cuando se abstraen los opcodes y se sustituyen por una palabra clave que represente su significado, se genera un Lenguaje de nivel intermedio (entre la maquina y el programador).

• Lenguaje Ensamblador es la primera abstracción del Lenguaje de Máquina, consistente en asociar a los opcodes palabras clave que faciliten su uso por parte del programador.

Page 13: Programacion de Bajo Nivel

Lenguaje Ensamblador• Lenguaje de programación de bajo nivel.

• Más cercano al lenguaje máquina que al natural.

• Conjunto ordenado y estructurado de mnemónicos de un lenguaje de máquina dado.

– Mnemónico: Palabra breve, descriptiva y fácil de recordar.

El ensamblador traduce cada sentencia programada, a una instrucción específica del microprocesador.

Depende del hardware, por lo que no es portable a otro tipo de procesadores.

Page 14: Programacion de Bajo Nivel

Características del Ensamblador• Correspondencia 1 a 1 con el lenguaje

máquina.

• Permite al acceso a todas las instrucciones del procesador y, por tanto, a todos los recursos del hardware.

• Permite desarrollar código más rápido y compacto.

• Requiere buen conocimiento de la arquitectura del hardware.

Page 15: Programacion de Bajo Nivel

Arquitectura 80X86

CPU80X86

MemoriaRAM

Puertos E/S

Bus de Direcciones

Bus de Datos

Bus de Control

Page 16: Programacion de Bajo Nivel

VENTAJAS Y DESVENTAJAS

• Ventajas respecto a un lenguaje de alto nivel: – Velocidad – Eficiencia de tamaño – Flexibilidad

• desventajas respecto a los lenguajes de alto nivel:

– Tiempo de programación – Programas fuente grandes – Peligro de afectar recursos inesperadamente – Falta de portabilidad

Page 17: Programacion de Bajo Nivel

LENGUAJE ENSAMBLADORProceso de ensamblado

Page 18: Programacion de Bajo Nivel

Proceso de ensamblado

Page 19: Programacion de Bajo Nivel

Proceso de ensamblado• TASM: Ensamblador

– Se le llama ensamblador no sólo al lenguaje; sino también al programa que traduce el código fuente escrito en ensamblador, a código objeto, equivalente a los opcodes en lenguaje de máquina.

– En el caso de 8086 y familia, el ensamblador, sea TASM (Borland) o MASM (Microsoft), se encarga de generar los archivos .OBJ que representan el código de máquina asociado al programa fuente en ensamblador.

• La sintaxis básica para su uso es:

– TASM <nombre del programa> {opciones}

– En el nombre del programa, podemos omitir la extensión .ASM, que es la que tenemos por defecto.

Page 20: Programacion de Bajo Nivel

Proceso de ensambladoPor ejemplo, para ensamblar el programa HOLA.ASM, basta la siguiente línea de comandos:

C> TASM HOLA

En las opciones se puede controlar el proceso de ensamblado, para que genere información adicional o cambie su forma de operación. Dos de estas opciones, que seran de gran utilidad son:

/la Genera un archivo, adicional al .OBJ, con extensión .LST, que muestra un listado detallado del proceso de ensamblado. Entre otras cosas, muestra la asociación existente entre el código fuente y los opcodes generados.

Page 21: Programacion de Bajo Nivel

Proceso de ensamblado/zi

Almacena información de símbolos junto con el programa objeto, útil para que el depurador permita ejecutar el código objeto en sincronía con el código fuente.

Se recomienda que durante el desarrollo de un programa se ejecute TASM con una línea de comandos similar a la siguiente:

C> TASM HOLA /zi /la

En algunas versiones las opciones deben ponerse previamente, por ejemplo:

C> TASM /zi /la HOLA

Page 22: Programacion de Bajo Nivel

Proceso de ensamblado

TLINK: Linker

Un archivo .OBJ, si bien contiene ya todo el código de máquina, no puede ser ejecutado por el sistema operativo, pues no contiene información necesaria para el S.O., tal como memoria requerida, la cual se coloca en un encabezado, que es leído por el sistema para determinar cómo ejecutar el programa.

Cuando se hace un programa en varios módulos, no solamente existe un código objeto sino varios, que debemos combinar o relacionar entre sí.

Estos procesos son llevados a cabo por el TLINK; el cual toma como entrada uno o varios archivos .OBJ y genera los archivos ejecutables, con extensión .COM o .EXE.

Page 23: Programacion de Bajo Nivel

Proceso de ensamblado

La sintaxis básica:

TLINK <nombre del programa o programas> {opciones}

En el nombre del programa, se puede omitir la extensión .OBJ, que es el valor por defecto.

Por ejemplo, para ligar el código objeto generado anteriormente HOLA.OBJ, basta la siguiente línea de comandos:

C> TLINK HOLA

En las opciones se puede controlar el proceso de ligado.

Page 24: Programacion de Bajo Nivel

Proceso de ensamblado

/v Almacena información de símbolos junto con el programa ejecutable, útil para que el depurador permita ejecutar el código objeto en sincronía con el código fuente. Esta opción debe escribirse en minúsculas, estrictamente.

Ejemplo:

C> TLINK HOLA /v

También aquí a veces se requiere de poner las opciones antes, como por ejemplo:

C> TLINK /v HOLA

Page 25: Programacion de Bajo Nivel

Proceso de ensamblado

Otros procesos que intervienen en el ensamblado:

- MAKE: Reglas de construcción

- TD: Depuración

- TPROF: Pruebas de eficiencia

Page 26: Programacion de Bajo Nivel

LENGUAJE ENSAMBLADORRegistros

Page 27: Programacion de Bajo Nivel

Registros

Registro: Conjunto de flip-flops capaz de almacenar, y en algunos casos modificar, información binaria.

Dentro de todo CPU existe un conjunto de registros.

Algunos tienen un uso específico, otros son de uso general.

Los registros de uso general normalmente se utilizan para guardar datos y resultados intermedios.

Page 28: Programacion de Bajo Nivel

Registros

Desde el punto de vista del programador, es muy importante conocer el conjunto de registros internos de un procesador y su uso, cuando se programa en bajo nivel.

Muchas de las instrucciones de lenguaje máquina suponen que los datos están en alguno de los registros o almacenan el resultado en alguno de los registros internos.

Page 29: Programacion de Bajo Nivel

REGISTROS INTERNOS  DEL PROCESADOR

• Se emplean para controlar instrucciones en ejecución, manejar direccionamiento de memoria y proporcionar capacidad aritmética.

• Son direccionables por medio de un nombre.

• Los bits por convención, se numeran de derecha a izquierda.

Estructura de

una palabra:

Page 30: Programacion de Bajo Nivel

REGISTROS DE PROPÓSITO GENERAL

• Los registros de propósito general AX, BX, CX y DX son el soporte para el desarrollo de programas.

• Son únicos en el sentido de que se puede direccionarlos como una palabra o como una parte de un byte.

• El ultimo byte de la izquierda es la parte "alta", y el ultimo byte de la derecha es la parte "baja". Por ejemplo, el registro CX consta de una parte CH (alta) y una parte Cl (baja), y usted puede referirse a cualquier parte por su nombre.

Page 31: Programacion de Bajo Nivel

Registros de los procesadores 80X86

Registros de Uso General: EAX: Acumulador EBX: Base ECX: Contador EDX: Datos. Estos registros pueden guardar datos de 32, 16 u 8

bits.

32 bits

16 bits

EAX

AX

AH AL

Page 32: Programacion de Bajo Nivel

Registro AX. Es el acumulador principal, usado para operaciones que implican entrada/salida y la mayor parte de la aritmética. También, algunas operaciones generan código mas eficiente si se refieren al AX en lugar de a los otros registros.

Registro BX. Conocido como el registro base ya que es el único registro de propósito general que puede ser índice para direccionamiento indexado. También es común emplear el BX para cálculos

REGISTROS DE PROPÓSITO GENERALº

Page 33: Programacion de Bajo Nivel

 Registro DX. Conocido como registro de datos. Alguna operaciones de entrada/salida requieren su uso, y las operaciones de multiplicación y división con cifras grandes suponen al DX y al AX trabajando juntos.

Se pude usar los registros de propósito general para suma y resta de cifras de 8, 16 o 32 bits.

REGISTROS DE PROPÓSITO GENERAL

Registro CX. Conocido como el registro contador. Puede contener un valor para controlar el número de veces que un ciclo se repite o un valor para corrimiento de bits.

Page 34: Programacion de Bajo Nivel

Registros de los procesadores 80X86APUNTADORES E INDICES

ESP: Stack Pointer (Apuntador de Pila) EBP: Base Pointer (Apuntador Base) ESI: Source Index (Indice Fuente u Origen) EDI: Destination Index (Indice Destino) Estos registros pueden almacenar datos de 32 o 16 bits.

32 bits

16 bits

ESP

SP

Page 35: Programacion de Bajo Nivel

Los registros SP (apuntador de la pila) Y BP (apuntador de base) están asociados con el registro SS y permiten al sistema accesar datos en el segmento de la pila.   Registro BP. El BP de 16 bits facilita la referencia de parámetros, los cuales son datos y direcciones transmitidos vía pila. Los procesadores 80386 y posteriores tienen un BP ampliado de 32 bits llamado el registro EBP.

Registro SP. El apuntador de la pila de 16 bits esta asociado con el registro SS y proporciona un valor de desplazamiento que se refiere a la palabra actual que esta siendo procesada en la pila. Los procesadores 80386 y posteriores tienen un apuntador de pila de 32 bits, el registro ESP.

REGISTROS APUNTADORES

Page 36: Programacion de Bajo Nivel

REGISTROS APUNTADORES• En el ejemplo siguiente, el registro SS contiene

la dirección de segmento 27B3[0]H y el SP el desplazamiento 312H. Para encontrar la palabra actual que esta siendo procesada en la pila, SE combina las direcciones en el SS y el SP:

Page 37: Programacion de Bajo Nivel

Registro de Apuntador de Instrucciones

• El registro apuntador de instrucciones (IP) de 16 bits contiene el desplazamiento de dirección de la siguiente instrucción que se ejecuta.

• El IP esta asociado con el registro CS ya que IP indica la instrucción actual dentro del segmento de código que se esta ejecutando actualmente. Los procesadores 80386 y posteriores tienen un IP ampliado de 32 bits, llamado EIP.

• En el ejemplo siguiente, el registro CS contiene 25A4[0]H y el IP contiene 412H. Para encontrar la siguiente instrucción que será ejecutada, el procesador combina las direcciones en el CS y el IP:

• Segmento de dirección en el registro CS:               25A40H • Desplazamiento de dirección en el registro IP:      +   412H • Dirección de la siguiente instrucción:                      25E52H

Page 38: Programacion de Bajo Nivel

REGISTROS ÍNDICE• Los registros SI y DI están disponibles para

direccionamiento indexado y para sumas y restas.

• Registro SI. El registro índice fuente de 16 bits es requerido por algunas operaciones con cadenas (de caracteres). En este contexto, el SI esta asociado con el registro DS. Los procesadores 80386 y posteriores permiten el uso de un registro ampliado de 32 bits, el ESI.

•   • Registro DI. El registro índice destino también es

requerido por algunas operaciones con cadenas de caracteres. En este contexto, el DI esta asociado con el registro ES. Los procesadores 80386 y posteriores permiten el uso de un registro ampliado de 32 bits, el EDI.

Page 39: Programacion de Bajo Nivel

Registros de los procesadores 80X86Registros de Segmento

• Registros de Segmento– CS: Code Segment (Segmento de Código)– DS: Data Segment (Segmento de Datos)– SS: Stack Segment (Segmento de Pila)– ES: Extra Segment (Segmento Extra)– FS: Extra Segment (Segmento Extra)– GS: Extra Segment (Segmento Extra)

• Son registros de 16 bits.• Se utilizan para generar las direcciones que el

procesador envía por el bus de direcciones.

Page 40: Programacion de Bajo Nivel

Registros de segmento

• Un registro de segmento tiene 16 bits de longitud y facilita un área de memoria para direccionamiento conocida como el segmento actual.

•  Registro CS. El DOS almacena la dirección inicial del segmento de código de un programa en el registro CS. Esta dirección de segmento, mas un valor de desplazamiento en el registro apuntador de instrucción (IP), indica la dirección de una instrucción que es buscada para su ejecución.

•  Registro DS. La dirección inicial de un segmento de datos de programa es almacenada en el registro DS. En términos sencillos, esta dirección, mas un valor de desplazamiento en una instrucción, genera una referencia a la ubicación  de un byte especifico en el segmento de datos

Page 41: Programacion de Bajo Nivel

Registros de segmento • Registro SS. El registro SS permite la colocación en memoria

de una pila, para almacenamiento temporal de direcciones y datos.  El DOS almacena la dirección de inicio del segmento de pila de un programa en le registro SS. Esta dirección de segmento, mas un valor de desplazamiento en el registro del apuntador de pila (SP), indica la palabra actual en la pila que esta siendo direccionada.

• Registros ES. Alguna operaciones con cadenas de caracteres (datos de caracteres) utilizan el registro extra de segmento para manejar el direccionamiento de memoria. En este contexto, el registro ES esta asociado con el registro DI (índice). Un programa que requiere el uso del registro ES puede inicializarlo con una dirección de segmento apropiada.

• Registros FS y GS. Son registros extra de segmento en los procesadores 80386 y posteriores.

Page 42: Programacion de Bajo Nivel

Registro de Banderas Conjunto de bits que nos dan información

sobre el estado del procesador y sobre el resultado de la última operación efectuada.

Es el único registro accesible a nivel de bits. Algunos de estos bits son:

CF: Carry flag - ZF: Zero flag SF: Sign flag - OF: Overflow flag IF: Interrupt flag - DF: Direction flag

. . . . . . . . OF DF IF SF ZF CF

Page 43: Programacion de Bajo Nivel

REGISTRO DE BANDERAS• De los 16 bits del registro de banderas, nueve son

comunes a toda la familia de procesadores 8086, y sirven para indicar el estado actual de la maquina y el resultado del procesamiento.

• Muchas instrucciones que piden comparaciones y aritmética cambian el estado de las banderas, algunas cuyas instrucciones pueden realizar pruebas para determinar la acción subsecuente.

• Los bits de las banderas comunes son como sigue:

– OF (Overflow, desbordamiento). Indica desbordamiento de un bit de orden alto (mas a la izquierda) después de una operación aritmética.

Page 44: Programacion de Bajo Nivel

REGISTRO DE BANDERAS– DF (dirección). Designa la dirección hacia la

izquierda o hacia la derecha para mover o comparar cadenas de caracteres.

– IF (interrupción). Indica que una interrupción externa, como la entrada desde el teclado, sea procesada o ignorada.

– TF (trampa). Permite la operación del procesador en modo de un paso. Los programas depuradores, como el DEBUG, activan esta bandera de manera que usted pueda avanzar en la ejecución de una sola instrucción a un tiempo, para examinar el efecto de esa instrucción sobre los registros de memoria.

– SF (signo). Contiene el signo resultante de una operación aritmética (0 = positivo y 1 = negativo).

– ZF (cero). Indica el resultado de una operación aritmética o de comparación (0 = resultado diferente de cero y 1 = resultado igual a cero).

Page 45: Programacion de Bajo Nivel

REGISTRO DE BANDERAS– AF (acarreo auxiliar). Contiene un acarreo externo del bit

3 en un dato de 8 bits para aritmética especializada. – PF (paridad). Indica paridad par o impar de una operación

en datos de 8 bits de bajo orden (mas a la derecha). – CF (acarreo). Contiene el acarreo de orden mas alto (mas

a la izquierda) después de una operación aritmética; también lleva el contenido del ultimo bit en una operación de corrimiento o de rotación.

Las banderas están en el registro de banderas en las siguientes posiciones

Page 46: Programacion de Bajo Nivel

LENGUAJE ENSAMBLADORSegmentación

Page 47: Programacion de Bajo Nivel

SEGMENTO• Un segmento es un área especial en un

programa que inicia en un limite de un párrafo, esto es, en una localidad de regularmente divisible entre 16, o 10 hexadecimal. Aunque un segmento puede estar ubicado casi en cualquier lugar de la memoria y, en modo real, puede ser hasta de 64K, solo necesita tanto espacio como el programa requiera para su ejecución.

• Se puede tener cualquier numero de segmentos; para direccionar un segmento en particular basta cambiar la dirección en el registro del segmento apropiado. Los tres segmentos principales son los segmentos de código, de datos y de la pila.

Page 48: Programacion de Bajo Nivel

SEGMENTO Segmento de código.

El segmento de código (CS) contiene las instrucciones de maquina que son ejecutadas por lo común la primera instrucción ejecutable esta en el inicio del segmento, y el sistema operativo enlaza a esa localidad para iniciar la ejecución del programa. Como su nombre indica, el registro del CS direcciona el segmento de código. Si su área de código requiere mas de 64K, su programa puede necesitar definir mas de un segmento de código.

Page 49: Programacion de Bajo Nivel

SEGMENTO• Segmento de datos.

– El segmento de datos (DS) contiene datos, constantes y áreas de trabajo definidos por el programa. El registro DS direcciona el segmento de datos. Si su área de datos requiere mas de 64K, su programa puede necesitar definir mas de un segmento de datos.

• Segmento de pila. – La pila contiene los datos y direcciones necesarios para

guardar temporalmente o para llamadas a subrutinas. El registro de segmento de la pila (SS) direcciona el segmento de la pila.

Page 50: Programacion de Bajo Nivel

Segmentación Técnica utilizada en los procesadores Intel

8088/8086 para generar direcciones de 20 bits usando registros de 16 bits. Para ilustrar esta técnica, suponga que se desea

ubicar la posición de una persona a partir de un punto de referencia, pero utilizando solamente números de 2 dígitos decimales.

100 200 300 400 500 mts

Page 51: Programacion de Bajo Nivel

Segmentación Esto se puede realizar si se hace lo

siguiente: Se divide la recta en bloques de 100 metros

cada uno. Se utilizan dos números:

Uno para indicar en cuál bloque está la persona Otro para especificar su posición dentro del bloque.

Posición = Bloque:Posición

100 200 300 400 500 mts0:50 3:45

Page 52: Programacion de Bajo Nivel

Segmentación

Para obtener la ubicación real debe realizarse la siguiente operación: Ubicación = Bloque*100 + Posición

Posición1 = 0*100 + 50 = 50 Posición2 = 3*100 + 45 = 345

100 200 300 400 500 mts0:50 3:45

Posición 1 Posición 2

Page 53: Programacion de Bajo Nivel

Segmentación

En el caso de los procesadores 80X86, los bloques se llaman SEGMENTOS y la posición se llama DESPLAZAMIENTO

En modo real, cada una se describe con un número de 16 bits.

Operando en modo real Dirección Real = Segmento*16 + Desplazamiento.

La Dirección Real ya es una cantidad de 20 bits. Esto significa que toda dirección tiene 2 partes: Un

Segmento y un desplazamiento.

Page 54: Programacion de Bajo Nivel

Segmentación en Modo Protegido

• Es importante recalcar que cuando los procesadores 80386 o posteriores operan en modo protegido, la segmentación funciona de manera muy diferente.

• Cada segmento puede ser de hasta 4 Gbytes.

• Maneja memoria virtual, lo que implica un esquema de paginación.

• Maneja también multitarea y un esquema de protección de memoria.

Page 55: Programacion de Bajo Nivel

LENGUAJE ENSAMBLADORSet de instrucciones

Page 56: Programacion de Bajo Nivel

Conjunto de Instrucciones El Conjunto de instrucciones (Instruction Set)

de un procesador está formado por aquellas instrucciones en lenguaje máquina que un procesador puede ejecutar.

CISC vs. RISC CISC: Complex Instruction Set Computer RISC: Reduced Instruction Set Computer

Las instrucciones normalmente se agrupan para describirlas.

Page 57: Programacion de Bajo Nivel

Conjunto de Instrucciones• Los grupos normalmente son:

– Transferencia de datos– Aritmética entera binaria– Operaciones lógicas– Desplazamientos y rotaciones– Aritmética BCD– Gestión de cadenas– Control del sistema– Control de flujo del programa– Saltos condicionales

Page 58: Programacion de Bajo Nivel

Grupos de Instrucciones• Transferencia de datos

– Propósito: Transferencia de datos entre celdas de memoria, registros y acumulador.

• Sintaxis: – MOV Destino,Fuente – Donde Destino es el lugar a donde se moverán los datos y fuente

es el lugar donde se encuentran dichos datos.

– Los diferentes movimientos de datos permitidos para esta instrucción son:

Destino Fuente

 Memoria  Acumulador

 Acumulador  Memoria

 Registro de Segmento  Memoria/registro

 Memoria/registro  Registro de Segmento

 Registro  Registro

 Registro  Memoria

 Memoria  Registro

 Registro  Dato Inmediato

 Memoria  Dato Inmediato

Page 59: Programacion de Bajo Nivel

Grupos de Instrucciones• Ejemplo:

MOV AX,0006h MOV BX,AX MOV AX,4C00h INT 21H

• Este pequeño programa mueve el valor 0006H al registro AX, luego mueve el contenido de AX (0006h) al registro BX, por último mueve el valor 4C00h al registro AX para terminar la ejecución con la opción 4C de la interrupción 21h.

Page 60: Programacion de Bajo Nivel

Grupos de Instrucciones• MOVS (MOVSB) (MOVSW)

– Propósito: Mover cadenas de bytes o palabras desde la fuente, direccionada por SI, hasta el destino direccionado por DI.

• Sintaxis: – MOVS – Este comando no necesita parametros ya que toma como dirección

fuente el contenido del registro SI y como destino el contenido de DI. La secuencia de instrucciones siguiente ilustran esto:

• MOV SI, OFFSET VAR1 • MOV DI, OFFSET VAR2 • MOVS

– Primero inicializamos los valores de SI y DI con las direcciones de las variables VAR1 y VAR2 respectivamente, despues al ejecutar MOVS se copia el contenido de VAR1 a VAR2.

– Los comandos MOVSB y MOVSW se utilizan de la misma forma que MOVS, el primero mueve un byte y el segundo una palabra .

Page 61: Programacion de Bajo Nivel

Grupos de InstruccionesOperadores Aritméticas

Nombre Comentario Operación

ADD Suma ADD Dest,Fuente

ADC Suma con acarreo ADC Dest,Fuente

SUB Resta SUB Dest,Fuente

SBB Resta con acarreo SBB Dest,Fuente

DIV División (sin signo) DIV Op

IDIV División entera con signo IDIV Op

MUL Multiplicación (sin signo) MUL Op

IMUL Multiplicación entera con signo IMUL Op

INC Incrementar INC Op

DEC Decrementar DEC Op

CMP Comparar CMP Op1,Op2

SAL Desplazam. aritmético a la izq. SAL Op,Cantidad

SAR Desplazam. aritmético a la der. SAR Op,Cantidad

Page 62: Programacion de Bajo Nivel

Grupos de InstruccionesOperadores Lógicos

Nombre Comentario Operación

NEG Negación (complemento a 2) NEG Op

NOT Invertir cada bit NOT Op

AND 'Y' (And) lógico AND Dest,Fuente

OR 'O' (Or) lógico OR Dest,Fuente

XOR 'O' (Or) exclusivo XOR Dest,Fuente

SHL Desplazam. lógico a la izquierda SHL Op,Cantidad

SHR Desplazam. lógico a la derecha SHR Op,Cantidad

Page 63: Programacion de Bajo Nivel

Grupos de Instrucciones Gestión de cadenas

rep: Repetir-lodsb:AL=byte{DS:SI} stosb: {ES:SI} = AL cmps: Compara {DS:SI} con {ES:DI}

Control del sistema int # - iret cli: clear Interruption Flag sti: set Interruption Flag clc: clear carry flag stc: set carry flag

Page 64: Programacion de Bajo Nivel

Saltos condicionales

Control de flujo del programa jmp objetivo - test dest,orig call procedimiento - ret cmp dest,orig

Saltos condicionales basados en:

Condiciones sobre indicadores

Relaciones aritméticas con signo

Relaciones aritméticas sin signo

Page 65: Programacion de Bajo Nivel

Saltos condicionales Condiciones sobre indicadores

je/jne obj: jump if equal/not equal jz/jnz obj: jump if zero/non zero js/jns obj: jump if sign/no sign

Relaciones aritméticas con signo jg/jl obj: jump if greater/less jge obj: jump if greater or equal jle obj: jump if less or equal

Page 66: Programacion de Bajo Nivel

Saltos condicionales Relaciones aritméticas sin signo

ja/jb obj: jump if above/below jae/jbe obj: jump if above/below or equal

jna/jnb obj: jump if not above/below

Normalmente se utilizan después de una comparación:

Cmp dest,origjxx objetivo

(Donde xx: Condición de salto)

Nota: La instucción CMP resta el origen al destino y afecta banderas, noguarda el resultado ni altera los operandos.

Page 67: Programacion de Bajo Nivel

Programación estructurada Es posible implementar parcialmente en

bajo nivel las estructuras de control que propone la programación estructurada:

If ... then If ... then ... else Repeat .... until While ... do For ... do

Page 68: Programacion de Bajo Nivel

If ... then

Ilustraremos estas implementaciones con ejemplos: En pseudocódigo:

En ensamblador

cmp cx,ax ; if (cx > ax)jle fin_sidec cx ; then dec cx

fin_si:

If (cx > ax)then dec cx

Page 69: Programacion de Bajo Nivel

If ... then ... else Pseudocódigo:

Ensamblador:

If (bx < ax) then dec ax else dec bx

cmp bx,ax ; If (bx < ax)jge else1dec ax ; then dec axjmp fin_si1

else1: dec bx ; else dec bxfin_si1:

Page 70: Programacion de Bajo Nivel

Repeat ... until

Pseudocódigo:

Ensamblador:

Repeat: inc cx add ax,cxuntil (cx > 100)

Repite1:inc cxadd ax,cx

cmp cx,100 ; until (cx > 100)jle Repite1

Page 71: Programacion de Bajo Nivel

While ... do Pseudocódigo:

Ensamblador:

While (bx<200) doinc bxadd ax,bx

end_while

while1: cmp bx,200 ; While (bx<200)jge fin_while1 inc bx add ax,cxjmp while1 ; end_while

fin_while1:

Page 72: Programacion de Bajo Nivel

For ... do• Una implementación utiliza la instrucción loop

• Sintaxis loop:– loop objetivo

• Semántica:

• loop utiliza CX forzosamente

Si (CX 0) Dec CX Salta a objetivoSino Siguiente instrucción

Page 73: Programacion de Bajo Nivel

For ... do Pseudocódigo:

Ensamblador:

For (cx=1 hasta 20) do add ax,bx inc bxend_for

mov cx,20do1:

add ax,bxinc bxloop do1

Nota: Dentro de la imlementación del for ...do no es aconsejable utilizar CX cuando se implementa con loop.