Mostrando entradas con la etiqueta Lenguajes de Interfaz. Mostrar todas las entradas
Mostrando entradas con la etiqueta Lenguajes de Interfaz. Mostrar todas las entradas

miércoles, 18 de abril de 2018

Programa con macros: Multiplicación de dos cifras (EMU8086)

.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

martes, 17 de abril de 2018

Ejercicio anterior de loop con macro

; Loop de tamanio entre 1-9 (utilizando macro)
; David Alejandro Mendoza Martinez
org 100h
.model small    ;Modelo de memoria small 
.stack 64       ;Segmento pila

imprimir macro msj  ;Macro para imprimir mensajes en pantalla
    mov ah, 09      ;Salida de una cadena de caracteres
    lea dx, msj     ;Cargar la direccion de cadena en DX
    int 21h         ;Interrupcion de sistema
endm
    
datos segment   ;Segmento de datos
    mensaje db "Ingresa el numero de veces que se repetira el mensaje (1-9)",13,10,'$'
    repetir db 13,10,"Repitiendo el ciclo $"
datos ends

codigo segment      ;Segmento de codigo                          
    assume cs:codigo, ds:datos  ;Asignacion de segmentos

    inicio:         ;Funcion inicio
        mov ax, datos       ;Movemos el segmento datos a AX
        mov ds, ax          ;Movemos lo que esta en el registro AX a DS
        
        imprimir mensaje

        mov ah, 01          ;Entrada de caracteres con eco
        int 21h             ;Interrupcion de sistema
        sub al, 30h         ;Conversion a digito del caracter ascii
        
        mov cl, al          ;Movemos a CL(contador) lo que hay en AL
        
        ciclo:              ;Inicio del ciclo
            imprimir repetir
        loop ciclo          ;Fin del ciclo 

        mov ax,4c00h        ;Terminar con codigo de retorno
        int 21h             ;Interrupcion de sistema

    end inicio  ;Fin de la funcion inicio
codigo ends     ;Cierre del segmento codigo

lunes, 16 de abril de 2018

Programa que mueve un caracter a la posicion que indique el usuario (macros)

org 100h
.model small

TITLE Programa que solicita una cadena y una posicion para mostrarla

gotoxy macro fila,col   ;Macro que  pone el cursor en la posicion deseada   
    mov ah,02h          ;Funcion imprimir caracter     
    mov dh,fila         ;Ingresamos la coordenada de x      
    mov dl,col          ;Ingresamos la coordenada de y      
    mov bh,0h           ;Numero de pagina         
    int 10h             ;Interrupcion  
endm                    ;Fin del macro
 
pantalla macro que      ;Macro que imprime el primer caracter de la palabra escrita          
    mov ah,02h          ;Funcion  imprimir caracter 
    mov dl,offset que   ;Ponemos el mensaje en dl     
    int 21h             ;Interrupcion
endm                    ;Fin del macro
 
imprime macro eztryng      ;Macro que imprime los mensajes que le enviemos    
    mov dx,offset eztryng  ;Ponemos elmensaje en dx
    mov ah,9               ;Funcion imprimir variable
    int 21h                ;Interrupcion
    endm                   ;Fin del macro
 
.data    ;Segmento de datos con  variables
    mensaje  DB "INGRESE UN CARACTER: ",13,10,"$"  
    mensaje2  DB "INGRESE X del 0 al 9: ",13,10,"$"  
    mensaje3  DB "INGRESE Y del 0 al 9: ",13,10,"$"
    caracter  DB ?     
    varx  DB ?      
    vary  DB ?
    vaa   db 0
    vtext db 100 dup('$')   ;Declaracion del vector
 
       
