jueves, 3 de mayo de 2018

Programas con Macros y Procedimientos en EMU8086 Ejemplos de Compañeros de Clase

Ejemplo de Marco
restas macro p, s
    mov al, p
    sub al, s
    add al, 30h
    mov resta, al
    mov ah, 09
    lea dx, msj3
    int 21h
    mov ah, 02
    mov dl, resta
    int 21h
    mov ah, 4ch
    int 21h
endm


.model small
.stack 64
.data

    n1 db 0
    n2 db 0
    resta db 0
    msj  db "Dame el primer valor: $"
    msj2 db 10,13, "Dame el segundo valor $"
    msj3 db 10,13, "resta = $"

.code

mov ax, @data
mov ds, ax
mov ah, 09
lea dx, msj
int 21h

mov ah, 01
int 21h
sub al, 30h
mov n1, al

mov ah, 09
lea dx, msj2
int 21h
mov ah, 01
int 21h
sub al, 30h
mov n2, al

restas n1, n2

ret


Ejemplo de Melissa

inicio macro   ;declaramos la macro, le damos el nombre de inicio
mov ax,data   ;Cargamos el segmento de datos.
mov ds,ax
mov dx,ax
endm
.model small
.stack 64
.data
msj db “Este es mi primer macro”,10,13,“$”
.code
inicio  ;Llamamos al macro, lo unico que hace es cargar msj del segmento de datos.
mov ah,09h
lea dx,msj ;puede ser mov dx,offset msj
int 21h ;interrupcion
mov ax,4c00h ;Sale del programa
int 21h  ;interrupcion
end





Macro de Mendez

FIN MACRO 
MOV AH, 4CH  ;TERMINACION DEL PROGRAMA
INT 21H       
ENDM
;---------------------------------------------------

PILA SEGMENT PARA STACK "STACK"
DB 200 DUP (0)                     ;ESPACIO DE LAS INSTRUCCIONES
PILA ENDS
;---------------------------------------------------

DATOS SEGMENT PARA "DATA" ;DATOS A INGRESAR
VA DB "DESPUES DE MEDIO DIA (Y/N): ","$" ;SELECCION DE INICIO DEL PROGRAMA
VD DB 13,10," BUENOS DIAS","$"           ;MENSAJES MOSTRADOS EN PANTALLA                
VT DB 13,10," BUENAS TARDES","$"         ;MENSAJES MOSTRADOS EN PANTALLA
DATOS ENDS
;---------------------------------------------------

CODIGO SEGMENT PARA "CODE"
EMPIEZA PROC FAR
ASSUME CS: CODIGO, DS: DATOS, SS: PILA

MOV AX, DATOS   ;MANDAR LLAMAR A DATOS
MOV DS, AX

MOV AH, 0FH
INT 10H
MOV AH, 00H
INT 10H 

MOV DX,OFFSET VA   ;IMPRIMIR MENSAJE "DESPUES DE MEDIO DIA"
MOV AH,9
INT 21H

CALL PREGUNTA

EMPIEZA ENDP

PREGUNTA PROC NEAR     ;Inicia el 

MOV AH, 01H   ;ESPERA UNA ACCION
INT 21H

CMP AL, "Y"   ;Asignar una accion a una tecla
JZ TARDES

CMP AL, "N"   ;Asignar una accion a una tecla
JZ DIAS

CMP AL, "y"   ;Asignar una accion a una tecla
JZ TARDES

CMP AL, "n"   ;Asignar una accion a una tecla
JZ DIAS   


TARDES: 

MOV DX, OFFSET VT   ;IMPRIMIR MENSAJE "BUENOS TARDES"
MOV AH, 09
INT 21H

FIN

DIAS:

MOV DX, OFFSET VD   ;IMPRIMIR MENSAJE "BUENOS DIAS"
MOV AH, 09
INT 21H 


FIN

RET
PREGUNTA ENDP   ;FIN DE PREGUNTA PROC

CODIGO ENDS
END EMPIEZA     ;FIN DEL PROGRAMA



Ejemplo de Sergio Segura

imprime macro numero  ;Nuestra macro se llama imprimir, nuestro parámetro es numero
  mov ah,02h
  mov dl,numero  ;Indica que mueva al registro DL lo que pasamos como parámetro.
  add dl,30h  ;suma 30h para imprimir el número real.
  int 21h
endm

