miércoles, 8 de mayo de 2019

3. Colores Modificado 9

Modificación del programa # 9 " Colores " Por mi compañero Ambrocio isaias Laureano


CR EQU 13    ;Declaro retorno de carro
LF EQU 10    ;Declaro salto de linea
BIOS EQU 10H ;Declaro interrupcion 10h
DOS EQU 21H  ;Declaro interrupcion 21h
TEXTO EQU 3  ;Declaro el servicio 03 para la impresion de texto desde BIOS
FIN EQU 4C00H ;Declaro interrupcion de exit

VARIABLES SEGMENT          ;Declaro las variables  
    include "emu8086.inc"
    TITULO DB "JUENITO_XD" ;Un texto
    COLORES DB 01001110B   ;Una agrupacion de colores
    DB 11101111B           ;0= cursos parpadeante 000=color de fondo 0000=color del texto
    DB 10110001B
    DB 01011100B
    DB 00110001B
    DB 01011111B
    DB 01101011B
    DB 01011100B
    DB 01101111B
    DB 01001110B
    DB 00110001B
VARIABLES ENDS

VPILA SEGMENT;STACK       ;Declaro la pila
    DB 64 DUP("PILA")
VPILA ENDS

CODIGO SEGMENT
    COLO PROC FAR    ;Declaro un procedimiento
    ASSUME CS:CODIGO, DS:VARIABLES, SS:VPILA
    MOV AX,VARIABLES
    MOV DS,AX
    MOV AX,TEXTO     ;Invoco el servicio de impresion de texto 
    INT BIOS         ;Ejecuto el servicio con 10h
    MOV CX,11        ;Declaro el iterador en 11
    XOR SI,SI        ;Borro SI
    BUCLE:           ;Llamo al bucle
    PUSH CX
    MOV DX,SI        ;Indico la posicion de la letra a imprimir con SI
    ADD DX,35        ;Indico la coordenada en x, la coordenada inicial es x=35
    MOV DH,12        ;Indico la coordenada en y  
    CALL COLOCA      ;Llamo al sistema para que coloque el cursor donde yo quiero
    MOV AL,[SI+OFFSET TITULO] ;Le indico la letra a imprimir pasandole SI y el texto como parametros
    MOV BL,[SI+OFFSET COLORES]   ;Le indico los colores a imprimir pasandole SI y el conjunto de colores como parametros
    CALL COLOR                ;Llamo a la impresion del texto
    POP CX
    INC SI                     ;Incremento a SI para modificar la letra a imprimir y la coordenada en x
    
    LOOPNZ BUCLE
    MOV AH,8    ;08:Lee un caracter sin imprimir nada en pantalla
    INT DOS     ;Ejecuto el servicio
    XOR DX,DX   ;Limpio DX
    CALL COLOCA ;Coloco el cursor en las coordenadas x=0 y=0     
    PUT_CURSOR 10,10
    print "Hola mundo" 
    PUT_CURSOR 20,20
    print "Estas son las coordenadas( x=20, y=20)"
    TERMINA        ;MACRO TERMINA
    COLO ENDP
       
    include "C:\Users\Isaías\Desktop\Librerias.inc"
    
CODIGO ENDS
END COLO


 COLOR PROC  
    MOV AH,9         ;Invoco al servicio 09 para imprimir texto con formato
    XOR BH,BH        ;Limpio bh para indicarle que imprima en la misma pagina
    INT BIOS         ;Hago la impresion pidiendo la interrupcion 10h
    RET    ;retorno al programa principal
    COLOR ENDP
    
    COLOCA PROC
    MOV AH,2   ;Invoco al servicio 02 de 10h para posicionar el cursor
    XOR BX,BX  ;Limpio bx para decirle que debe ser en la misma pagina
    INT BIOS   ;Coloco el cursor con 10h en funcion del servicio 02
    RET   ;retorno al programa principal
    COLOCA ENDP
 
 PUT_CURSOR MACRO X,Y
 MOV AH,02H   ;Para posicionar el cursor
    MOV BH,00H   ;Coloco en la pagina 0
    MOV DH,X  ;Establesco las coordenadas, x=dh=renglon
 MOV DL,Y     ; Establesco las coordenadas y=dl=columna
    INT 10H      ;ejecuto la interrupción
 endm
 
 TERMINA MACRO
 MOV AX,4C00H  ;Termino el programa
    INT 21H     ;llamando a la interrupcion 21h
 ENDM


Programa 9: colores en letras y fondo por Torres.
CR EQU 13    ;Declaro retorno de carro
LF EQU 10    ;Declaro salto de linea
BIOS EQU 10H ;Declaro interrupcion 10h
DOS EQU 21H  ;Declaro interrupcion 21h
TEXTO EQU 3  ;Declaro el servicio 03 para la impresion de texto desde BIOS
FIN EQU 4C00H ;Declaro interrupcion de exit

VARIABLES SEGMENT          ;Declaro las variables 
    include "emu8086.inc"
    TITULO DB "Colores_UwU" ;Un texto      
    M1 DB "A",'$'
    COLORES DB 01001110B   ;Una agrupacion de colores
    DB 01101111B         
    DB 01110011B
    DB 01011100B
    DB 00110001B
    DB 01011111B
    DB 01101011B
    DB 01011100B
    DB 01101111B
    DB 01001110B
    DB 01101111B
VARIABLES ENDS

VPILA SEGMENT;STACK       ;Declaro la pila
    DB 64 DUP("PILA")
VPILA ENDS