.code  ;Segmento de codigo 
    
    inicio:          ;Funcion de inicio 
    mov ax,@data     ;Almacenamos lo que esta en el segento data   
    mov ds,ax        ;Movemos ax a ds
    imprime mensaje  ;Llamamos al macro imprime y le enviamos la variable mensaje   
    mov si,00h       ;Limpiamos el registro si
    mov caracter,0   ;Limpiamos la variable caracter         
    leer:            ;Inicio de la funcion leer

        mov ax,0000         ;Limpiamos ax             
        mov ah,01h          ;Funcion de ingreso de caracter con impresion del mismo en pantalla            
        int 21h             ;Interrupcion   
        mov caracter[si],al ;Ponemos el caracter tecleado en el arreglo caracter       
        inc si              ;Incrementamos si     
        cmp al,0dh          ;Comparamos al=salto de linea         
        ja leer             ;De no ser igual repite la funcion leer para ingresar otro caracter   
        jb leer             ;En caso de que al=salto de linea continua el programa
        
        mov ah,02h          ;Funcion imprimir caracter       
        mov dl,10           ;Imprimimos un salto de linea  
        int 21h             ;Interrupcion
        imprime caracter    ;Llamamos al macro imprime y le enviamos la variable caracter
        mov ah,02h          ;Funcion imprime caracter   
        mov dl,10           ;Imprimimos un salto de linea
        int 21h             ;Interrupcion
        imprime mensaje2    ;Llamamos al macro imprime y le enviamos la variable mensaje2
        mov ax,0000         ;Limpiamos ax
        mov ah,01h          ;Fincion de ingreso de caracter con impresion del mismo en pantalla 
        int 21h             ;Interrupcion  
        sub al,30h          ;Le restamos 30h al caracter ingresado para transformarlo en un numero
        mov bl,al           ;Ponemos el numero en bl
        mov varx,al         ;Ponemos el numero en varx  
        imprime mensaje3    ;Llamamos al macro imprime y le enviamos la variable mensaje3  
        mov ah,01h          ;Funcion de ingreso de caracter con impresion del mismo en pantalla 
        int 21h             ;Interrupcion  
        sub al,30h          ;Le restamos 30h al caracter ingresado para transformarlo en un numero
        mov bl,al           ;Ponemos el numero en bl
        mov vary,al         ;Ponemos el numero en vary     
        mov ax,0003h        ;Funcion que limpia la pantalla   
        int 10h             ;Interrupcion de sistema
     
        mov ah,01h   ;Funcion de captura con impresion en pantalla       
        int 21h      ;Interrupcion    
        mov ax,4c00h ;Funcion de fin       
        int 21h      ;Interrupcion   
         
end inicio         ;Fin de la function inicio

       
 

jueves, 15 de marzo de 2018

Programa de multiplicación de números de 2 cifras

;EMU8086
.model small ;Modelo de memoria
.stack

.data  ;Definicion de datos(variables), donde se almacenara informacion
.code  
   ;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 paara 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
   