lup macro 
    mov num,cl
    imprime num ;Llamamos al macro con el valor de nuestra variable.
    loop inicio ;repite ciclo
endm

Fin macro
    mov ah,04ch ;Finaliza el programa.
    int 21h
    endm

.model small
.stack 64
.data
  num db 0  ;declaramos nuestra variable.
.code
  mov cx,9
inicio:
   
    lup
   
  Fin
end




Programa de Uriel---
imprime macro numero  ;Nuestra macro se llama imprimir, nuestro parámetro es numero
  mov ah,02h
  mov dl,numero  ;Indica que mueva al registro DL lo que pasamos como parámetro.
  add dl,30h  ;suma 30h para imprimir el número real.
  int 21h
endm

.model small
.stack 64
.data
  num db 0  ;declaramos nuestra variable.
.code
  mov cx,9
inicio:
  mov num,cl
  imprime num ;Llamamos al macro con el valor de nuestra variable.
loop inicio ;repite ciclo

  mov ah,04ch ;Finaliza el programa.
  int 21h
end


Programa de Pedro - Lulu - Emmanuel

bucle1 macro tama,x,y
mov CX, tama
BUCLE:
MOV DX, SI
ADD DX, x
MOV DH, y
coloca ;este es el macro para colocar en la posicion la letra
;se guarda letra por letra
MOV AL, [SI+OFFSET TITULO]
;guarda color por color
MOV BL, [SI+OFFSET COLORES]
color ;este es el macro que selecciona un color
INC SI
LOOPNZ BUCLE
endm

color macro ;macro que selecciona el color
MOV AH, 9
INT BIOS
endm

coloca macro;macro que selecciona una posicion
MOV AH, 2
INT BIOS
endm

.STACK 64
.MODEL SMALL

CR EQU 13
LF EQU 10
BIOS EQU 10H
DOS EQU 21H
TEXTO EQU 3
FIN EQU 4C00H

.DATA
;ponemos el texto que querramos mostrar
TITULO DB 'Agnax & Alizz Y pedrito',
;aqui va la lista de los colores
;del texto
colores DB 50H
DB 5fH
DB 50H
DB 5fH
DB 50H
DB 00H
DB 0f0H
DB 00h
DB 20H
DB 20H
DB 20H
DB 20H
DB 20H
DB 00H
DB 0fH
DB 0fH
DB 0fH
DB 0fH
DB 0fH
DB 0fH
DB 0fH
DB 0fH
DB 0fH
DB 0fH
DB 0fH

.CODE
;esta zona es para poner el texto
COLO PROC FAR
MOV AX, @DATA
MOV DS, AX
;Aquí se pone el macro del bucle
bucle1 25,30,12

MOV AH, 8
INT DOS

coloca ;este es el macro para colocar en la posicion la letra
MOV AX, FIN

INT DOS
COLO ENDP
RET



Programa de Emanuel Dominguez

MyMacro MACRO p1, p2, p3
MOV AX, p1
MOV BX, p2
MOV CX, p3
ENDM
ORG 100h
include 'MyMacro1.txt'
include 'MyMacro2.txt'

ret


_________________________________________________________
PRIMER ARCHIVO DE TEXTO: MyMacro1.txt

MyMacro 1, 2, 3


_________________________________________________________
SEGUNDO ARCHIVO DE TEXTO: MyMacro2.txt

MyMacro 4, 5, DX






Macro de compañera Abigail



include 'macros.txt'
data segment
    msg DB "Resultado: $"
    var dw 6
    ends

main proc
mov ax,@data
    mov ds, ax
    mov dx,offset msg
    mov ah,09h
    int 21h 
   

mov bx,1
mov ax,1
m_suma bx

m_final
  
end main

contenido del archivo .txt

m_final macro
mov ah, 4ch
int 21h
endm

m_suma macro var
add ax, bx
mov ah,02
mov dx,ax
add dx,30h
int 21h
endm



Ejemplo de Iyari Caloca



