Ejemplos de programas en Ensamblador 8086

Primer programa para entender como utilizar los registros:

 ORG 100h
 mov ax, 10 ;AX=10
 mov bx, 00F9h ;BX=0xF9
 inc bx ;BX++
 add ax, 4 ;AX=AX+4
 mov cx,45 ;CX=45
 sub cx,cx ;CX=CX-CX
ret

Utilizar Loop:

ORG 100h
MOV CX, 5 
MOV BX, 1 
MOV DL, 2
comienzo:
 MOV AX, BX
 MUL DX
 MOV BX, AX
 LOOP comienzo
 RET

Potencia:

name "potencia" ;8 chars DOS
org 100h ;counter to 100h
mov cx, num2 
mov ax, num1
inicio:
 mov bx,num1
 mul bx ;ax = ax * bx
 loop inicio ;c--

mov num3,ax ;copiamos el resultado
ret
;Variables "db" para byte y "dw" para word
num1 dw 0Ah
num2 dw 03h
num3 dw 0h

Raiz cuadrada:

org 100h
siguiente:
 inc r
 mov ax, r
 mul ax
 cmp ax, m
 jbe siguiente ;(r*r) MENOR O IGUAL a m
dec r
ret

;Variables 
m dw 146
r dw 0 ;Al final debe ser r=sqrt(m).

Arreglos:

name "arreglo"
org 100h
;un areglo se puede acceder a travez de []
mov cx, 9 ;cuantos elementos voy a recorrer, empezamos con el 9
inicio:
 mov si, cx
 mov dl, v[si]
 cmp dl, mayor
 jng siguiente:
 mov mayor,dl
 siguiente:
 loop inicio
ret
v db 1,32,64,32,98,12,5,21,91,38
mayor db 0

Saber si un numero es mayor:

name "mayor"

mov AX, 5
mov BX, 5
;mov DX, AX

;CX el valor más grande entre AX Y BX 
;AX-BX mayor a 0
sub AX,BX
js A_MENOR_B
mov CX,AX
jmp FIN
A_MENOR_B:
mov CX,BX
FIN:

;mov AX,DX
ret

Multiplicacion:

ORG 100h
MOV AL, 200 ; AL = 0C8h
MOV BL, 4
MUL BL ; AX = 0320h (800)

RET

Interrupciones (Ejemplo de 21h):

name "int01"
org 100h
mov ah, 1 ;Leer un caracter de la entrada estandar
int 21h ;Llamada al sistema operativo (DOS)
mov tecla, al
mov ah, 2 ;imprime un simbolo a la consola
mov dl, simbolo ;el caracter a mostrar, en este caso la E
int 21h ;Llamada al DOS

inc tecla
mov ah, 7 ;NO imprime un simbolo a la consola
mov dl, tecla ; 
int 21h ;Llamada al DOS

ret
;Variables
tecla db 0 
simbolo db 45H
;ah que queres hacer
;ah = 1 guarda caracter en al
;ah = 2 escribe un caracter en la consola. El ascii del cacacter 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 caracter $ como fin de cadena.
;La direccion de la cadena se expresa en DX

Cadenas:

org 100h
mov msg[2], 34H
mov dx, offset msg 
mov ah, 9
int 21h
ret
msg db "hello world $"

 

Cambiar a mayúsculas:

name "int02"
ORG 100H
lectura:
 mov ah,7
 int 21h

 mov tecla, al
 cmp al,13
 jz fin:
cmp tecla, 122 ;si tecla es mayor a 122 entonces ir a fin3 (tecla > 122)
ja fin3
cmp tecla,96 ;si tecla no es mayor a 96 ir a fin3 (tecla <= 96)
jng fin3
sub tecla, 32 ;si es 'a' hasta 'z' entonces restarle 32
fin3: 
mov ah,2
mov dl,tecla
int 21h
jmp lectura
fin:
ret
tecla db 0


Procedimientos:

org 100h
mov bx, 5h
mov ax, 10h
call inicializar
inc ax
ret
inicializar PROC
 MOV ax, 1234h
 ret
