Está en la página 1de 73

TÉCNICAS DE PROGRAMACIÓN Lenguaje ensamblador

LENGUAJE ENSAMBLADOR
Lenguaje simbólico con una mínima capacidad de abstracción
 Nombres nemotécnicos para los códigos de operación
 Nombres simbólicos para las direcciones de memoria

Ejemplo de instrucción de código ensamblador

 Códigos simbólicos de las operaciones


 SUM = La suma
 DIV = La división

a = (b + c)/(d + e)

SUM B, C, X
SUM D, E, Y
DIV X, Y, A
LENGUAJE ENSAMBLADOR
Cuestiones
 ¿Cómo entiende la máquina el lenguaje ensamblador?
 Si las direcciones de memoria son simbólicas ¿en qué direcciones de memoria se colocan los
datos?

Código fuente Programa ensamblador Código objeto


(lenguaje ensamblador) (lenguaje máquina)

Programa ensamblador
 Traducción a código binario de códigos simbólicos de operación
 Traducción de las direcciones simbólicas a direcciones reales de memoria
Inconveniente: sigue siendo dependiente de la máquina
LOS REGISTROS
Los registros del procesador, se usan para contener los datos con que se está
trabajando puesto que el acceso a los registros es mucho más rápido que los accesos
a memoria.
REGISTROS DE PROPÓSITO GENERAL
Los registros de propósito general son el AX, BX, CX, y DX, de 16 bits. Cada uno de
ellos se divide en dos registros de 8 bits, llamados AH y AL, BH y BL, CH y CL, y, DH
y DL, H significando High (alto) y L significando Low (bajo), indicando la parte alta o
la parte baja del registro correspondiente de 16 bit.
REGISTROS DE PROPÓSITO GENERAL
Registro AX: El registro AX es el registro acumulador, es utilizado para operaciones
que implican entrada/salida, multiplicación y división (estas dos últimas en conjunto
con el registro DX).
Registro BX: El registro BX es el registro base, y es el único registro de propósito
general que puede ser un índice para direccionamiento indexado.
Registro CX: El registro CX es 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.
Registro DX: El registro DX es el registro de datos. En algunas operaciones se indica
mediante este registro el número de puerto de entrada/salida, y en las operaciones
de multiplicación y división de 16 bits se utiliza junto con el acumulador AX.
INSTRUCCIÓN MOV
Mov es una instrucción en el lenguaje ensamblador de la mayoría de procesadores,
cuyo propósito es la transferencia de datos entre registros de procesador o registro
y memoria.
Implementaciones
Está disponible en procesadores intel pentium, amd y sparc entre muchos otros, es a
la práctica, una instrucción de ensamblador básica en cualquier procesador.
SINTAXIS

La sintaxis en ensamblador es variable en dependencia del procesador utilizado.


La sintaxis de mov se describe de la siguiente manera en los procesadores x86 y
compatibles:
"mov destino, fuente"
MODOS DE DIRECCIONAMIENTO
Direccionamiento de registro
Cuando ambos operando son un registro.
Ejemplo: MOV EAX, EBX ;transfiere el contenido de EBX en EAX
Direccionamiento inmediato :
Cuando el operando origen es una constante.
Ejemplo: MOV EAX, 500 ;carga en EAX el valor 500.
Direccionamiento relativos a EIP (se trataran en los saltos)
Ejemplo: MOV EAX, [EBX];
carga en EAX lo almacenado en la posición apuntada por EBX
EJEMPLOS
Mov AX,16 ; introduce en el reistro AX el valor 16
Mov AX[16];introducimos en el registro AX el valor que se encuentre en la
posición de memoria número 16.
INSTRUCCIONES ARITMÉTICAS
Instrucciones aritméticas

Estas instrucciones se utilizan para poder realizar las sumas, restas, incrementos, etc..

ADD Destino, Origen


SUB Destino, Origen
INC Destino
DEC Destino
SUMAS

ADD Destino, Origen


Este es el modelo estándar de declaración de la suma, suma los valores de Origen y
Destino y el resultado de dicha suma lo guarda en Destino.
RESTAS

SUB Destino, Origen