.model small ;modelo de memoria
.stack 64 ;segmento de pila
mmayor macro: ;declaracion de macro mmayor
MOV DX,OFFSET mens2;se lee la variable mens2
MOV AH,9
INT 21H;interupcion del DOS
endm;fin del macro
mmenor macro: ;declaracion de macro mmenor
MOV DX,OFFSET mens3se lee la variable mens3
MOV AH,9;trabaja con la interrupcion
INT 21H;interrupcion del DOS
endm;fin del macro
finn macro:;declaracion de macro fin
mov ah,4ch;sentencia para terminar el programa
int 21h;interrupcion del DOS
endm;fin del macro
;============================empieza segmento datos
.data
num1 db 0 ;variable para almacenar la edad
diez db 10 ;variable para poder imprimir 2 caracteres(se multiplica por el primer numero ingresado,para ser decenas)
mens db "ingresa tu edad ","$" ;mensaje inicial
mens2 db 13,10,"Eres mayor de edad","$" ;mensaje para mayor de edad
mens3 db 13,10,"Eres menor de edad","$" ;mensaje par amenor de edad
;===================================================termina segmento datos
;=================inicia segmento codigo
.code
inicio proc far
mov ax,@data;direccionamos el segmento de datos
mov ds,ax ;los datos se mueven a ax
mov ah,09;trabaja con la interrupcion
lea dx, mens;se lee la variable mens
int 21h ;interrupcion del DOS
mov ah,01;;espera la entrada del teclado
int 21h ;interrupcion de DOS
sub al,30h;se le restan 30 para convertir a numero
mul diez;se multiplica el numero ingresado para convertirlo a decenas
mov num1,al;el resultado se mueve al registro al
mov ah,01;se espera entrada del teclado
int 21h;interrupcion del DOS
sub al,30h;se tranforma a numero el segundo digito ingresado
add num1,al ;se suma a las decenas obtenidas
mov al,num1;se mueva a al el resultado de la suma
cmp al,18;se compara si el contenidos de al es 18
jge mayor;en caso de ser mayor se salta al proceso mayor
;=========== de no cumplirse(sea menor a 18)el programa continua a este segmento
mov ah,09 ;trabaja con la interrupcion
lea dx,mens3;se lee la variable mens3
int 21h;interrupcion del DOS
jmp fin;y salta a proceso fin
;====================procesos
mayor:;se declara el proceso mayor
mmayor;el proceso llama al MACRO mmayor
fin:;se declara el proceso fin
finn;el prceso llama al MACRO finn
inicio endp ;se termina a inicio




Ejemplo de Juan Rodolfo Torres

sumas macro a, b      ;macro de la suma
    mov al, a         ;se mueve el primer numero a al
    add al, b         ;a al se le suma el segundo numero (b)
    add al, 30h       ;a al se le suma 30h para obtener de nuevo el numero en decimal
    mov suma, al      ;se mueve al a suma
    mov ah, 09        ;salida de cadena de caracteres
    lea dx, msj3      ;se imprime el mensaje 3
    int 21h           ;interrupcion
    mov ah, 02        ;peticion para colocar el cursor
    mov dl, suma      ;se mueve suma a dl
    int 21h           ;interrupcion
    mov ah, 4ch       ;termina programa
    int 21h           ;interrupcion
endm
  

.model small          ;Modelo de memoria mas utilizado
.stack 64
.data                 ;segmento de datos con  variables

    n1 db 0
    n2 db 0
    suma db 0
    msj  db "Dame el primer valor: $"
    msj2 db 10,13, "Dame el segundo valor $"
    msj3 db 10,13, "suma = $"
  
.code                 ;segmento de codigo

mov ax, @data         ;se mueve data a ax
mov ds, ax            ;movemos ax a ds
mov ah, 09            ;salida de una cadena de caracteres
lea dx, msj           ;se imprime el primer mensaje
int 21h               ;interrupcion

mov ah, 01            ;peticion de leer caracter
int 21h               ;interrupcion
sub al, 30h           ;se resta 30h para obtener el numero
mov n1, al            ;se mueve al a n1

mov ah, 09            ;salida de una cadena de caracteres
lea dx, msj2          ;se imprime el segundo mensaje
int 21h               ;interrupcion
mov ah, 01            ;peticion de leer caracter
int 21h               ;interrupcion
sub al, 30h           ;se resta 30h para obtener el numero
mov n2, al            ;se mueve al a n2

sumas n1, n2          ;se llama al macro y se le envian los parametros
  
ret



Ejemplo de Armando Monreal

org 100h

inicio macro ;declaramos la macro, le damos el nombre de inicio
mov ax,@data ;Cargamos el segmento de datos.
mov ds,ax
mov dx,ax
endm

