Páginas

PROGRAMA DE MACROS



Ejemplo de Macro


  • Macro que imprime el decremento del contador CX.
;Macro que imprime el decremento de CX

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


  • Ordenamiento de vector con macros (Ricardo Castillo)

.model small                       ;MODELO DEL PROGRAMA
include 'emu8086.inc '             ;SE INCLUYE LA LIBRERIA EMU 8086
include 'macros.txt'          ;SE MANDA A LLAMAR LA MACROS QUE ES EXTERNA
                                   ;SE DEFINE EL STACK
.stack 100h

                                   ;SE DEFINE EL SEGMENTO DE DATOS
.data                              ;SE DECLARAN DOS VECTORES DE 8 POSICIONES Y SE INICIAN EN 0
  vector1 dw 8 dup(0)
  vector2 dw 8 dup(0)              ;SE DEFINEN LOS TAMANYOS DE LOS VECTORES
  tama    dw 1 dup(16)
  tama2   dw 1 dup(16)

.code
 
  ;==================INICIO=====================================================  
 
  lea si,vector1  ; movemos el registro de la primera posicion del vector1 a si
  mov ax,@data    ; Colocamos la direccion de segmento de datos
  mov ds,ax
  printn "   "
  printn " Valores del Primer Vector"
 
  llenado vector1, vector2, tama ;SE MANDA A LLAMAR UNA MACRO Y RECIBE 3 ARGUMENTOS
 
  ordenamiento vector2, tama     ;SE MANDA A LLAMAR OTRA MACRO
 
  printn " "
  print "  Vector original: "
  mov si, 0
 
  imprimir1:
    print " "
    mov ax, vector1[si]
    call print_num   
    add si, 2
    cmp si, tama2
    jb imprimir1 
    printn " "
    print "  Vector menor a mayor: "
    mov si,0
    jmp imprimir2
   
  imprimir2:
    print " "
    mov ax, vector2[si]
    call print_num   
    add si, 2
    cmp si, tama2
    jb imprimir2            
    mov si, 0
    jmp pila              
 
  pila: 
   mov ax, vector2[si]
   push ax
   add si,2
   cmp si, 16
   jb pila
   mov si,0
   printn ' '
   print '  Vector mayor a menor: '
   jmp imprimir3

 imprimir3:
   print ' '
   pop ax
   call print_num
   add si,2  
   cmp si,16
   jb imprimir3
   jmp salir

 salir:
    printn " "
    printn " "
    print " Aplasta tecla para terminar...   "
    mov ah, 0h
    int 16h
    mov ax, 4c00h
    int 21h
 
DEFINE_SCAN_NUM
DEFINE_PRINT_STRING
DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS
DEFINE_PTHIS       

END 

Dentro del archivo de texto:

ordenamiento macro vect2, tama    ;METODO BURBUJA
    inicioreg: ;INICIALIZA EL SOURCE INDEX EN 0
      mov si, 0 ;SE INICIALIZAN LOS REGISTROS EN 0
      xor ax,ax
      xor bx,bx
      xor cx,cx
      sub tama,2
      jmp ciclo1
   
    ciclo1:  ;SE COMPARA NUESTRO PRIMER CONTADOR CX SI ES MENOR QUE EL TAMAÑO DEL VECTOR -2
      mov si, 0;-2 PORQUE CON ESTO LOS CICLOS HACEN EXACTAMENTE LAS MISMAS COMPARACIONES PARA QUE EL VECTOR QUEDE ORDENADO
      mov dx, tama
      sub dx, cx
      cmp cx, tama
      jl ciclo2
      jmp fin
     
    ciclo2: ;SE COMPARA CON EL TAMAÑO DEL VECTOR -2 Y MENOS CX
      cmp si, dx ;UNA VEZ QUE ENTRA EL CICLO 2 YA ESTARÁN ORDENADOS
      jl condicion ;TODOS LOS VALORES, SE COMPARA UNO A UNO HASTA QUE
      add cx,2  ;MANDE EL MÁS GRANDE AL FINAL
      jmp ciclo1 ;
     
    condicion: ;SE COMPARAN LOS VALORES
      mov ax, vect2[si]
      cmp vect2[si+2], ax
      jl ordenamiento
      add si, 2 
      jmp ciclo2
     
    ordenamiento:
      mov ax, vect2[si+2]
      mov bx, vect2[si]
      mov vect2[si+2], bx
      mov vect2[si],ax
      add si, 2
      jmp ciclo2

    fin:   