inicializar ENDP

Archivos:

org 100h
 mov al, 0 ;modo de acceso para abrir arhivo, modo lectura/escritura
 mov dx, offset archivo ;offset lugar de memoria donde esta la variable
 mov ah, 3dh ;se intenta abrir el archivo
 int 21h ;llamada a la interrupcion DOS
 jc error ; si se prendio la bandera c ir a error

 mov handle, ax ;si no paso mover a lo que le dio el SO
 jmp leer

 error:
 ; ....

 ;leer archivo 
 leer:
 mov bx, handle
 mov cx, 5
 mov dx, offset leido
 mov ah, 3fh
 int 21h

 ;cerramos archivo
 mov bx, handle
 mov ah, 3eh
 int 21h 

 ;imprimir el contenido de leido
 mov dx, offset leido
 mov ah, 9
 int 21h

 ret 

archivo db "C:\prueba.txt", 0 ;ascii del nombre del archivo 
leido db "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"
handle dw ? ;identificador del arhivo

Interrupción 13h (Gráficos)

mov cx,1
mov al, 13h
 mov ah, 0
 int 10h ; set graphics video mode.
bucle1:
 mov dx, cx
 mov al, color ;AL = pixel color
 mov ah, 0ch ;Change color for a single pixel
 int 10h ;set pixel
cmp cx, 101 ;llegar hasta 100 x 100 (va en diagonal)
 jz fin
inc cx ;DX = row.
 add color, 2 ;para cambiar colores
 jmp bucle1 ;CX = column
fin:
 ret
color db 1
Rodrigo Paszniuk
Rodrigo Paszniuk

Ingeniero Informático y Especialista en Docencia Universitaria con 15 años de trayectoria en la industria de software. Mi enfoque está en la arquitectura de sistemas y la formación de talento técnico en Paraguay. A través de Programacion.py, busco compartir conocimiento práctico y elevar el estándar del código en nuestra región.

Artículos: 322

19 comentarios

  1. hola Rodrigo me dejaron estos ejercicios pero todavia no los hago,
    Escriba los siguientes programas en ensamblador de 16 bits con comentarios y estructura estándar. Para ello puede utilizar todos los programas que se han realizado con anterioridad. Puede reutilizar código de las clases y libros, pero no copiarlos en su totalidad.

    1) Escriba un programa que reciba un hexadecimal de 2 cifras por teclado y regrese el valor en decimal por la pantalla.

    2) Escriba un programa que reciba por teclado una palabra de 5 letras y la muestre al revés en la pantalla. (Por ejemplo si introduce Hotel, mostrará: letoH).

    3) Escriba un programa que reciba por teclado un número entero positivo de tres cifras y lo muestre en binario (separado en nibbles) en la pantalla.
    no se si me puedas ayudar

    • Hola, te comento que los ejercicios no te los voy a resolver pero si te puedo guiar en el proceso.

      En el 1) es una conversión nada más, convertir de base 16 a base 10, no es nada complejo.

      En el 2) guarda tu palabra en un vector, luego lo mostras al reves

      En el 3) sería convertir de base 10 a base 2, tampoco lo veo muy complejo, con esos ejemplos que dejé los va a poder resolver sin problemas.

      Acá solo hacemos los tutos y demás pero no resolvemos ejercicios, si hago eso te estaré perjudicando.

      Saludos,

    • Denada! No te voy a resolver el ejercicio porque eso lo tenés que hacer vos para aprender 😉 en este post vas a encontrar muchos ejemplos para que puedas usarlos como base ya que básicamente tendrías que utilizar arreglos o archivos para luego recorrerlo y sumar todos los montos para tener el total de la compra. Espero que te sirva mi comentario. Saludo!

    • Hola que tal? la verdad es que hace tiempo que no utilizo Ensamblador por lo que se me hace difícil poder ayudarte con eso. Pero si creo que otros te podrán ayudar 🙂 Saludos!

Deja un comentario