imprime macro numero ;Nuestra segunda macro se llama imprime, nuestro parametro es numero
mov ah,02h
mov dl,numero ;Indica que mueva al registro DL lo que pasamos como parametro.
add dl,2Fh ;suma 2Fh para imprimir el numero real.
int 21h
endm

.data
mensaje db "Programa de macro que imprime del 9 al 0",13,10,"$"
mensaje2 db 13,10, "Loop que imprime del 0 al 9",13,10,"$"
num db 0 ;declaramos nuestra variable.

.code
mov cx,10
lea dx,mensaje
mov ah,09h
int 21h
inicio:
mov num,cl
imprime num ;Llamamos al macro con el valor de nuestra variable.
loop inicio ;repite ciclo

lea dx,mensaje2
mov ah,09h
int 21h

MOV DL, "0";se transfiere la letra 0 al registro de datos en el byte bajo
MOV CX, 10;se transfiere 10 al registro contador
PRINT_LOOP:;va a imprimir hasta acabar las 26 interaciones
MOV AH, 02;se transifiere 02 al acumulador de byte alto
INT 21h; se realiza la interrupcion del dato ascii leido desde el teclado
INC DL;siguiente caracter numerico
LOOP PRINT_LOOP;continua hasta acabar las 10 vueltas

end





Ejemplo de David Mendoza
.model small ;Modelo de memoria
.stack

numero macro var
   mov ah,01h         ;Function(character read)
   int 21h            ;Interruption DOS functions
   sub al,30h         ;Convertimos a decimal
   mov var,al         ;Almacenamos en varible
endm

caracter macro chr
   mov ah,02h         ;Function(character to send to standard output)
   mov dl,chr         ;Caracter a imprimir en pantalla
   int 21h            ;Interruption DOS functions
endm

multiplicar macro var1, var2
   mov al,var1
   mov bl,var2
   mul bl
endm

separar macro alta, baja
   mov ah,00h          ;Se limpia la parte alta de ax
   AAM                 ;Separa el registro ax en su parte alta y baja
   mov alta,ah
   mov baja,al
endm

resultado macro var
   mov ah,02h 
   mov dl,var
   add dl,30h
   int 21h
endm

.data  ;Definicion de datos(variables), donde se almacenara informacion
   ;Variables del primer numero ingresado
   unidades_n1      db ? 
   decenas_n1       db ?
   
   ;Variables del segundo numero ingresado 
   unidades_n2      db ?
   decenas_n2       db ?
   
   ;Variables temporales para los resultados de la primera multiplicacion
   res_temp_dec_n1  db ?
   res_temp_cen_n1  db ?
   
   ;Variables temporales para los resultados de la segunda multiplicacion
   res_temp_dec_n2  db ?
   res_temp_cen_n2  db ?
   
   ;Variables para los resultados 
   res_unidades     db ?
   res_decenas      db ?
   res_centenas     db ?
   res_uni_millar   db ?
   
   ;Variable de acarreo en multiplicacion
   acarreo_mul      db 0
   
   ;Variable de acarreo en suma
   acarreo_suma     db 0

.code  
   
.startup
   
   mov ah,00h         ;Function(Set video mode)
   mov al,03          ;Mode 80x25 8x8 16
   int 10h            ;Interruption Video

   numero decenas_n1
   numero unidades_n1
   caracter '*'
   numero decenas_n2 
   numero unidades_n2
   caracter '='
 
   ;Realizamos las operaciones   
   
   ;Primera multiplicacion
   multiplicar unidades_n1, unidades_n2  
   separar acarreo_mul, res_unidades 

   
   ;Segunda multiplicacion
   multiplicar decenas_n1, unidades_n2   
   mov res_temp_dec_n1,al   
   mov bl,acarreo_mul       
   add res_temp_dec_n1,bl 
   mov al,res_temp_dec_n1
   separar res_temp_cen_n1, res_temp_dec_n1      
    
   ;Tercera multiplicacion
   multiplicar unidades_n1, decenas_n2
   separar acarreo_mul, res_temp_dec_n2
   ;Suma -> Decenas         
   mov bl, res_temp_dec_n1  
   add res_temp_dec_n2,bl   
   mov al, res_temp_dec_n2      
   separar acarreo_suma, res_decenas
   
   ;Cuarta multiplicacion
   multiplicar decenas_n1, decenas_n2   
   mov res_temp_cen_n2,al    
   mov bl,acarreo_mul       
   add res_temp_cen_n2,bl             
   mov al,res_temp_cen_n2
   separar res_uni_millar, res_temp_cen_n2     
   ;Suma -> Centenas        
   mov bl, res_temp_cen_n1  
   add res_temp_cen_n2, bl  
   mov bl, acarreo_suma     
   add res_temp_cen_n2,bl               
   mov al,res_temp_cen_n2  
   separar acarreo_suma, res_centenas 
   
   ;Acarreo para unidades de millar                         
   mov bl, acarreo_suma     
   add res_uni_millar, bl   
 
   ;Mostramos resultados
   resultado res_uni_millar   
   resultado res_centenas   
   resultado res_decenas 
   resultado res_unidades
           