.startup
   ;cls
   mov ah,00h         ;Function(Set video mode)
   mov al,03          ;Mode 80x25 8x8 16
   int 10h            ;Interruption Video

   mov ah,01h         ;Function(character read)
   int 21h            ;Interruption DOS functions
   sub al,30h         ;ajustamos valores
   mov decenas_n1,al  ;[chr1].chr2 * chr3 = ac.r1.r2
 
   mov ah,01h         ;Function(character read)
   int 21h            ;Interruption DOS functions
   sub al,30h         ;Ajustamos valores
   mov unidades_n1,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)
   int 21h            ;Interruption DOS Functions
   sub al,30h         ;Transform(0dec = 30hex)
   mov decenas_n2,al  ;chr1.chr2 * [chr3] = ac.r1.r2
   
   mov ah,01h         ;Function(Read character)
   int 21h            ;Interruption DOS Functions
   sub al,30h         ;Transform(0dec = 30hex)
   mov unidades_n2,al
   
   mov ah,02h         ;Character to send to standar output
   mov dl,'='         ;
   int 21h            ;Interruption DOS functions
 
   ;Realizamos las operaciones
   
   ;Primera multiplicacion  ; Explicacion utilizando la multiplicacion de 99*99 ->(n1*n2)
   mov al,unidades_n1       ; al=9
   mov bl,unidades_n2       ; bl=9
   mul bl                   ; 9*9=81 -> (al=81)
   mov ah,00h               ;
   AAM                      ; Separa el registro ax en su parte alta y baja
   mov acarreo_mul,ah       ; acarreo_mul = 8
   mov res_unidades,al      ; res_unidades= 1 -> Reultado de unidades
   
   ;Segunda multiplicacion
   mov al,decenas_n1        ; al=9
   mov bl,unidades_n2       ; bl=9
   mul bl                   ; 9*9=81 -> (al=81)
   mov res_temp_dec_n1,al   ; res_temp_dec_n1= 81
   mov bl,acarreo_mul       ; bl= 8
   add res_temp_dec_n1,bl   ; res_temp_dec_n1= 81+8= 89
   mov ah,00h               ;
   mov al,res_temp_dec_n1   ; al= 89
   AAM                      ; Separa el registro ax en su parte alta y baja
   mov res_temp_cen_n1,ah   ; res_temp_cen_n1= 8  
   mov res_temp_dec_n1,al   ; res_temp_dec_n1= 9     
    
   ;Tercera multiplicacion  ; Resultado actual = 000>1
   mov al,unidades_n1       ; al= 9
   mov bl,decenas_n2        ; bl= 9
   mul bl                   ; 9*9=81 -> (al=81)
   mov ah,00h               ;
   AAM                      ; Separa el registro ax en su parte alta y baja
   mov acarreo_mul,ah       ; acarreo_mul= 8
   mov res_temp_dec_n2,al   ; res_temp_dec_n2= 1
                            ;
   mov bl, res_temp_dec_n1  ; bl= 9
   add res_temp_dec_n2,bl   ; res_temp_dec_n2= 1+9= 10
   mov ah,00h               ;
   mov al, res_temp_dec_n2  ; al = 10 
   AAM                      ; Separa el registro ax en su parte alta y baja
   mov acarreo_suma, ah     ; acarreo_suma = 1
   mov res_decenas,al       ; res_decenas  = 0 -> Reultado de decenas
   
   ;Tercera multiplicacion  ; Resultado actual = 00>01
   mov al,decenas_n1        ; al= 9
   mov bl,decenas_n2        ; bl= 9
   mul bl                   ; 9*9=81 -> (al=81)
   mov res_temp_cen_n2,al   ; res_temp_cen_n2= 81 
   mov bl,acarreo_mul       ; bl= 8
   add res_temp_cen_n2,bl   ; res_temp_cen_n2= 89
   mov ah,00h               ;
   mov al,res_temp_cen_n2   ; al= 89
   AAM                      ; Separa el registro ax en su parte alta y baja
   mov res_uni_millar,ah    ; res_uni_millar = 8
   mov res_temp_cen_n2,al   ; res_temp_cen_n2= 9
                            ; 
   mov bl, res_temp_cen_n1  ; bl= 8
   add res_temp_cen_n2, bl  ; res_temp_cen_n2= 17
   mov bl, acarreo_suma     ; bl= 1
   add res_temp_cen_n2,bl   ; res_temp_cen_n2= 17+1= 18
   mov ah,00h               ;
   mov al,res_temp_cen_n2   ; al= 18
   AAM                      ;
   mov acarreo_suma,ah      ; acarreo_suma= 1
   mov res_centenas,al      ; res_centenas= 8 -> Resultado de centenas
   
                            ; Resultado actual= 0>801
   mov bl, acarreo_suma     ; bl= 1
   add res_uni_millar, bl   ; res_uni_millar= 8+1= 9 -> Resultado de unidades de millar
                            ; Reultado actual 9801
 
   ;Mostramos resultados
   mov ah,02h 
   mov dl,res_uni_millar
   add dl,30h
   int 21h
   
   mov ah,02h 
   mov dl,res_centenas
   add dl,30h
   int 21h       

   mov ah,02H
   mov dl,res_decenas
   add dl,30h
   int 21h        

   mov ah,02H
   mov dl,res_unidades
   add dl,30h
   int 21h       
.exit
end 

martes, 13 de marzo de 2018

Loop que imprime letras de colores - Aportación de Emanuel Horta

;EMU8086

BIOS EQU 10H
DOS EQU 21H
FIN EQU 4C00H

.DATA
    TITULO DB 'Agnax & Alizz '
    COLORES DB 5BH
    DB 5FH
    DB 5BH
    DB 5FH
    DB 5BH
    DB 00H
    DB 0F0H
    DB 00H
    DB 09CH
    DB 09FH
    DB 09CH
    DB 09FH
    DB 09CH
    DB 00H
    DB 0CH
   
