Ejemplos de programas en Ensamblador 8086

| 2013-05-13 | 16 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



SEGUÍNOS EN FACEBOOK


GITHUB