Este es el modelo estándar de declaración de la resta, resta los valores de Origen y
Destino y el resultado de dicha resta lo guarda en Destino.
INCREMENTOS

INC Destino
Este es el modelo estándar de declaración del incremento, lo que realiza es el
incremento en uno el destino.
MUL
MUL e IMUL realizan la multiplicación y multiplicación con signo, respectivamente, de
contenido de EAX y del operando indicado, guardando el resultado en EAX, para
operaciones de 16 bits; y en EDX:EAX para operaciones de 32 bits. Los formatos son:
DIV
DIV e IDIV realizan la división y la división con signo, respectivamente. Dependiendo
del tamaño de los operandos el resultado se guarda tal y como se muestra en la
tabla.
EJERCICIO
Dividir AX por 7 y Multiplicar BX por 3
; dividir y multiplicar enteros

mov ax,8
mov bx,3
mov cl,7 ; divisor
div cl ; dividendo = ax ; divisor = cl
mov cx,ax ; guardar resultado y resto en cx
mov ax,bx ; multiplicando
mov bx,2 ; multiplicador
mul bx ; resultado en dx ax
ret
INSTRUCCIONES LÓGICAS
La lógica booleana es importante en el diseño de circuitos y tiene un paralelo en la
lógica de programación. Las instrucciones para lógica booleana son AND, OR, XOR,
TEST y NOT, que pueden usarse para poner bits en 0 o en 1 y para manejar datos
ASCII con propósitos aritméticos. El formato general para las operaciones booleanas
es:
And
Not
Or
Xor
la operación "y" lógica

AND destino, fuente


Con esta instrucción se lleva a cabo la operación "y" lógica de los dos operandos:
Fuente Destino | Destino
--------------------------
11|1
10|0
01|0
00|0
El resultado de la operación se almacena en el operando destino.
NEGACIÓN
Propósito: Lleva a cabo la negación bit por bit del operando destino.
Sintaxis:
NOT destino
El resultado se guarda en el mismo operando destino.
DISYUNCIÓN

Propósito: OR inclusivo lógico


Sintaxis:
OR destino, fuente
La instrucción OR lleva a cabo, bit por bit, la disyunción inclusiva lógica de los dos operandos:
Fuente Destino | Destino
--------------------------
11|1
10|1
01|1
00|0
Instrucción XOR