endm


llenado macro vec1,vect2, tama ;PIDE CADA UNO DE LOS VALORES DE NUESTROS VECTORES POR TECLADO
  llenado1:                    ;RECIBE 3 ARGUMENTOS 
    printn " "                 ;SE IMPRIME SALTO DE LINEA 
    print "     >"            
    call scan_num              ;SE LEE EL NUMERO
    mov ax, cx                 ;SE MUEVE A AX
    mov [vector1 + si],ax      ;SE MUEVE AL VECTOR
    mov [vector2 + si],ax     
    add si,2
    cmp si,tama               ;SE COMPARA EL SOURCE INDEX CON EL TAMAÑO
    jne llenado1        
endm


  • Multiplicación con macros (Jonathan Guzmán)

.model small
.stack

.data        ;definición de datos(variables), donde se almacenara información
.code
   chr1  db ? ;primer digito
   chr2  db ? ;segundo digito
   chr3  db ? ;multiplo
   chr4  db ?
   r1    db ? ;resultado 1
   r2    db ? ;resultado 2
   r3    db ?
   r4    db ?
   ac    db 0 ;acarreo
   ac1   db 0
.startup
   ;cls
   operacion macro a, b, c, d ;creacion de macro operacion con 4 parametros
   mov al,a  ;unidad del segundo numero
   mov bl,b  ;unidad del primer numero
   mul bl       ;multiplicar
   mov ah,0     ;limpiamos ah0
   aam          ;separamos de hex a dec
   mov ac1,ah   ;decenas del primera multiplicacion
   mov r4,al    ;unidades del primera multiplicacion
            
   mov al,a  ;unidades del segundo numero
   mov bl,d  ;decentas del primer numero
   mul bl       ;multiplicar
   mov r3,al    ;movemos el resultado de la operacion a r3
   mov bl,ac1   ;movemos el acarreo a bl
   add r3,bl    ;sumamos resultado mas acarreo
   mov ah,00h   ;limpiamos ah por residuos
   mov al,r3    ;movemos el resultado de la suma a al
   aam          ;separamos  de hex a dec
   mov r3,al    ;guardamos unidades en r3
   mov ac1,ah   ;guardamos decenas en ac1
     
  
   mov al,c    ;al = chr3
   mov bl,b    ;bl = chr2
   mul bl         ;AL = chr3*chr2 (BL*AL)
   mov Ah,0h      ;
   AAM            ;ASCII Adjusment
   mov ac,AH      ;ac = AH (Acarreo)
   mov r2,AL      ;r2 = AL       (Unidad del resultado)

   mov al,c    ;AL = chr3
   mov bl,d    ;BL = chr1
   mul bl         ;AL = chr1*chr3 (BL*AL)
   mov r1,al      ;r1 = AL       (Decena del resultado)
   mov bl,ac      ;BL = Acarreo anterior
   add r1,bl      ;r1 = r1+ac (r1 + Acarreo)
   mov ah,00h     ;
   mov al,r1      ;AL = r1 (Asignaci?n para el ajust)
   AAM            ;ASCII Adjustment
   mov r1,al      ;r1 = AL
   mov ac,ah      ;ac = AH (Acarreo para la Centena del resultado)
   endm
  
   ;suma final
   ;R4 resulta ser las unidades de mul y no se toma en cuenta ya que se pasa entero
  
   suma macro respuesta3,respuesta2,respuesta1,acomulador ;creacion de macro suma con 4 parametros
   mov ax,0000h   ;limpiamos ax
  
   mov al,respuesta3      ;movemos el segundo resultado de la primera mult a al
   mov bl,respuesta2      ;movemos primer resultado de la segunda mult a bl
   add al,bl      ;sumamos
   mov ah,00h     ;limpiamos ah
   aam            ;separamos hex a dec
   mov respuesta3,al      ;r3 guarda las decenas del resultado final
   mov respuesta2,ah      ;r2 se utiliza como nuevo acarreo
  
   mov ax,0000h   ;''''
  
   mov al,acomulador     ;movemos el acarreo de la primera mult a al
   mov bl,respuesta1      ;movemos segundo resultado de la segunda mult a bl
   add al,respuesta2      ;sumamos el nuevo  acarreo de la suma anterior  a al
   add al,bl      ;sumamos al a bl
   mov ah,00h     ;limpiamos el registro ah
   aam            ;separamos de hex a dec
   mov respuesta1,al      ;r1 guarda las centenas
   mov respuesta2,ah      ;ah se sigue utilizando como acarreo
  
   mov al,respuesta2      ;movemos el acarreo a al
   mov bl,ac      ;movemos ac a bl
   add al,bl      ;sumamos al a bl
   ;aam            ;separamos hex a dec
   mov ac,al      ;mov al a ac como nuestro acarreo final
   endm
  
   mov ah,00h     ;Function(Set video mode)
   mov al,03      ;Mode 80x25 8x8 16
   int 10h        ;Interruption Video

   mov ah,01h     ;Function(character read) Guarda en AL
   int 21h        ;Interruption DOS functions
   sub al,30h     ;ajustamos valores
   mov chr1,al    ;[chr1].chr2 * chr3 = ac.r1.r2

   mov ah,01h     ;Function(character read) Guarda en AL
   int 21h        ;Interruption DOS functions
   sub al,30h     ;Ajustamos valores
   mov chr2,al    ;chr1.[chr2] * chr3 = ac.r1.r2

   mov ah,02h     ;Function(character to send to standard output)
   mov dl,'*'     ;Character to show
   int 21h

   mov ah,01h     ;Function(Read character) Guarda en AL
   int 21h        ;Interruption DOS Functions
   sub al,30h     ;Transform(0dec = 30hex)
   mov chr3,al    ;chr1.chr2 * [chr3] = ac.r1.r2
  
   mov ah,01h     ;Function(Read character) Guarda en AL
   int 21h        ;Interruption DOS Functions
   sub al,30h     ;Transform(0dec = 30hex)
   mov chr4,al    ;chr1.chr2 * [chr3] = ac.r1.r2

   mov ah,02h     ;Character to send to standar output
   mov dl,'='     ;
   int 21h        ;Interruption DOS functions
  
   ;Realizamos operaci?n
   operacion chr4,chr2,chr3,chr1 ;llamada al macro con parametros
   suma r3,r2,r1,ac1 ;llamada al macro con parametros

   mov ah,02h 
   mov dl,ac
   add dl,30h
   int 21h        ;Mostramos ac (millar)

   mov ah,02H
   mov dl,r1
   add dl,30h
   int 21h        ;Mostramos r1 (centena)

   mov ah,02H
   mov dl,r3
   add dl,30h
   int 21h        ;Mostramos r3 (decena)
  
   mov ah,02H
   mov dl,r4
   add dl,30h
   int 21h        ;unidad       

.exit
end

RESTA con Macros:

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


  • Línea de texto con Macro (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


  • Buenos días o Buenas tardes (Edgar 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


No hay comentarios:

Publicar un comentario

UNIDAD 3 y 4

UNIDAD 3: Configuración y administración del espacio en disco Para la gestión del almacenamiento de una base de datos existen 4 conce...