CODIGO SEGMENT
    COLO PROC FAR    ;Declaro un procedimiento
    ASSUME CS:CODIGO, DS:VARIABLES, SS:VPILA
    MOV AX,VARIABLES
    MOV DS,AX
    MOV AX,TEXTO     ;Invoco el servicio de impresion de texto
    INT BIOS         ;Ejecuto el servicio con 10h
    MOV CX,11        ;Declaro el iterador en 11
    XOR SI,SI        ;Borro SI
    BUCLE:           ;Llamo al bucle
    PUSH CX
    MOV DX,SI        ;Indico la posicion de la letra a imprimir con SI
    ADD DX,35        ;Indico la coordenada en x, la coordenada inicial es x=35
    MOV DH,12        ;Indico la coordenada en y 
    CALL COLOCA      ;Llamo al sistema para que coloque el cursor donde yo quiero
    MOV AL,[SI+OFFSET TITULO] ;Le indico la letra a imprimir pasandole SI y el texto como parametros
    MOV BL,[SI+OFFSET COLORES]   ;Le indico los colores a imprimir pasandole SI y el conjunto de colores como parametros
    CALL COLOR                ;Llamo a la impresion del texto
    POP CX
    INC SI                     ;Incremento a SI para modificar la letra a imprimir y la coordenada en x
   
    LOOPNZ BUCLE
    MOV AH,8    ;08:Lee un caracter sin imprimir nada en pantalla
    INT DOS     ;Ejecuto el servicio
    XOR DX,DX   ;Limpio DX
    CALL COLOCA ;Coloco el cursor en las coordenadas x=0 y=0   
    PUT_CURSOR 2,32
    print "Colores modificado"
    PUT_CURSOR 20,20
    print "El programa a sido ejecutado correctamente"
    TERMINA        ;MACRO TERMINA
    COLO ENDP
     
    include "libtorres.inc" 
    
    
   
CODIGO ENDS
END COLO


include 'emu8086.inc'

CUADRO MACRO XI,YI,XF,YF,COLOR
MOV AX, 0600H ;
MOV BH, COLOR ; COLOR DE FONDO Y LETRA
MOV BL, 00H
MOV CH, YI ; Y INICIAL
MOV CL, XI ; X INICIAL
MOV DH, YF ; Y FINAL
MOV DL, XF ; X FINAL
INT 10h
endM