.exit
end





Ejemplo de Davil Orlando

azul macro
    mov ah,0
    mov al,3h
    int 10h
    mov ax,0600h
    mov bh,0fh
    mov cx,0000h
    mov dx,184Fh
    int 10h
    mov ah,02h
    mov bh,00
    mov dh,00
    mov dl,00
    int 10h 
    mov ah,06h
    mov bh,1fh  ; esto es para el color de fondo y las letras
    mov cx,0000h
    mov dx,184fh
    int 10h
  
    mov ax,4c00h ; esto lo que hace es que una vez que haya cambiado la pantalla a color azul, se termina el programa
    int 21h
endm

morado macro
    mov ah,06h
    mov bh,5eh    ;esto es lo que cambia al procedimiento anterior
    mov cx,0000h
    mov dx,184fh
    int 10h
    mov ax,4c00h
    int 21h
endm

color macro
    mov ah,06h
    mov bh,3fh    ;esto es lo que cambia al procedimiento anterior
    mov cx,0000h
    mov dx,184fh
    int 10h
    mov ax,4c00h
    int 21h
endm

                        
                    


.model small

.stack
.data
titulo db 13,10,' CAMBIAR FONDO DE PANTALLA',13,10,'$'
mensaje1 db 'Presione ENTER si quiere la pantalla azul. ',13,10,'$'
mensaje2 db 'Presione la tecla 2 si quiere morado',13,10,'$'
mensaje3 db 'Presione la tecla 3 si quiere azul bajito',13,10,'$'


.code

inicio:
;-------------------------------------------- para preparar pantalla
mov ah,0
 mov al,3h  ;modo texto
 int 10h    ;interrupcion de video

 mov ax,0600h  ;limpiar la pantalla
 mov bh,0fh  ; pone el color de fonodo negro
 mov cx,0000h  ; esto es para las esquinas
 mov dx,184Fh
 int 10h
 mov ah,02h
 mov bh,00
 mov dh,00
 mov dl,00
 int 10h

;------------------------------------------------- mostrar mensajes
mov ax,@data  ;esto es la parametrizacion
mov ds,ax

lea dx,titulo   ;en estas lineas mostramos el titulo
mov ah,9h
int 21h

lea dx,mensaje1 ; mostramos el mensaje
mov ah,9h
int 21h

lea dx,mensaje2 ; mostramos el mensaje
mov ah,9h
int 21h

lea dx,mensaje3 ; mostramos el mensaje
mov ah,9h
int 21h


;--------------------------------------------------- capturacion de teclas
mov ah,08  ; pausa y capyuta la tecla que presione el usuario
 int 21h   ; esta interrupcion es para capturar

 cmp al,13    ; verifica si se presiono enter
 je llamarAzul  ;manda llamar a la etiqueta correspondiente

cmp al,50   ;aqui verifica si se ingreso el numero 2 (el numero dos es el numero 50 en ascii)
je llamarMorado ;manda llamar la etiqueta correspondiente

cmp al,51   ;aqui verifica si se ingreso el numero 2 (el numero dos es el numero 50 en ascii)
je llamar ;manda llamar la etiqueta correspondiente

jmp fin  ;si no se realiza nada, manda llamar a la etiqueta "fin"

;------------------------Etiquetas:

fin:
mov ax,4c00h
int 21h

llamarAzul:  ; manda llamar rl procedimiento Azulproc
azul

llamarMorado:  ; manda llamar el procedimiento Moracoproc
morado

llamar:  ; manda llamar el procedimiento Moracoproc
color

ret
;--------------------------------------------------------------------------------------------------------------------------------------------------







No hay comentarios:

Publicar un comentario