.CODE
    INICIO PROC NEAR:
    MOV AX, @DATA
    MOV DS, AX
    ;Esta parte de aqui no es necesaria
    INT BIOS
   
    MOV CX, 15
       
        BUCLE:
            ;Ponemos esto para no agarrar basura
            MOV DX,SI
            ADD DX,35  ;Columna
            MOV DH, 12 ;Renglon
            CALL COLOCA
            MOV AL, [SI+OFFSET TITULO]
            MOV BL, [SI+OFFSET COLORES]
            CALL COLOR
            INC SI
        LOOPNZ BUCLE
       
        MOV AH, 0
        INT DOS
        CALL COLOCA
        MOV AX, FIN
        INT DOS
   
    COLOR PROC
    MOV AH, 9
    INT BIOS
    RET
       
    COLOCA PROC
    MOV AH,2
    INT BIOS
    RET

END INICIO


;Turbo Assembler       

.MODEL SMALL
PILA SEGMENT STACK
    DB 64 DUP('PILA ')
PILA ENDS

BIOS EQU 10H
DOS EQU 21H
FIN EQU 4C00H

DATO SEGMENT    
    TITULO DB 'Agnax & Alizz '
    COLORES DB 5BH
    DB 5FH
    DB 5BH
    DB 5FH
    DB 5BH
    DB 00H
    DB 0F0H
    DB 00H
    DB 09CH
    DB 09FH
    DB 09CH
    DB 09FH
    DB 09CH
    DB 00H
    DB 0CH
DATO ENDS
    
CODIGO SEGMENT
    ASSUME DS:DATO, CS:CODIGO, SS:PILA
    
    INICIO PROC NEAR
    MOV AX, DATO
    MOV DS, AX
    ;Esta parte de aqui no es necesaria
    INT BIOS
    MOV CX, 15    
        BUCLE:
            ;Ponemos esto para no agarrar basura
            MOV DX,SI
            ADD DX,35 ;columna
            MOV DH,12 ;renglon
            CALL COLOCA
            MOV AL, [SI+OFFSET TITULO]
            MOV BL, [SI+OFFSET COLORES]
            CALL COLOR
            INC SI
        LOOPNZ BUCLE
       
        MOV AH,0
        INT DOS
        CALL COLOCA
        MOV AX, FIN
        INT DOS
   
    COLOR PROC
    MOV AH, 9
    INT BIOS
    RET
       
    COLOCA PROC
    MOV AH,2
    INT BIOS
    RET

END INICIO
CODIGO ENDS  


jueves, 1 de marzo de 2018

Tarea: Ejemplo de loop

;Turbo Assembler     

.model small
.stack 64

datos segment
    mensaje db "Ingresa el numero de veces que se repetira el mensaje (1-9)",13,10,'$'
    repetir db 13,10,"Repitiendo el ciclo $"
datos ends

codigo segment                              
    assume cs:codigo, ds:datos
inicio:
    
    mov ax, datos
    mov ds, ax
    
    mov ah, 09
    lea dx, mensaje
    int 21h

    mov ah, 01
    int 21h
    sub al, 30h    
    mov cl, al
    
    ciclo:
        mov ah, 09
        lea dx, repetir
        int 21h
    loop ciclo 

    mov ax,4c00h
    int 21h                                
codigo ends
end inicio

;EMU8086
.model small .stack 64 .data mensaje db "Ingresa el numero de veces que se repetira el mensaje (1-9)",13,10,'$' repetir db 13,10,"Repitiendo el ciclo $" .code inicio proc far mov ax, @data mov ds, ax mov ah, 09 lea dx, mensaje int 21h mov ah, 01 int 21h sub al, 30h mov cl, al ciclo: mov ah, 09 lea dx, repetir int 21h loop ciclo mov ax,4c00h int 21h inicio endp end

Práctica en clase: Loops en EMU8086 y Turbo Assembler



miércoles, 28 de febrero de 2018

Práctica en ensamblador: Menú de opciones

;EMU8086       

org 100h

.stack 64

.data
titulo db 13,10,'CAMBIAR FONDO DE PANTALLA',13,10,'$'

mensaje db '-Presione 0 para modo por default',13,10,'-Presione 1 para azul',13,10,'-Presione 2 para morado',13,10,'-Presione 3 para gris con letras negras',13,10,'Para salir, presione cualquier otra tecla',13,10,'$'