Instrucción XOR
Propósito: OR exclusivo
Sintaxis:
XOR destino, fuente
Su función es efectuar bit por bit la disyunción exclusiva lógica de los dos operandos.
Fuente Destino | Destino
--------------------------
11|0
00|1
01|1
00|0
INSTRUCCIONES DE DESPLAZAMIENTO Y
ROTACIONES
Realizan operaciones de desplazamiento y rotaciones de bits, y son: SAL/SHL, SAR,
SHR, ROL, ROR, RCL, RCR.
INSTRUCCIONES DE DESPLAZAMIENTO Y
ROTACIÓN
SAL/SHL realiza el desplazamiento a la izquierda del primer operando tantos bits
como indique el segundo operando, introduciendo un 0
SAL/SHL reg, 1; desplaza 1 vez el contenido de registro
SHR realiza el desplazamiento a la derecha del operando, introduciendo un 0
RCR realiza la rotación a la derecha de los bits de operando a través del bit CF del
registro de estado.
ROL realiza la rotación a la izquierda de los bits del operando, ignorando el bit CF
del registro de estado, aunque en CF se almacena el bit que se rota.
SHL (Shift Left =
desplazamiento a la izquierda)
Se desplazan a la izquierda los bits del operando destino tantas
posiciones como indique el operando fuente. El desplazamiento
de una posición se realiza de la siguiente forma: el bit de mayor
peso del operando se desplaza al bit CF del registro de estado, el
resto de los bits se desplazan una posición hacia la izquierda, y
la posición de menor peso se rellena con un 0.
EJEMPLOS
Código———–Núumeo antes del corrimiento———Después
shl DL, 1 ———–10101111 (175 decimal)——–01011110 (94 decimal)
shl DL, 1 ———- 01011110 (94 decimal) ———10111100 (188 decimal)
shl DL, 1 ———–10111100 (188 decimal) ——-01111000 ( 120 decimal)
shl DL, 1 ———–01111000 ( 120 decimal) ——11110000 (240 decimal)
shr DL, 1 ——-10101111 (175 decimal) ———- 01010111 (87 decimal)
shr DL, 1 ——- 01010111 (87 decimal) ———- 00101011 (43 decimal)
shr DL, 1 ——-00101011 (43 decimal) ———- 00010101 (21 decimal)
shr DL, 1 ——-00010101 ( 21 decimal) ———- 00001010 (10 decimal)
EJERCICIO
NOTA: Las instrucciones SHL/SAL y SAR se suelen usar para hacer divisiones y
multiplicaciones, respectivamente, por números potencia de dos (2, 4, 8,16, 32, 64 y
128), de manera más eficiente que las instrucciones DIV y MUL.
INSTRUCCIONES DE CADENAS DE
CARACTERES
CMPS realiza la comparación de dos cadenas, devuelve el resultado en el registro
de estado.
CMPS destino, fuente
INSTRUCCIONES DE CADENAS DE
CARACTERES
LODS
transfiere un elemento de una cadena (fuente) a AL.
LODS fuente
STOS
el contenido de AL, AX o EAX, respectivamente, a una cadena
(destino).
STOS destino
INSTRUCCIONES DE SALTO
Estas instrucciones permiten saltar a otras partes del código. Todas cambian el
registro EIP (contador de programa) y el registro CS (segmento de código) si es un
salto lejano. Un salto es lejano cuando la dirección a la que se salta no está en el
mismo segmento de código.
JMP realiza un salto incondicional a la dirección especificada.
Intruccion GOTO
goto k
Salta a la dirección K
SALTOS CONDICIONALES
Saltos condicionales estas instrucciones realizan el salto a la dirección especificada
en función de si se cumple o no una condición.
btfsc f,b
Salta si el bit ‘b’ de ‘f’ es 0
LA INSTRUCCIÓN CALL.

CALL en idioma inglés significa ‘llamada’, y nos permite ejecutar un procedimiento


repetidas veces en diversos momentos del programa.

CALL proc_name
INSTRUCCIÓN RET
RET (RETurn, regresar)
Extrae una dirección de la pila y salta a ella.
SUBRUTINAS
El primer intento de organizar el código de programación fueron las subrutinas. Una
subrutina era un grupo de instrucciones que se escribía al final del código principal
justo después de la instrucción que indicaba el fin del programa.
En ensamblador, este proceso fue copiado directamente con instrucciones como CALL
y RET. CALL hace lo mismo que GoSub, guarda la posición en la que se encuentra y
luego salta a donde se encuentra la subrutina. Cuando llega a RET tan solo toma la
posición desde la que saltó y continúa su camino como si nada hubiera pasado. Aquí
la clave es el STACK. Como ya saben el STACK es una zona de la memoria donde se
guardan datos de manera que el último en entrar es el primero en salir. Esto permite
que las subrutinas llamen a su vez a todas las subrutinas que quieran y que el CPU
siempre pueda regresar al punto del programa del que la primera de ellas fue
llamada.
PROGRAMA EN ENSAMBLADOR
Programa 1

call a1
call a2
ret
a1:
mov ax, 1
a2:
add ax, 3
ret
PROGRAMA 2: RESULTADOS FINAL DEL REGISTRO AX?

; two procedures, two return.

call a1
call a2
ret

a1:
mov ax, 1
ret
a2:
add ax, 3
ret
PROGRAMACIÓN MODULAR
Un procedimiento es un conjunto de instrucciones que tienen la finalidad de ejecutar una tarea
especifica dentro de un programa.
Un procedimiento se declara una sola vez en el código fuente y cuando el programa se
ensambla y ejecuta, el procedimiento se coloca en memoria para que pueda ser utilizado por
el programa.
Un procedimiento se declara de la siguiente forma:
nombre PROC
instrucción
instrucción ....
RET
nombre ENDP
LLAMADA A PROCEDIMIENTOS
Los procedimientos son llamados por los programas por medio de la instrucción CALL,
seguida del nombre del procedimiento.
Ejemplo: Call GotoXY
EJERCICIO
Llama un procedimiento (m1) mueve el valor de 5 a BX y retorna para mover 2 a
AX.
EJEMPLO

