Programacion de Bajo Nivel
-
Upload
camilo-galeano-carvajal -
Category
Documents
-
view
88 -
download
0
Transcript of Programacion de Bajo Nivel
PROGRAMACIÓN DE BAJO NIVEL
LENGUAJE MÁQUINA
Máquina Multinivel
Hardware
Lenguaje Ensamblador
Sistema Operativo
Lenguaje Alto Nivel
Aplicación
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.
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
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
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
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
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
LENGUAJE ENSAMBLADORDefinición y características básicas
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
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.
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.
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.
Arquitectura 80X86
CPU80X86
MemoriaRAM
Puertos E/S
Bus de Direcciones
Bus de Datos
Bus de Control
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
LENGUAJE ENSAMBLADORProceso de ensamblado
Proceso de ensamblado
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.
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.
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
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.
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.
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
Proceso de ensamblado
Otros procesos que intervienen en el ensamblado:
- MAKE: Reglas de construcción
- TD: Depuración
- TPROF: Pruebas de eficiencia
LENGUAJE ENSAMBLADORRegistros
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.
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.
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:
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.
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
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º
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.
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
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
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:
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
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.
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.
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
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.
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
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.
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).
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
LENGUAJE ENSAMBLADORSegmentación
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.
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.
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.
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
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
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
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.
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.
LENGUAJE ENSAMBLADORSet de instrucciones
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.
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
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
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.
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 .
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
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
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
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
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
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.
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
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
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:
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
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:
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
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.