Ejemplos de programas en Ensamblador 8086

| 2013-05-13 | 18 Comentarios »

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

Acerca del autor: Rodrigo Paszniuk

Ingeniero Informático, amante de la tecnología, la música, el ciclismo y aprender cosas nuevas.

Posts Relacionados

  • Ejercicios resueltos en Ensamblador 8086
  • Introducción al lenguaje Ensamblador

  • escayola35

    hola me da gusto saludarte y gracias por los ejemplos que pones, me ayudan a entender un poco este lenguaje ensamblador.

    • Hola, es un placer crear los tutoriales y recibir opiniones de este tipo, seguiré con más ánimos creándolos. Saludos!

  • escayola35

    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,

  • Nedy

    Hola buena tarde, estoy un aprendiendo un poco de esto. Son muy útiles tus ejemplos 🙂
    pero tengo una pregunta. ¿Como compilo los programas o los corro?

    • Hola Nedy, yo uso el emu 8086 para realizar lo que estás buscando. Saludos,

  • Vargas Oscar

    Gracias por los ejemplos

    • Denada Oscar, me alegro que les sirva los ejemplos!

      Gracias por comentar.

      Saludos,

  • Cortes Y

    Gracias por los ejemplos. Tengo una duda, ¿como harías una caja registradora que te imprima el total de la Compra? Ayuda porfa 🙂

    • 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!

  • Abraham Sinai

    Hola, que ensamblador usas?, nasm, fasm, etc ?

  • Alexiss Z Cardoza

    el ejercio de la raiz cuadrada esta mal

  • Cosas de Borrachos

    Me podrias dar pistas para lograr hacer un dado con todo y display? Por favor.Saludos

    • Rodrigo Paszniuk

      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!



SEGUÍNOS EN FACEBOOK


GITHUB