You are on page 1of 16

INSTITUTO TECNOLOGICO SUPERIOR DE INFORMATICA DE IBARRA

ORGANIZACIÓN COMPUTADORAS

LENGUAJE ENSAMBLADOR

El ensamblador, es un lenguaje de programación de bajo nivel muy apegado a la


máquina. 
Hoy en dia, algunas empresas de antivirus y videojuegos, siguen programando
pequeñas rutinas en ensamblador por su rapidez y apegamiento al computador. Esto
es debido, a que un programa en ensamblador, es ejecutado casi directamente por el
computador, ya que hablan casi "el mismo idioma". 

Programar en ensamblador, es un oficio minucioso de artesanía... sería como el


carpintero de lapiz en oreja que va al bosque, tala el árbol, lo lleva al taller, lo pule,
lima, da forma y saca el mueble. 

Conocer algunos conceptos básicos del lenguaje ensamblador creo que es esencial
para cualquier informático... acabado este pequeño curso, sabrán un poco más, y
tendrán otra visión de cómo funciona internamente un lenguaje de programación. 

 
 

 
Si todo sale bien, tendremos en INICIO > TODOS LOS PROGRAMAS > instalado el
BORLAND TASM. 

* NUESTRO PRIMER PROGRAMA 

Para crear nuestro primer programa, emplearemos el bloc de notas.

- Abrimos el bloc de notas y tecleamos el siguiente código: 

.model tiny 
.stack 
.data 
Message db "hola$" 
.code 

start: 
    mov dx,OFFSET Message 
    mov ax, SEG Message 
    mov ds,ax 
    mov ah,9 
    int 21h 

    mov ax,4C00h 
    int 21h 
END start 
 

A continuación, hacemos clic en ARCHIVO > GUARDAR COMO y vamos a la ruta


siguiente C:TASMBIN y lo guardamos como nombre.asm (en mi caso prc1.asm) 
 

Lo que haremos siempre que vayamos a general el .exe de algún código .asm sera lo
siguiente: 

INSTRUCCIÓN MOV:
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: memoria. Fuente: acumulador
Destino: acumulador. Fuente: memoria
Destino: registro de segmento. Fuente: memoria/registro
Destino: memoria/registro. Fuente: registro de segmento
Destino: registro. Fuente: registro
Destino: registro. Fuente: memoria
Destino: memoria. Fuente: registro
Destino: registro. Fuente: dato inmediato
Destino: memoria. Fuente: dato inmediato Ejemplo:

MOV AX,0006h
MOV BX,AX
MOV AH,4Ch
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 4Ch al semiregistro AH (parte alta
del registro de datos AX) para terminar la ejecución con la opción 4C de la interrupción
21h.

OPERACIONES LÓGICAS Y ARITMÉTICAS:

Las instrucciones de las operaciones lógicas son: AND, NOT, OR y XOR, éstas
trabajan sobre los bits de sus operandos. Para verificar el resultado de operaciones
recurrimos a la instrucción CMP. Las Binstrucciones utilizadas para las operaciones
algebraicas son: para sumar ADD, para restar SUB, para multiplicar MUL y para
dividir DIV.

Casi todas las instrucciones de comparación están basadas en la información contenida


en el registro de banderas. Normalmente las banderas de este registro que pueden ser
directamente manipuladas por el programador son la bandera de dirección de datos DF,
usada para definir las operaciones sobre cadenas. Otra que también puede ser
manipulada es la bandera IF por medio de las instrucciones STI y
CLI, para activar y desactivar respectivamente las interrupciones.
A continuación explicaremos brevemente las intrucciones aritméticas y lógicas por
separado:

OPERACIONES ARITMÉTICAS:
Las operaciones en aritmética binaria a entera permiten a la CPU realizar cálculos con
números enteros positivos y negativos con una representación en complemento a 2.

• NEG operando: cambia el signo del operando. Equivaldría al NOT del número y le
sumaría 1.

• ADD destino, fuente: destino = destino + fuente.

• ADC destino, fuente: destino = destino + fuente + carry (acarreo).


• SUB destino, fuente: destino = destino - fuente.

• SBB destino, fuente: destino = destino - (fuente + acarreo).

• MUL operando: multiplica sin considerar el signo. Multiplica el acumulador {AL} o


{AX} por el operando fuente. Si el operando fuente es de tipo byte, el resultado se
almacena en AX y si es de tipo palabra el resultado se almacena en AX la parte inferior
y en DX la palabra superior.Ç

Si tipo fuente = byte:


AX = AL * fuente (multiplicación sin signo)
Si tipo fuente = palabra:
DX, AX = AX * fuente (multiplicación sin signo)
Si mitad superior (CF: acarreo) del resultado = 0
En CC CF = 1
• IMUL operando: multiplica considerando el signo.
• DIV operando: divide sin considerar el signo, un número contenido en el acumulador
entre el operando fuente. El cociente se almacena en el acumulador. El resto se
almacena en la extensión del acumulador. Si la extensión de AX será DX (que ocurrirá
cuando sea de tipo palabra), la operación y la extensión de AL será AH.
AX
AX AL
DX
• IDIV operando: igual que el DIV pero considerando el signo.
• CBW: pasa de byte a palabra el contenido del acumulador.
• CWD: pasa de palabra a doble palabra el contenido del acumulador.
• INC destino: incrementa el destino.
• DEC destino: decrementa el destino.

OPERACIONES LÓGICAS:
Se usan para realizar operaciones a nivel de bits.

• NOT operando: cambia los bits 1 por 0 y viceversa y devuelve el resultado en el


mismo operando.
AL = F2h AL 1111 0010
NOT AL; NOT AL 0000 1101 = Odh

• OR destino, fuente: operación o lógico inclusivo. El resultado se almacena en


destino.
AX = FEDCh= 1111 1110 1101 1100
BX = 1234 h = 0001 0010 0011 0100
OR AX, BX 1111 1110 1111 1100 = FEFC h

• AND destino, fuente: la operación Y lógica entre 2 operandos, el resultado se deja en


destino.
AX = FEDC h 1111 1110 1101 1100
BX = 1234 h 0001 0010 0011 0100
ADD AX, BX 0001 0010 0001 0100 = 1214 h

• XOR destino, fuente: la operación o lógico exclusiva; el resultado se deja en destino.


AX = FEDC h 1111 1110 1101 1100
BX = 1234 h 0001 0010 0011 0100
XOR AX, BX 1110 1100 1110 1000 = ECE8 h

Ejercicio de suma:
CODIGOS DE RESTA, MULTIPLICACION Y DIVISION

Data segment
label1 DB "Selecciona una operacion $"
label2 DB "1.- Suma $"
label3 DB "2.- Resta $"
label4 DB "3.- Multiplicacion $"
label5 DB "4.- Division $"
label6 DB "5.- Salir $"
label7 DB "Ingrese una opcion $"
label8 DB "Ingrese numero $"
label9 DB "El resultado es $"
label10 DB "error no divisible entre 0 $"
label11 DB "`cociente $"
label12 DB "residuo $"
resultado DB 0
cociente DB 0
residuo DB 0
numero DB 0
signox DB 0
r2 DB ?
ac DB 0

Data ends

pila segment stack

DW 256 DUP (?)

pila ends

code segment

menu proc far

assume cs:code,ds:data,ss:pila
push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
xor dx,dx

;interlineado
mov ah,02h
mov dl,10
int 21h
mov ah,02h
mov dl,13
int 21h
;interlineado
mov ah,02h
mov dl,10
int 21h
mov ah,02h
mov dl,13
int 21h
;imprime seleccion de menu
mov ah,09h
mov dx,offset label1
int 21h

;interlineado
mov ah,02h
mov dl,10
int 21h
mov ah,02h
mov dl,13
int 21h

mov ah,09h
mov dx,offset label2
int 21h
mov ah,02h
mov dl,10
int 21h
mov ah,02h
mov dl,13
int 21h

mov ah,09h
mov dx,offset label3
int 21h

mov ah,02h
mov dl,10
int 21h
mov ah,02h
mov dl,13
int 21h

mov ah,09h
mov dx,offset label4
int 21h

mov ah,02h
mov dl,10
int 21h
mov ah,02h
mov dl,13
int 21h

mov ah,09h
mov dx,offset label5
int 21h

mov ah,02h
mov dl,10
int 21h
mov ah,02h
mov dl,13
int 21h

mov ah,09h
mov dx,offset label6
int 21h

mov ah,02h
mov dl,10
int 21h
mov ah,02h
mov dl,13
int 21h

mov ah,09h
mov dx,offset label7
int 21h

;lee teclado
mov ah,01h
int 21h
;ajunstando el teclado
xor ah,ah
sub al,30h
mov cx,2
;verificando opcion

cmp al,1
jz suma ;se dirige al metodo suma

cmp al,2
jz resta ;se dirige al metodo resta

cmp al,3
jz mult ;se dirige al metodo multiplik

cmp al,4
jz divi ;se dirige al metodo dividir

cmp al,5
jz fin

CODIGO PARA SUMAR