POSICION MACRO X,Y
; **** POSICIONA EL CURSOR ********
MOV DH, Y ; POSICI[ON EN Y
MOV DL, X ; POSICI[ON EN X
MOV AH, 02
MOV BH, 00
INT 10H
ENDM

DESPLEGAR MACRO MENSAJE
MOV AH,09 ;****** MUESTRA MENSAJE *******
MOV DX,OFFSET MENSAJE
INT 21h
ENDM

DATOS SEGMENT ;SEGMENTO DE DATOS
M1 DB "A",'$'
M2 DB "B",'$'
M3 DB "C",'$'
M4 DB "",'$'

datos ends
cincocuadros macro

cuadro 1,1,20,5,98
posicion 10,3
desplegar M1

cuadro 21,1,40,5,11011100b
posicion 30,3
desplegar M2

cuadro 41,1,60,5,36
posicion 50,3
desplegar M3




endM
CODIGO SEGMENT
ASSUME CS: CODIGO,DS:DATOS,SS:PILA
PRINCIPAL PROC

MOV AX,DATOS
MOV DS,AX

cincocuadros

PRINCIPAL ENDP ;FIN DEL PROCEDIMIENTO
CODIGO ENDS ;FIN DEL SEGMENTO

END PRINCIPAL

martes, 7 de mayo de 2019

3. Macros local etiqueta p8

Programa 8 (pt-1): 

Imprime tres cadenas ingresadas por teclado

Código:

;PROGRAMA 08-1PT

CR EQU 13
LF EQU 10
FIN EQU 4C00H
BIOS EQU 10H

INCLUDE 'EMU8086.INC'
INCLUDE 'C:\emu8086\MySource\PROG-8-PT2.txt'           

DATOS SEGMENT
    NOMBRE DB 30 DUP(32), '$'
    DIR DB 30 DUP(32), '$'
    TLF DB 15 DUP(32), '$'
    MENS1 DB 'NOMBRE: ', '$'
    MENS2 DB 'DIRECCION: ', '$'
    MENS3 DB 'TELEFONO:', '$'
    ENTERR DB CR, LF, '$'
DATOS ENDS
        
PILA SEGMENT STACK
    DB 64 DUP('PILA')
PILA ENDS
                
CODIGO SEGMENT
    INICIO PROC FAR
    ASSUME CS:CODIGO, DS:DATOS, SS:PILA
    MOV AX, DATOS
    MOV DS, AX
    MODO_DE_VIDEO
    
    ESCRIBE MENS1
    PEDIR NOMBRE, 5
    ESCRIBE ENTERR
                  
    ESCRIBE MENS2
    PEDIR DIR, 8
    ESCRIBE ENTERR               
    ESCRIBE MENS3
    PEDIR TLF, 10
    ESCRIBE ENTERR
    
    ESCRIBE ENTERR
    ESCRIBE ENTERR
    
    ESCRIBE NOMBRE
    ESCRIBE ENTERR
    ESCRIBE DIR
    ESCRIBE ENTERR
    ESCRIBE TLF
    ESCRIBE ENTERR
    SALIR

CODIGO ENDS
END INICIO

Programa 8 (pt-2):  

Macros Pedir, Escribe ,Salir
Nombre asignado al archivo extensión .txt  PROG-8-PT2.txt

Segunda Parte

Código:

PROGRAMA 08-2PT

PEDIR MACRO NOM, N
    LOCAL BUCLE
    MOV SI, OFFSET NOM
    MOV CX, N
    BUCLE:    
        MOV AH, 8
        INT 21H
        MOV [SI], AL
        MOV AH, 2
        MOV DL, AL
        INT 21H   
        INC SI
        LOOPNZ BUCLE              
ENDM
                    
ESCRIBE MACRO MENS           
    MOV AH, 09
    MOV DX, OFFSET MENS
    INT 21H
ENDM
                  
MODO_DE_VIDEO MACRO
    MOV AX,3
    INT BIOS
ENDM
                   
SALIR MACRO
    MOV AX, FIN
    INT 21H    
ENDM   



Resultado:





Referencia:

https://www.alpertron.com.ar/INST8088.HTM

miércoles, 1 de mayo de 2019

3. Programas en Turbo Assembler (parte 3)

Programa 9:

COLORES LETRAS

Código:

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

DATOS SEGMENT
    TITULO DB 'GRIS_MO_XD'
    COLORES DB 01001110B
    DB 01101111B
    DB 00110001B
    DB 01011100B
    DB 00110001B
    DB 01011111B
    DB 01101011B
    DB 01011100B
    DB 01101111B
    DB 01001110B
    DB 00110001B
    
DATOS ENDS

PILA SEGMENT STACK
 DB 64 DUP('PILA')
PILA ENDS

CODIGO SEGMENT
    COLO PROC FAR
    ASSUME CS: CODIGO, DS: DATOS, SS:PILA
    MOV AX, DATOS
    MOV DS, AX
    MOV AX, TEXTO
    INT BIOS
    MOV CX, 11
    XOR SI, SI
    BUCLE:
    PUSH CX
    MOV DX, SI
    ADD DX, 35
    MOV DH, 12
    CALL COLOCA
    MOV AL, [SI+OFFSET TITULO]
    MOV BL, [SI+OFFSET COLORES]
    CALL COLOR
    POP CX

    INC SI
    LOOPNZ BUCLE
    MOV AH, 8
    INT DOS
    XOR DX, DX
    CALL COLOCA
    MOV AX, FIN
    INT DOS
    COLO ENDP
    
    COLOR PROC
    MOV AH, 9
    XOR BH, BH
    INT BIOS
    RET
    COLOR ENDP
    
    COLOCA PROC
    MOV AH, 2
    XOR BX, BX
    INT BIOS
    RET
    COLOCA ENDP
CODIGO ENDS
END COLO



Resultado:





Programa 10:

IMPRIME UN VALOR BINARIO

Código:

CR EQU 13
LF EQU 10
IMPRIMIR EQU 9
FIN EQU 4CH
DOS EQU 21H 
TAB EQU 09H
BELL EQU 07H

DATOS SEGMENT
    ENCABEZADO DB 13,10,13, TAB, TAB, '======================='
    DB 13,10,13, TAB, TAB, 'PROGRAMA QUE IMPRIME UN VALOR BINARIO'
    DB 13,10,13, TAB, TAB, '========================', 13, 10, '$'
    VALOR_ASCII DB '010101010101', '$'
DATOS ENDS

PILA SEGMENT
    DB 64 DUP('0')
PILA ENDS

CODIGO SEGMENT
    ASCI PROC NEAR
    ASSUME CS:CODIGO, DS:DATOS, SS:PILA
    MOV AX, DATOS
    MOV DS, AX
    LEA DX, ENCABEZADO
    CALL ESCRIBE
    
    LEA DX, VALOR_ASCII
    CALL ESCRIBE
    CALL SALIR
    ASCI ENDP
    
    ESCRIBE PROC
    MOV AH, 9
    INT 21H
    RET
    ESCRIBE ENDP
    
    SALIR PROC NEAR
    MOV AH, FIN
    INT DOS
    RET
    SALIR ENDP

CODIGO ENDS
END ASCI   


Resultado:




Programa 11:

IMPRIME NÚMEROS

Código:

CR EQU 13
LF EQU 10
IMPRIMIR EQU 9
FIN EQU 4C00H
DOS EQU 21H 
TAB EQU 09H
BELL EQU 07H

DATOS SEGMENT 
    ENCABEZADO DB 13,10,13, TAB, TAB, '====================='
     DB 13,10,13, TAB, TAB, 'PROGRAMA QUE IMPRIME VALORES NUMERICOS DEC Y HEXA 91.3 ;)'
     DB 13,10,13, TAB, TAB, '======================================', 13,10,'$'
     VALOR_1 DW 41D, '$' 
     VALOR_2 DW 42D, '$' 
     VALOR_3 DW 43D, '$' 
     VALOR_4 DW 44D, '$' 
     VALOR_5 DW 45D, '$' 
     VALOR_6 DW 46, '$' 
     VALOR_7 DW 47, '$' 
     VALOR_8 DW 48, '$' 
     VALOR_9 DW 49, '$' 
     VALOR_10 DW 50, '$' 
     VALOR_11 DW 31H, '$' 
     VALOR_12 DW 32H, '$' 
     VALOR_13 DW 33H, '$' 
     VALOR_14 DW 34H, '$' 
     VALOR_15 DW 35H, '$' 
     VALOR_16 DW 36H, '$' 
     VALOR_17 DW 37H, '$' 
     VALOR_18 DW 38H, '$'
     VALOR_19 DW 39H, '$' 
     VALOR_20 DW 40H, '$' 
 DATOS ENDS
 
 PILA SEGMENT STACK
     DB 64 DUP('0')
 PILA ENDS
 
 CODIGO SEGMENT
     EXA PROC NEAR
     ASSUME CS:CODIGO, DS:DATOS, SS:PILA
     MOV AX, DATOS
     MOV DS, AX
     LEA DX, ENCABEZADO
     CALL ESCRIBE
     LEA DX, VALOR_1
     CALL ESCRIBE
     
     LEA DX, VALOR_2
     CALL ESCRIBE
     LEA DX, VALOR_3
     CALL ESCRIBE
     LEA DX, VALOR_4
     CALL ESCRIBE
     LEA DX, VALOR_5
     CALL ESCRIBE
     LEA DX, VALOR_6
     CALL ESCRIBE
     LEA DX, VALOR_7
     CALL ESCRIBE
     LEA DX, VALOR_8
     CALL ESCRIBE
     LEA DX, VALOR_9
     CALL ESCRIBE
     LEA DX, VALOR_10
     CALL ESCRIBE
     LEA DX, VALOR_11
     CALL ESCRIBE
     LEA DX, VALOR_12
     CALL ESCRIBE
     LEA DX, VALOR_13
     CALL ESCRIBE
     LEA DX, VALOR_14
     CALL ESCRIBE
     LEA DX, VALOR_15
     CALL ESCRIBE
     LEA DX, VALOR_16
     CALL ESCRIBE
     LEA DX, VALOR_17
     CALL ESCRIBE
     LEA DX, VALOR_18
     CALL ESCRIBE
     LEA DX, VALOR_19
     CALL ESCRIBE
     LEA DX, VALOR_20
     CALL ESCRIBE
     CALL SALIR
     EXA ENDP
     
     ESCRIBE PROC
     MOV AH, 9
     INT 21H
     RET
     ESCRIBE ENDP
     
     SALIR PROC NEAR
     MOV AX, FIN
     INT DOS
     RET
     SALIR ENDP
 CODIGO ENDS
 END EXA
     

Resultado:




Programa 12:

CONVERSIÓN ASCII - BINARIOS

Código:

CR EQU 13
LF EQU 10
IMPRIMIR EQU 9
FIN EQU 4CH
DOS EQU 21H 
TAB EQU 09H

DATOS SEGMENT
    ASCII DB 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'
    ESPACIO DB CR, LF, '$'
    BINARIO DB 64 DUP(?), '$'
    MENSAJE1 DB CR, LF, TAB, 'ANTES DE LA CONVERSION: ', '$'
    MENSAJE2 DB CR, LF, TAB, 'DESPUES DE LA CONVERSION:', '$'
DATOS ENDS

PILA SEGMENT STACK 'STACK'
    DW 128 DUP('P')
PILA ENDS

CODIGO SEGMENT
    CONV PROC FAR
    
    ASSUME CS:CODIGO, DS:DATOS, SS:PILA
    MOV AX, DATOS
    MOV DS, AX
    LEA DX, MENSAJE1
    CALL ESCRIBE
    LEA DX, ESPACIO
    CALL ESCRIBE
    LEA DX, ASCII
    CALL ESCRIBE
    LEA DX, ESPACIO
    CALL ESCRIBE
    LEA DX, BINARIO
    CALL ESCRIBE
    LEA DX, ESPACIO
    CALL ESCRIBE
    LEA SI, ASCII
    LEA DI, BINARIO
    CALL ASCII2BIN
    LEA DX, MENSAJE2
    CALL ESCRIBE
    LEA DX, ESPACIO
    CALL ESCRIBE
    LEA DX, ASCII
    CALL ESCRIBE
    LEA DX, ESPACIO
    CALL ESCRIBE
    LEA DX, BINARIO
    CALL ESCRIBE   
    LEA DX, ESPACIO
    CALL ESCRIBE
    CALL SALIR
    CONV ENDP
    
    ASCII2BIN PROC NEAR
    XOR AX, AX
    MOV CX, 8
    
    ASCII1:
    MOV AL, [SI]
    PUSH CX
    MOV CX, 8
    
    LOOP_SHIFT:
    SHL AL, 1
    JC BIN_UNO
    MOV [DI], BYTE PTR '0'
    JMP CICLO_SHIFT
    
    BIN_UNO:
    MOV[DI], BYTE PTR '1'
    
    CICLO_SHIFT:
    INC DI
    LOOP LOOP_SHIFT
    POP CX
    INC SI
    LOOP ASCII1
    RET
    ASCII2BIN ENDP
    
    ESCRIBE PROC
    MOV AH, IMPRIMIR
    INT DOS
    RET
    ESCRIBE ENDP
    
    SALIR PROC NEAR
    MOV AH, FIN
    INT DOS
    SALIR ENDP
CODIGO ENDS
END CONV
    
Resultado:




Programa 13:

NÚMEROS EN HEXADECIMAL

Código:

CR EQU 13
LF EQU 10
IMPRIMIR EQU 9
FIN EQU 4C00H
DOS EQU 21H 
TAB EQU 09H

DATOS SEGMENT 
    ENCABEZADO DB 13, 10, 13, 10, TAB, TAB, '===============================================' 
    DB 13, 10, 13, TAB, TAB, 'PROGRAMA QUE IMPRIME NUMEROS EN HEXADECIMAL'
    DB 13, 10, 13, TAB, TAB, '=========================================', 13,10,13,10, '$'
DATOS ENDS

PILA SEGMENT STACK 'STACK'
    DB 64 DUP ('0')
PILA ENDS

CODIGO SEGMENT
    CEXA PROC NEAR
    
    ASSUME CS:CODIGO, SS:PILA, DS:DATOS
    ORG 100H
    MOV AX, DATOS
    MOV DS, AX
    LEA DX, ENCABEZADO
    CALL ESCRIBE
    MOV CX, 200H
    XOR DX, DX
    
    CICLO:
    CALL ESCRIBE_HEX
    CALL ESCRIBE_CRLF
    INC DX
    LOOP CICLO
    CALL SALIR
    CEXA ENDP
    
    ESCRIBE_HEX PROC NEAR
    PUSH AX
    PUSH CX
    PUSH DX
    
    OTRO_DIGITO:
    PUSH CX
    MOV CL, 4
    ROL DX, CL
    CALL ESCRIBE_DIGITO_HEX
    POP CX
    LOOP OTRO_DIGITO
    POP DX
    POP CX
    POP AX
    RET
    ESCRIBE_HEX ENDP
    ESCRIBE_DIGITO_HEX PROC NEAR
    PUSH AX
    PUSH DX
    AND DX, 0FH
    CMP DL, 10
    JAE ES_MAYOR_A_10
    ADD DL, 48
    JMP IMPRIME_DIGITO
    ES_MAYOR_A_10:
    ADD DL, 55
    IMPRIME_DIGITO:
    MOV AX, 2
    INT 21H
    POP DX
    POP AX
    RET
    ESCRIBE_DIGITO_HEX ENDP
    
    ESCRIBE_CRLF PROC NEAR
    PUSH AX
    PUSH DX
    MOV AH, 2
    MOV DL, 13
    INT 21H
    MOV DL,10
    INT 21H
    POP DX
    POP AX
    RET
    ESCRIBE_CRLF ENDP
    
    ESCRIBE PROC
    MOV AH, 9
    INT 21H
    RET
    ESCRIBE ENDP
    SALIR PROC NEAR
    MOV AX, FIN
    INT DOS
    RET
    SALIR ENDP
CODIGO ENDS
END CEXA
    
   
    
Resultado:




Programa 14:

POTENCIA BINARIO (ASCII - BINARIO)

Código:


CR EQU 13
LF EQU 10
IMPRIMIR EQU 9
FIN EQU 4C00H
DOS EQU 21H
TAB EQU 09H
BELL EQU 07H

DATOS SEGMENT
    ENCABEZADO DB 13, 10, 13, 10, TAB, TAB, '====================================='
    DB 13,10,13, TAB, TAB, 'PROGRAMA QUE CONVIERTE UN NUMERO ASCII A BINARIO'
    DB 13,10,13, TAB, TAB, '===============================================',13,10,'$'
    VALOR_ASCII DB '33', '$'
    VALOR_BINARIO DW 0, '$'
    LONGITUD_ASCII DW 2, '$'
    POTENCIA_10 DW 00000001B, '$'
DATOS ENDS

PILA SEGMENT STACK
    DB 64 DUP('0')
PILA ENDS

CODIGO SEGMENT
    POTE PROC NEAR
    ASSUME CS:CODIGO, DS:DATOS, SS:PILA
    MOV AX, DATOS
    MOV DS, AX
    LEA DX, VALOR_ASCII
    CALL ESCRIBE
    MOV BX, 00001010B
    MOV CX, LONGITUD_ASCII
    LEA SI, VALOR_ASCII+1
    
    ETIQUETA_1:
    MOV AL, [SI]
    AND AX, 000FH
    MUL POTENCIA_10
    ADD VALOR_BINARIO, AX
    MOV AX, POTENCIA_10
    MUL BX
    MOV POTENCIA_10, AX
    DEC SI
    LOOP ETIQUETA_1
    LEA DX, ENCABEZADO
    CALL ESCRIBE
    LEA DX, VALOR_BINARIO
    CALL ESCRIBE
    CALL SALIR
    POTE ENDP
    
    ESCRIBE PROC
    MOV AH, 9
    INT 21H
    RET
    ESCRIBE ENDP
    
    SALIR PROC NEAR
    MOV AX, FIN
    INT DOS
    RET 
    SALIR ENDP
    
CODIGO ENDS
END POTE


Resultado:




Programa 15:

NÚMERO ASCII

Código:

CR EQU 13
LF EQU 10
IMPRIMIR EQU 9
FIN EQU 4C00H
DOS EQU 21H
TAB EQU 09H
BELL EQU 07H
TECLADO EQU 8

DATOS SEGMENT
    NUMERO_BINARIO DW 0, '$'
    NUMERO_ASCII DB  6, 0, 6 DUP (?), '$'
    M_ENCABEZADO DB 13,10,13, TAB, '============================================='
    DB 13,10,13, TAB, 'PROGRAMA QUE CONVIERTE UN NUMERO ASCII (CAPTURADO) A BINARIO'
    DB 13,10,13, TAB, '=======================================================', 13, 10,'$'
    M_ESPACIO DB 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, 13, 10, '$'
    M_ASCII_ASCII DB 13, 10, 13, 10, 'NUMERO ASCII IMPRESO NORMALMENTE COMO LO HACE UNA PC(EN ASCII)', 13,10,'$'
    M_BINARIO_ASCII DB 13, 10, 13, 10, 'NUMERO BINARIO (YA CONVERTIDO), ',13,10,' IMPRESO NORMALMENTE COMO LO HACE UNA PC (EN ASCII):', '$'
    POTENCIA DW 001H, 000AH, 0064H, 03E8H, 2710H, '$'
DATOS ENDS

PILA SEGMENT STACK 'STACK'
    DW 128 DUP ('P')
PILA ENDS

CODIGO SEGMENT
    CAPT PROC NEAR
    ASSUME CS:CODIGO, SS:PILA ,DS:DATOS
    MOV AX, DATOS
    MOV DS, AX
    MOV AH, 0AH
    MOV DX, OFFSET NUMERO_ASCII
    INT 21H
    MOV DI, OFFSET NUMERO_ASCII + 1
    MOV CX, [DI]
    MOV SI, OFFSET NUMERO_ASCII + 2
    XOR CH, CH
    MOV DI, OFFSET POTENCIA
    DEC SI
    ADD SI, CX
    XOR BX, BX
    STD
    CICLO:
    LODSB
    SUB AL, 30H
    CBW
    MOV DX, [DI]
    MUL DX
    ADD DI, 2
    ADD BX, AX
    LOOP CICLO
    MOV NUMERO_BINARIO, BX
    LEA DX, M_ENCABEZADO
    CALL ESCRIBE
    LEA DX, M_ASCII_ASCII
    CALL ESCRIBE
    LEA DX, NUMERO_ASCII -1
    CALL ESCRIBE
    LEA DX, M_BINARIO_ASCII
    CALL ESCRIBE
    LEA DX, NUMERO_BINARIO
    CALL ESCRIBE
    LEA DX, M_ESPACIO
    CALL ESCRIBE
    CALL SALIR
    CAPT ENDP
    
    ESCRIBE PROC
    MOV AH, IMPRIMIR
    INT DOS
    RET
    ESCRIBE ENDP
    
    SALIR PROC NEAR
    MOV AX, FIN
    INT DOS
    SALIR ENDP
    
CODIGO ENDS
END CAPT
    


Resultado:





Referencia:

jueves, 4 de abril de 2019

3. Programas en turbo assembler pantalla y letras a color

Pantalla y letra a color (Turbo assembler)


Programa 1: Cambiar de color la pantalla a verde

Código:

DATOS SEGMENT
              MENSAJE DB 'Se ha cambiado el color de la pantalla$'
DATOS ENDS
          
CODIGO SEGMENT
              
              ASSUME CS:CODIGO, SS:PILA, DS:DATOS

INICIO: 

       MOV AH,06H
       MOV BH,2FH
       MOV CX,0000H
       MOV DX,184FH
       INT 10H
       
       MOV AH,02H
       MOV BH,00H
       MOV DX,0000H
       INT 10H
       
       MOV AX,DATOS
       MOV DS,AX
       LEA DX,MENSAJE
       MOV AH,9H
       INT 21H

       MOV AX,4C00H
       INT 21H

CODIGO ENDS

END INICIO

Resultado:






Programa 2: Cambiar de color la pantalla mediante opciones

Codigo:

Pila segment stack 'stack' ;Segmento de la pila
     db 100h dup (?)       ; A partir de la direccion 100 de la pila.
Pila ends

  datos segment
    
      titulo db 13,10,'  CAMBIAR FONDO DE PANTALLA  ',13,10,'$'
      mensaje db 'Presione ENTER si quiere la pantalla azul ' , ' Si quiere morado, presione 2 ',13,10,' Para salir ', ' Presione cualquier tecla',13,10,'$'

  datos ends

codigo segment ;segmento de codigo
       
       assume cs:codigo, ss:pila, ds:datos

Inicio:
           ;****************************** PREPARAR PANTALLA
   mov ah,0
       mov al,3h ; Modo Texto
       int 10h   ; Interrupcion de Video
       
       mov ax,0600h ; Limpiar Pantalla
       mov bh,0fh   ; O Color de fondo negro, el color de letra blanco
       mov cx,0000h
       mov dx,184Fh
       int 10h
       
       mov ah,02h
       mov bh,00
       mov dh,00
       mov dl,00
       int 10h
       
           ;****************************** MOSTRAR MENSAJE

       mov ax,datos
       mov ds,ax
       
       lea dx,titulo
       mov ah,9h
       int 21h
       
       lea dx,mensaje
       mov ah,9h
       int 21h
       
           ;****************************** CAPTURA DE TECLAS

       mov ah,08           ; Pausa y captura de datos db espera que el usuario presiona una tecla
       int 21h

       cmp al,13           ; Verifica al presionar ENTER, el cual tiene un codigo ascii
       je llamarAzul       ; Salto Condicional jump equals opcion 1 saltar si es igual a la opcion 1
       
       
       cmp al,50           ; Ascii 50 = numero 2 compara lo que tiene el regisro ah con el ascii 50 en el reg a1
       je llamarMorado
       
       jmp fin             ; Si no escoge ni ENTER ni 2, Sale del programa

       fin:                ; Saca el mensaje por pantalla

       mov ax,4c00h
       int 21h
       
llamarAzul:
      CALL AZULPROC
      
llamarMorado:
      CALL MORADOPROC
      
           ;****************************** STORE PROCEDURE AZUL

AZULPROC PROC NEAR

         mov ah,0
         mov al,3h ; Modo Texto
         int 10h   ; Interrupcion de video
         
         mov ax,0600h ; Limpiar Pantalla
         mov bh,0fh   ; Color de fondo negro, f color de letra blanco
         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     ;2fh
      mov cx,0000h
      mov dx,184fh
      int 10h
      
      mov ax,4c00h
      int 21h
RET

AZULPROC ENDP

;*****************************************STORED PROCEDURE MORADO

MORADOPROC PROC NEAR

           mov ah,06h
           mov bh,5fh        ;2fh;3 para azul, 4 para guinda, 5 morado
           mov cx,0000h
           mov dx,184fh
           int 10h
           
           mov ax,4c00h
           int 21h
           
RET

Resultado:










miércoles, 3 de abril de 2019

3. Colores de la Bios


Atributo de color de la BIOS


El atributo de color de la BIOS es un valor de 8 bits donde los 4 bits bajos representan el color del carácter y los 4 bits altos representan el color de fondo

Por ejemplo, para imprimir un carácter blanco 'A' con fondo negro, el "Atributo de color de BIOS" se establecería en el valor hexadecimal 0x0F. El bit más alto del atributo de color, que también es el bit más alto del color de fondo, puede asumir dos funciones. No puede influir en el color de fondo que hace que el texto parpadee cuando se establece, limitando efectivamente los colores de fondo disponibles a solo ocho, o si se habilitan colores de fondo intensivos, los 16 colores completos estarán disponibles pero el parpadeo ya no estará disponible. 
Este comportamiento se puede cambiar, es decir, utilizando la interrupción BIOS 80x86 0x10, función 0x1003. 





Dec Hex  Binario Color
0 0 0000 Negro  
1 1 0001 Azul
2 2 0010 Verde
3 3 0011 Cian
4 4 0100 rojo
5 5 0101 Magenta
6 6 0110 marrón
7 7 0111 Gris claro
8 8 1000 Gris oscuro
9 9 1001 Azul claro
10 A 1010 Verde claro
11 B 1011 Cian claro
12 C 1100 Luz roja
13D 1101 Magenta claro
14E 1110 Amarillo
15 F 1111 Blanco
Referencia:

https://en.wikipedia.org/wiki/BIOS_color_attributes

3. Programas en Turbo Assembler (parte 2)


Programa 5: 

Limpia la pantalla.

Código:

FIN_4C00H EQU 4C00H
DOS_21H EQU 21H
BIOS_10H EQU 10H

PILA SEGMENT STACK
    DW 100 DUP('0')
PILA ENDS

CODIGO SEGMENT 
    CLS PROC FAR
    ASSUME CS: CODIGO, SS: PILA
    CALL LIMPIA_PANTALLA
    MOV AX, FIN_4C00H
    INT DOS_21H
    CLS ENDP    

    LIMPIA_PANTALLA PROC NEAR
    MOV AX, 0600H
    MOV BH, 0AH
    MOV CX, 000H
    MOV DX, 484FH
    INT BIOS_10H
    RET
    LIMPIA_PANTALLA ENDP
   
CODIGO ENDS
END CLS 



Resultado:




Programa 6:

Posición del cursor

Código:

CR EQU 13
LF EQU 10
TECLADO_8 EQU 8
IMPRIMIR_9 EQU 9
FIN_4C00H EQU 4C00H
DOS_21H EQU 21H
BIOS_10H EQU 10H
TAB EQU 09H
BELL EQU 07H

DATOS SEGMENT 
    RENGLON DB 0
    COLUMNA DB 0
    MENSAJE DB CR, LF, 'POSICION(X,Y), DEL MENSAJE:GRIS', CR, LF,'$'
DATOS ENDS

PILA SEGMENT STACK
    DW 100 DUP('0')
PILA ENDS

CODIGO SEGMENT
    PC PROC FAR
    ASSUME CS:CODIGO, DS:DATOS, SS:PILA
    MOV AX, DATOS
    MOV DS, AX
    LEA DX, MENSAJE
    CALL POSICIONA_CURSOR
    MOV AH, IMPRIMIR_9
    INT DOS_21H
    MOV AX, FIN_4C00H
    INT DOS_21H
    
    PC ENDP
    POSICIONA_CURSOR PROC NEAR
    MOV AH, 02
    MOV DH, 00
    MOV DH, RENGLON
    MOV DL, COLUMNA
    INT BIOS_10H
    RET
    POSICIONA_CURSOR ENDP
CODIGO ENDS
END PC


Resultado:




Programa 7: 

BORRA PANTALLA Y POSICIONA CURSOR.

Código:


CR EQU 13
LF EQU 10
TECLADO_8 EQU 8
IMPRIMIR_9 EQU 9
FIN_4C00H EQU 4C00H
DOS_21H EQU 21H
BIOS_10H EQU 10H
TAB EQU 09H
BELL EQU 07H

DATOS SEGMENT
    RENGLON DB 0
    COLUMNA DB 0
    MENSAJE DB CR, LF, 'POSICION (X,Y), DEL MENSAJE:GRIS '
            DB 'DESPUES DE BORRAR PANTALLA', CR, LF, '$'
        DATOS ENDS
        
                PILA SEGMENT STACK
                    DW 100 DUP('0')
                PILA ENDS
                
                CODIGO SEGMENT
                    CLSP PROC FAR
                    
                    ASSUME CS:CODIGO, DS:DATOS, SS:PILA
                    MOV AX, DATOS
                    MOV DS, AX
                    LEA DX, MENSAJE
                    CALL LIMPIA_PANTALLA
                    CALL POSICIONA_CURSOR
                    MOV AH, IMPRIMIR_9
                    INT DOS_21H
                    MOV AX, FIN_4C00H
                    INT  DOS_21H
                    
                    CLSP ENDP
                    
                    LIMPIA_PANTALLA PROC NEAR
                    MOV AX, 0600H
                    MOV BH, 0AH
                    MOV CX, 000H
                    MOV DX, 484FH
                    INT BIOS_10H
                    RET
                    LIMPIA_PANTALLA ENDP
                    
                    POSICIONA_CURSOR PROC NEAR
                    MOV AH, 02
                    MOV BH, 00
                    MOV DH, RENGLON
                    MOV DL, COLUMNA
                    INT BIOS_10H
                    RET
                    POSICIONA_CURSOR ENDP
                    
                CODIGO ENDS
                END CLSP

Resultado: 




Programa 8: 

PIDE 3 CADENAS.

Código:


CR EQU 13
LF EQU 10
TECLADO EQU 8
IMPRIMIR EQU 9
FIN EQU 4C00H
DOS EQU 21H
BIOS EQU 10H
TAB EQU 09H
BELL EQU 07H

DATOS SEGMENT
    NOMBRE DB 30 DUP(32), '$'
    DIR DB 30 DUP(32), '$'
    TLF DB 15 DUP(32), '$'
    MENS1 DB 'NOMBRE: ', '$'
    MENS2 DB 'DIRECCION: ', '$'
    MENS3 DB 'TELEFONO:', '$'
    ENTERR DB CR, LF, '$'
        DATOS ENDS
        
                PILA SEGMENT STACK
                    DB 64 DUP('PILA')
                PILA ENDS
                
                CODIGO SEGMENT
                    INICIO PROC FAR
                    ASSUME CS:CODIGO, DS:DATOS, SS:PILA
                    MOV AX, DATOS
                    MOV DS, AX
                    CALL MODO_DE_VIDEO
                    MOV DX, OFFSET MENS1
                    CALL ESCRIBE
                    MOV SI, OFFSET NOMBRE
                    MOV CX, 5
                    CALL PEDIR
                    CALL SALTO_DE_LINEA
                    
                    MOV DX, OFFSET MENS2
                    CALL ESCRIBE
                    MOV SI, OFFSET DIR
                    MOV CX, 8
                    CALL PEDIR
                    CALL SALTO_DE_LINEA
                    
                    MOV DX, OFFSET MENS3
                    CALL ESCRIBE
                    MOV SI, OFFSET TLF
                    MOV CX, 10
                    CALL PEDIR 
                    CALL SALTO_DE_LINEA
                    
                    CALL ESCRIBE
                    CALL ESCRIBE
                    CALL ESCRIBE
                    MOV DX, OFFSET NOMBRE
                    CALL ESCRIBE
                    CALL SALTO_DE_LINEA
                    MOV DX, OFFSET DIR
                    CALL ESCRIBE
                    CALL SALTO_DE_LINEA
                    MOV DX, OFFSET TLF
                    CALL ESCRIBE
                    CALL SALTO_DE_LINEA
                    CALL SALIR
                    
                   PEDIR PROC NEAR
                   BUCLE:
                   MOV AH, TECLADO
                   INT DOS
                   MOV [SI], AL
                   MOV AH, 2
                   MOV DL, AL
                   INT DOS
                   
                   INC SI
                   LOOPNZ BUCLE
                   PEDIR ENDP
                    
                   ESCRIBE PROC NEAR
                   
                   MOV AH, IMPRIMIR
                   INT DOS
                   RET
                   ESCRIBE ENDP
                   
                   SALTO_DE_LINEA PROC NEAR
                   MOV DX, OFFSET ENTERR
                   CALL ESCRIBE
                   RET
                   SALTO_DE_LINEA ENDP
                   
                   MODO_DE_VIDEO PROC NEAR
                   MOV AX,3
                   INT BIOS
                   RET
                   MODO_DE_VIDEO ENDP
                   
                   SALIR PROC NEAR
                   MOV AX, FIN
                   INT DOS
                   RET
                   SALIR ENDP
                   
               CODIGO ENDS
               END INICIO


Resultado:



Referencia:

martes, 2 de abril de 2019

3. Multiplicación de números de 2 cifras (Modificado)




#De: Ambrocio Laureano
.model small ;Modelo de memoria m?s utilizado
.stack
.data        ;definición de datos(variables), donde se almacenara información      
include "emu8086.inc"
.code
imprimir macro num  
   mov ah,02h 
   mov dl,num
   add dl,30h
   int 21h    
endm   

leernum macro
   mov ah,01h     ;Function(character read) Guarda en AL
   int 21h        ;Interruption DOS functions
   sub al,30h     ;ajustamos valores
endm        

multiplica macro valor1, valor2
   mov al,valor1  ;al=5       ;unidad del segundo numero
   mov bl,valor2  ;bl=5       ;unidad del primer numero
   mul bl       ;al=25      ;multiplicar  
endm
    
suma macro valor1, valor2
   mov al,valor1      ;al=02        ;movemos el segundo resultado de la primera mult a al
   mov bl,valor2      ;bl=0         ;movemos primer resultado de la segunda mult a bl
   add al,bl      ;al=2   
endm  

separarUnidades macro
   mov ah,00h     ;ah=00        ;limpiamos el registro ah
   aam            ;ax=01 01     ;separamos de hex a dec
endm

   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
   mov ah,00h     ;Function(Set video mode)
   mov al,03      ;Mode 80x25 8x8 16
   int 10h        ;Interruption Video
   
   leernum
   mov chr1,al    ;[chr1].chr2 * chr3 = ac.r1.r2
    
   leernum
   mov chr2,al    ;chr1.[chr2] * chr3 = ac.r1.r2

   print "*"

   leernum
   mov chr3,al    ;chr1.chr2 * [chr3] = ac.r1.r2
  
   leernum
   mov chr4,al    ;chr1.chr2 * [chr3] = ac.r1.r2

   print "="
   ;Realizamos operaci?n   
  
   multiplica chr4,chr2
   separarUnidades
   mov ac1,ah   ;ac1=02     ;decenas del primera multiplicacion
   mov r4,al    ;r4=05      ;unidades del primera multiplicacion
   
   multiplica chr4,chr1
   mov r3,al    ;r3=14h     ;movemos el resultado de la operacion a r3
   mov bl,ac1   ;bl=02      ;movemos el acarreo a bl
   add r3,bl    ;r3=16h     ;sumamos resultado mas acarreo
   mov al,r3    ;al=16h     ;movemos el resultado de la suma a al
   separarUnidades
   mov r3,al    ;r3=02      ;guardamos unidades en r3
   mov ac1,ah   ;ac1=0      ;guardamos decenas en ac1
  
   multiplica chr3,chr2
   separarUnidades
   mov ac,AH      ;ac=01    ;ac = AH (Acarreo)
   mov r2,AL      ;r2=0     ;r2 = AL       (Unidad del resultado)

   multiplica chr3,chr1
   mov r1,al      ;r1=8     ;r1 = AL       (Decena del resultado)
   mov bl,ac      ;bl=01    ;BL = Acarreo anterior
   add r1,bl      ;r1=9;    ;r1 = r1+ac (r1 + Acarreo)
   separarUnidades
   mov r1,al      ;r1=09    ;r1 = AL
   mov ac,ah      ;ac=0     ;ac = AH (Acarreo para la Centena del resultado)

   mov ax,0000h   ;limpiamos ax
   
   suma r3,r2
   separarUnidades
   mov r3,al      ;r3=02        ;r3 guarda las decenas del resultado final
   mov r2,ah      ;r2=0         ;r2 se utiliza como nuevo acarreo
  
   mov ax,0000h   ;''''
   
   suma ac1,r1
   suma al,r2
   separarUnidades
   mov r1,al      ;r1=01        ;r1 guarda las centenas
   mov r2,ah      ;R2=01        ;ah se sigue utilizando como acarreo
  
   mov al,r2      ;al=01        ;movemos el acarreo a al
   mov bl,ac      ;bl=00        movemos ac a bl
   add al,bl      ;al=01        ;sumamos al a bl
   ;aam            ;separamos hex a dec
   mov ac,al      ;ac=01        mov al a ac como nuestro acarreo final
 
   ;Mostramos resultado
   imprimir ac
   imprimir r1
   imprimir r3
   imprimir r4    
   
   DEFINE_SCAN_NUM
end  








3. Colores Modificado 9

Modificación del programa # 9 " Colores " Por mi compañero Ambrocio isaias Laureano CR EQU 13 ;Declaro retorno de carro LF...