viernes, 18 de mayo de 2018

Programas lenguajes de interfaz

Programa que realiza una resta utilizando 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
       



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Macro imprime


       
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 ; Se repite el ciclo  


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

    MOV DL, "0"; Se transfiere la letra 0 al registro de datos en la parte baja del registro DX
    MOV CX, 10; Se transfiere 10 al registro CX
    PRINT_LOOP:; Se comenzara a imprimir hasta acabar las 26 interaciones
    MOV AH, 02; Se transfiere 02 al acumulador de byte alto
    INT 21h; Se efectua la interrupcion del dato ascii leido desde el teclado
    INC DL; Siguiente caracter numerico
    LOOP PRINT_LOOP; Continua hasta acabar las 10 vueltas

end  

       


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Macro que realiza una suma:


       

sumas macro a, b      ; Macro de la suma

    mov al, a         ; Se mueve el primer numero a al
    add al, b         ; A la parte baja del registro AX se le suma el segundo numero (b)
    add al, 30h       ; A la parte baja del registro AX se le suma 30h para obtener de nuevo el numero en decimal
    mov suma, al      ; Se mueve la parte baja del registro AX 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 la parte baja del registro DX
    int 21h           ; Interrupcion
    mov ah, 4ch       ; Se termina el 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 el registro 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

       


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Programa que utiliza una macro para mostrar en pantalla si eres o no mayor de edad:


       
.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 para menor 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 a la MACRO mmayor
 

        fin:;se declara el proceso fin

        finn;el prceso llama al MACRO finn

       

inicio endp   ;se termina a inicio 


       


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

Macro con archivo TXT
       

include 'macros.txt'

data segment
    var dw 6
    ends

main proc
   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
endm
       

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
Macro que se manda a llamar con diferentes archivos de texto TXT


       
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

       


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Programa que imprime números a partir de macros


       

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 que utiliza macros para mostrar mensaje de buenos días

       

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
       
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Hacer programa que realice una multiplicació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 operacion
   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


       

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Macro del segmento de datos
       
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

       

No hay comentarios.:

Publicar un comentario

Exposiciones - Lenguajes de interfaz

Equipo # 1 - Programación del puerto paralelo Un puerto paralelo es una interfaz entre un computador y un periférico, cuya principal carac...