ORG 100h

CALL m1

MOV AX, 2

RET ; retorno al sistema operativo

m1 PROC
MOV BX, 5
RET ; retorna al programa principal.
m1 ENDP

END
BANDERAS
Las banderas proveen una manera de obtener información acerca de del estado
actual de la máquina y el resultado de procesamiento de una instrucción.
BANDERAS
CF-La bandera de acarreo se activa cuando se produce acarreo en una suma o
multiplicación, o un "préstamo" en una resta entre números sin signo. La bandera de
paridad se usa para indicar si el resultado, en un registro, de una operación
matemática es válido.
PF-La bandera de paridad se usa para indicar si el resultado, en un registro, de una
operación matemática es válido.
AF-La bandera de acarreo auxiliar se utiliza en operaciones matemáticas con
números decimales codificados en binario (BCD). Se activa si hay acarreo presente.
ZF-La bandera de cero se activa si el resultado de una operación aritmético lógica
es cero.
BANDERAS (CONT)
SF-La bandera de signo muestra el bit más significativo del resultado de una
operación, el cual denota el signo del número.
DF-La bandera de dirección controla la selección de autoincremento (D=0) o
autodecremento (D=1) de los registros %edi o %esi durante las operaciones con
cadenas de caracteres. La bandera de dirección sólo se utiliza con las instrucciones
para el manejo de cadenas de caracteres.
OF-La bandera de desbordamiento se utiliza en la aritmética de enteros con signo
cuando un número sobrepasa la capacidad de representación del registro.
SALTOS CONFICIONALES
Saltos condicionales
Son similares a JMP en la sintaxis, pero la diferencia es el nombre.
Las instrucciones son las siguientes:
JE o JZ: Salta si está prendido el bit Zero del registro de banderas.
Objetivo: Saltar si la última comparación realizada da igual.
JA o JNBE: Salta si el bit carry (CF) o el bit zero (ZF) del registro de banderas está
desactivado.
Objetivo: Saltar si la última comparación realizada con números naturales da mayor.
JB o JNAE: Salta si CF está activada
Objetivo: Saltar si la última comparación realizada con números naturales da menor
INSTRUCCIONES DE COMPARACIÓN (CONT)
Propósito: Comparar los operandos.
Sintaxis:
CMP destino, fuente
Esta instrucción resta el operando fuente al operando destino pero sin que éste
almacene el resultado de la operación, solo se afecta el estado de las banderas.
EJERCICIO RESUELTO
Traduzca las siguientes expresiones en lenguaje Python a
lenguaje ensamblador . Al inicio del programa debe colocar los
valores X,Y en los registro AX, BX respectivamente:
A)
x=y*(y+z)
B)
if x==y:
x+=1
else:
x-=1
C)

while (x<9):
x+=y
RESPUESTAS
A)
mov ax,3 ; valor z
mov bx,2 ; valor y
add ax,bx
mul bx
mov AX, 9
mov aX, 9
cmp al, bl

je equal
dec Ax

jmp stop
equal:
inc AX
stop:
ret
C)
MOV AX,2
MOV BX,3
start:
CMP AX,9
JA endloop
ADD AX,BX
JMP start
endloop:
EJERCICIO RESUELTO
Traduzca las siguientes expresiones en lenguaje Python a
lenguaje ensamblador . Al inicio del programa debe colocar los
valores X,Y en los registro AX, BX respectivamente:
A)
x=(z-y)/y
B)
if x>y:
x=x/y
else:
x=x*y
C)

while (x>6):
x-=y
INCISO A RESPUESTA
mov ax,8 ; valor z
mov bx,2 ; valor y
sub ax,bx
div bx
INCISO B RESPUESTA
mov AX, 8; Y
mov BX, 9 ; X
cmp al, bl
ja mayor
mul BX
jmp stop
mayor:
DIV BX
stop:
ret
INCISO C
MOV AX,18 ; X
MOV BX,3 ; Y
start:
CMP AX,6
JB endloop
SUB AX,BX
JMP start
endloop:
EJERCICIO PROCEDIMIENTOS