mensaje1 db 'Pantalla en color azul',13,10,'$'
mensaje2 db 'Pantalla en color morado',13,10,'$'
mensaje3 db 'Pantalla en color gris con letras negras',13,10,'$'

.code  

inicio:          ;Funcion
  ;--------------------------------------------------- 
 ;mov ah, 0      ;limpia el registro
 ;mov al,3h       ;modo de texto
 ;int 10h         ;interrupcion de video
 
 ;mov bh,0fh      ;0 color negro , f color de letra blanca
 ;mov cx,0000h    ;es la esquina superior izquierda reglon: columna
 ;mov dx,184Fh    ;es la esquina inferior derecha reglon: columna
 ;int 10h 
 
 ;--------------------------------------------------
 mov ax,@data     ;llamar a .data
 mov ds,ax        ;guardar los datos en ds
 
 lea dx,titulo    ;imprimir el mensaje 
 mov ah,9h
 int 21h
 
 lea dx,mensaje   ;imprimir mensaje
 mov ah,9h
 int 21h
 ;---------------------------------------------------
 mov ah,08              ;pausa y espera a que el usuario precione una tecla
 int 21h                ;interrupcion para capturar
 cmp al,48
 je llamarDefault
 cmp al,49       
 je llamarAzul     
 cmp al,50        
 je llamarMorado   
 cmp al,51         
 je llamarGris   
 jmp fin

fin:
 mov ax,4c00h       ;funcion que termina el programa
 int 21h

llamarDefault:
 CALL DEFAULT

llamarAzul:
 CALL AZULPROC      ;llama al procedimiento

llamarMorado:
 CALL MORADOPROC    ;llama  al procedimiento

llamarGris:
 CALL GRISPROC

DEFAULT PROC NEAR
 mov ah, 0      ;limpia el registro
 mov al,3h      ;modo de texto
 int 10h
 
 mov ax,0600h
 mov bh,07h
 mov cx,0000h
 mov dx,184Fh
 int 10h
  
 CALL inicio 
DEFAULT ENDP
                    
AZULPROC PROC NEAR
 mov ah,0
 mov al,3h
 int 10h
 
 mov ax,0600h
 mov bh,1fh
 mov cx,0000h
 mov dx,184Fh
 int 10h
  
 lea dx,mensaje1 
 mov ah,9h
 int 21h
  
 CALL inicio
 RET
AZULPROC ENDP

MORADOPROC PROC NEAR
 mov ah,0
 mov al,3h
 int 10h
   
 mov ax,0600h
 mov bh,5fh
 mov cx,0000h
 mov dx,184Fh
 int 10h   
  
 lea dx,mensaje2  
 mov ah,9h
 int 21h
  
 CALL inicio
 RET
MORADOPROC ENDP

GRISPROC PROC NEAR
 mov ah,0
 mov al,3h
 int 10h  

 mov ax,0600h
 mov bh,80h
 mov cx,0000h
 mov dx,184Fh
 int 10h     

 lea dx,mensaje3
 mov ah,9h
 int 21h
  
 CALL inicio
 RET    
GRISPROC ENDP
end inicio   
;TURBO ASSEMBLER       

datos segment
    titulo db 13,10,'CAMBIAR FONDO DE PANTALLA',13,10,'$'

    mensaje db '-Presione 0 para modo por default',13,10,'-Presione 1 para azul',13,10,'-Presione 2 para morado',13,10,'-Presione 3 para gris con letras negras',13,10,'Para salir presione cualquier otra tecla',13,10,'$'

    mensaje1 db 'Pantalla en color azul',13,10,'$'
    mensaje2 db 'Pantalla en color morado',13,10,'$'
    mensaje3 db 'Pantalla en color gris con letras negras',13,10,'$'
datos ends