mov ah,02h
mov dl,10
int 21h
mov ah,02h
mov dl,13
int 21h
mov ah,09h
mov dx,offset label8
int 21h

;lee teclado
mov ah,01h
int 21h

;verificando si es negativo
cmp al,2dh
je signo

;ajusta teclado
sub al,30h
add resultado,al
jmp return1

signo:
mov ah,01h
int 21h
sub al,30h
neg al
add resultado,al
je return1

return1: loop suma


imp1:
cmp resultado,00
jl imp2
;interlineado
mov ah,02h
mov dl,10
int 21h
mov ah,02h
mov dl,13
int 21h
mov AH,09H
mov DX,OFFSET label9
int 21H
jmp imprime

imp2:
neg resultado
;interlineado
mov ah,02h
mov dl,10
int 21h
mov ah,02h
mov dl,13
int 21h

mov AH,09H
mov DX,OFFSET label9
int 21H
mov ah,02h
mov dl,'-'
int 21h
jmp imprime

imprime:

MOV AH,0
MOV AL,resultado
MOV CL,10
DIV CL

ADD AL,30H
ADD AH,30H; CONVIRTIENDO A DECIMAL
MOV BL,AH

MOV DL,AL
MOV AH,02H;IMPRIME LA DECENA
INT 21H

MOV DL,BL
MOV AH,02H
INT 21H;IMPRIME LA UNIDAD
mov cx,2
jmp menu

CODIGO PARA RESTAR


mov ah,02h
mov dl,10
int 21h
mov ah,02h
mov dl,13
int 21h
mov ah,09h
mov dx,offset label8
int 21h

;lee teclado
mov ah,01h
int 21h

;verificando si es negativo
cmp al,2dh
je signor

;ajusta teclado
sub al,30h
cmp cx,2
je etiqueta1
sub resultado,al
jmp return2
etiqueta1: mov resultado,al
jmp return2
signor:
mov ah,01h
int 21h
sub al,30h
neg al
cmp cx,2
je etiqueta1
sub resultado,al
je return2

return2: loop resta


jmp imp1

CODIGO PARA MULTIPLICAR


mov ah,02h
mov dl,10
int 21h
mov ah,02h
mov dl,13
int 21h
mov ah,09h
mov dx,offset label8
int 21h

;lee teclado
mov ah,01h
int 21h

;verificando si es negativo
cmp al,2dh
je signom
sub al,30h
cmp cx,2
je etiqueta2
mov ah,0
mul resultado
jmp return3
etiqueta2:
mov resultado,al
jmp return3
signom:
mov ah,01h
int 21h
sub al,30h
neg al
cmp cx,2
je etiqueta2
mov ah,0
mul resultado
jmp return3
return3:loop mult
mov resultado,al
jmp imp1

mov signox,0
divi:
mov ah,02h
mov dl,10
int 21h
mov ah,02h
mov dl,13
int 21h
mov ah,09h
mov dx,offset label8
int 21h

;lee teclado
mov ah,01h
int 21h

;verificando si es negativo
cmp al,2dh
je signod

sub al,30h
cmp cx,2
je etiqueta3
cmp al,0
je falla
mov ah,0
mov numero,al
mov al,resultado
div numero
jmp return4

etiqueta3:
mov resultado,al
jmp return4
signod:
mov ah,01
int 21h
sub al,30h
inc signox
cmp cx,2
je etiqueta3
mov ah,0
mov numero,al
mov al,resultado
div numero
jmp return4

return4:loop divi
mov cociente,al
mov residuo,ah
mov resultado,al
jmp imp3
falla:
mov ah,9
mov dx, offset label10
int 21h
jmp divi
imp3:

mov ah,02h
mov dl,10
int 21h
mov ah,02h
mov dl,13
int 21h
mov AH,09H
mov DX,OFFSET label9
int 21H
jmp imprimedivi

imprimedivi:
MOV AL,resultado

MOV CH,30H
ADD AL,CH
ADD AH,CH
MOV BL,AH

MOV AH,9
MOV DX,OFFSET label11
INT 21H

cmp signox,1
jz cambio
jmp termina

cambio:
mov dl,"-"
mov ah,02h
int 21h
mov signox,0

termina:
MOV DX,0
ADD cociente,30H
MOV DL,cociente
MOV AH,02H ;IMPRIME EL COCIENTE
INT 21H

MOV AH,9
MOV DX,OFFSET label12
INT 21H

MOV DX,0
ADD residuo,30H
MOV DL,residuo
MOV AH,02H ;IMPRIME EL RESIDUO
INT 21H

jmp menu
fin: ret
menu endp
code ends
end menu

You might also like