Declarar un procedimiento (p1)


para mover valor de 6 a BX y
retornar para mover el valor de 4
a AX y multiplicar ese valor por el
valor de BX.
CALL p1
MOV AX, 2
MUL BX
RET ; retorno al sistema operativo
p1 PROC
MOV BX, 6
RET ; retorna al programa principal.
p1 ENDP
END
PROYECTO INTERNET DE LAS COSAS
Qué es internet de las cosas(IOT)?
Papel del lenguaje ensamblador en el IOT
Modelos de Raspbery PI y como seleccionarlos.
Modelos de Arduino y cómo seleccionarlos.
Qué son los ambientes inteligentes
Proponer un proyectos de IOT y/o ambientes inteligentes:
Ejemplos: https://ami-2016.github.io/
INTERRUPCIONES
Una interrupción es un estado en el cual el microprocesador detiene la ejecución de un programa
para atender una petición especial solicitada por el propio programa o por un dispositivo físico
conectado al microprocesador externamente. Las interrupciones fueron creadas para facilitar al
programador el acceso a los diferentes dispositivos.

Sintaxis :
INT valor
Ejemplo
INT 10 H: Manejo de la pantalla
INT 10h / AH = 0Eh ; mostrar carácter en pantalla
AL=carácter a mostrar
I
MOV AH, 0Eh ; select sub-function INT 10h / 0Eh sub-function receives
an ASCII code of the character that will be printed in AL register.
MOV AL, 'H' ; ASCII code: 72
INT 10h ; print it!
MOV AL, 'e' ; ASCII code: 101
INT 10h ; print it!
…….
RET ; returns to operating system.
INTERUPCIONES CONT
INT 21
;ah = 1 guarda carácter en al
;ah = 2 escribe un carácter en la consola. El ascii del carácter a imprimir se pone el
dl
;ah = 7 es igual a el ah=2 pero el resultado no se ve en pantalla
;ah = 9 imprime una cadena en la consola. Considera el carácter $ como fin de
cadena.
EJERCICIO
Cómo imprimir un mensaje en pantalla
Directiva DB (Define Byte)
Sintaxis: [nom_variable] expresión
La directiva DB reserva memoria para datos de tipo byte (8 bits), o para una
variable de este tipo, inicializando o no dicho byte y los posteriores.
OPERADOR OFFSET
Operador OFFSET
Sintaxis:
OFFSET <variable>
OFFSET <etiqueta>
• Devuelve el OFFSET (desplazamiento) de la variable o etiqueta especificada.
El desplazamiento es la posición desde el principio del segmento hasta la
expresión indicada
MOV DX,OFFSET TEXTO ; Mover a DX el desplazamiento ó
; posición de la variable TEXTO
EJEMPLO
Imprimir carácter en pantalla
mov dx, offset msg
mov ah, 9
int 21h
ret
msg db "hello world $"
EJERCICIO
Imprimir un mensajes si número es menor, igual a mayor a 10.
mov bx,11
cmp bx,10
jb menor
ja mayor
je igual
mayor:
mov dx, offset msg1
mov ah, 9
int 21h
ret
menor:
mov dx, offset msg2
mov ah, 9
int 21h
ret
igual:
mov dx, offset msg3
mov ah, 9
int 21h
ret
msg1 db "Mayor que 10 $"
msg2 db "Menor que 10 $"
msg3 db "Igual a 10 $"
INT 21 CONT
INT 21h / AH=1
Lee un carácter de la entrada estándar (generalmente teclado). El resultado se
almacena en AL.
mov ah, 1
int 21h
ACCESO A DISCO
INT 21h / AH= 39h - crea directorio
Entrada: DS:DX -> nombre del fichero ; cadena terminada en
cero:
EJEMPLO
Ejemplo :
mov dx, offset filepath
mov ah, 39h
int 21h
ret
filepath DB "C:\mydir", 0
Resultado en: c:\emu8086\vdrive\C\mydir

También podría gustarte