codigo segment
    assume ds:datos, cs:codigo

    inicio:          ;Funcion
  ;--------------------------------------------------- 
 ;mov ah, 0      ;limpia el registro
 ;mov al,3h       ;modo de texto
 ;int 10h         ;interrupcion de video
 
 ;mov bh,0fh      ;0 color negro , f color de letra blanca
 ;mov cx,0000h    ;es la esquina superior izquierda reglon: columna
 ;mov dx,184Fh    ;es la esquina inferior derecha reglon: columna
 ;int 10h 
 
 ;--------------------------------------------------
 mov ax,datos     ;llamar a .data
 mov ds,ax        ;guardar los datos en ds
 
 lea dx,titulo    ;imprimir el mensaje 
 mov ah,9h
 int 21h
 
 lea dx,mensaje   ;imprimir mensaje
 mov ah,9h
 int 21h
 ;---------------------------------------------------
 mov ah,08              ;pausa y espera a que el usuario precione una tecla
 int 21h                ;interrupcion para capturar
 cmp al,48
 je llamarDefault
 cmp al,49       
 je llamarAzul     
 cmp al,50        
 je llamarMorado   
 cmp al,51         
 je llamarGris   
 jmp fin

fin:
 mov ax,4c00h       ;funcion que termina el programa
 int 21h

llamarDefault:
 CALL DEFAULT

llamarAzul:
 CALL AZULPROC      ;llama al procedimiento

llamarMorado:
 CALL MORADOPROC    ;llama  al procedimiento

llamarGris:
 CALL GRISPROC

DEFAULT PROC NEAR
 mov ah, 0      ;limpia el registro
 mov al,3h      ;modo de texto
 int 10h
 
 mov ax,0600h
 mov bh,07h
 mov cx,0000h
 mov dx,184Fh
 int 10h
  
 CALL inicio 
DEFAULT ENDP
                    
AZULPROC PROC NEAR
 mov ah,0
 mov al,3h
 int 10h
 
 mov ax,0600h
 mov bh,1fh
 mov cx,0000h
 mov dx,184Fh
 int 10h
  
 lea dx,mensaje1 
 mov ah,9h
 int 21h
  
 CALL inicio
 RET
AZULPROC ENDP

MORADOPROC PROC NEAR
 mov ah,0
 mov al,3h
 int 10h
   
 mov ax,0600h
 mov bh,5fh
 mov cx,0000h
 mov dx,184Fh
 int 10h   
  
 lea dx,mensaje2  
 mov ah,9h
 int 21h
  
 CALL inicio
 RET
MORADOPROC ENDP

GRISPROC PROC NEAR
 mov ah,0
 mov al,3h
 int 10h  

 mov ax,0600h
 mov bh,70h
 mov cx,0000h
 mov dx,184Fh
 int 10h     

 lea dx,mensaje3
 mov ah,9h
 int 21h
  
 CALL inicio
 RET    
GRISPROC ENDP

codigo ends
end inicio          

martes, 20 de febrero de 2018

Práctica con constantes EMU8086 y Turbo Assembler






Registros de puntero (apuntadores)



Registro de Apuntador de Instrucciones (IP). Es de 16 bits y contiene el desplazamiento de dirección de la siguiente instrucción que se ejecuta. El IP esta asociado con el registro CS en el sentido de que el IP indica la instrucción actual dentro del segmento de código que se esta ejecutando actualmente. Los procesadores 80386 y posteriores tienen un IP ampliado de 32 bits, llamado EIP.

Registros Apuntadores. Los registros SP (apuntador de la pila) Y BP (apuntador de base) están asociados con el registro SS y permiten al sistema accesar datos en el segmento de la pila.

  • Registro SP. El apuntador de la pila de 16 bits esta asociado con el registro SS y proporciona un valor de desplazamiento que se refiere a la palabra actual que esta siendo procesada en la pila. Los procesadores 80386 y posteriores tienen un apuntador de pila de 32 bits, el registro ESP. El sistema maneja de forma automática estos registros.

  • Registro BP. El BP de 16 bits facilita la referencia de parámetros, los cuales son datos y direcciones transmitidos vía pila. Los procesadores 80386 y posteriores tienen un BP ampliado de 32 bits llamado el registro EBP.

Registros Indice. Los registros SI y DI están disponibles para direccionamiento indexado y para sumas y restas.

  • Registro SI. El registro índice fuente de 16 bits es requerido por algunas operaciones con cadenas (de caracteres). En este contexto, el SI esta asociado con el registro DS. Los procesadores 80386 y posteriores permiten el uso de un registro ampliado de 32 bits, el ESI.
  • Registro DI. El registro índice destino también es requerido por algunas operaciones con cadenas de caracteres. En este contexto, el DI esta asociado con el registro ES. Los procesadores 80386 y posteriores permiten el uso de un registro ampliado de 32 bits, el EDI.