lunes, 6 de mayo de 2019

cuadros de colores alex

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 "T",'$'
M3 DB "T",'$'


datos ends
cincocuadros macro

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

cuadro 21,1,40,5,80
posicion 30,3
desplegar M2

cuadro 41,1,60,5,44
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

domingo, 5 de mayo de 2019

programa de color modificado

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
    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 "C:\Users\Angel Torres\Desktop\librerias\LIBRERIA.asm"
   
CODIGO ENDS
END COLO


LIbreria   "C:\Users\Angel Torres\Desktop\librerias\LIBRERIA.asm"
    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


martes, 19 de marzo de 2019

muliplicacion

   
   .model small ;Modelo de memoria m?s utilizado
.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
   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 
 
   mov al,chr4  ;unidad del segundo numero
   mov bl,chr2  ;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,chr4  ;unidades del segundo numero
   mov bl,chr1  ;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,chr3    ;al = chr3
   mov bl,chr2    ;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,chr3    ;AL = chr3
   mov bl,chr1    ;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)
 
 
   ;suma final
   ;R4 resulta ser las unidades de mul y no se toma en cuenta ya que se pasa entero
 
 
   mov ax,0000h   ;limpiamos ax
 
   mov al,r3      ;movemos el segundo resultado de la primera mult a al
   mov bl,r2      ;movemos primer resultado de la segunda mult a bl
   add al,bl      ;sumamos
   mov ah,00h     ;limpiamos ah
   aam            ;separamos hex a dec
   mov r3,al      ;r3 guarda las decenas del resultado final
   mov r2,ah      ;r2 se utiliza como nuevo acarreo
 
   mov ax,0000h   ;''''
 
   mov al,ac1     ;movemos el acarreo de la primera mult a al
   mov bl,r1      ;movemos segundo resultado de la segunda mult a bl
   add al,r2      ;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            ;combierte en binario al a ah       separamos de hex a dec
   mov r1,al      ;r1 guarda las centenas
   mov r2,ah      ;ah se sigue utilizando como acarreo
 
   mov al,r2      ;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
 

 
   ;Mostramos resultado
   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 

programa del video

org 100h
.stack 64
.data
.code
inicio:
mov cx,10 ;cantidad de veces que repetira
mov al,'>' ;caracter inicial

Lee_car:
    mov ah,0eh ;Funcion para imprimir caracter
    int 10h   ;llama a la bios
   
    mov ah,00 ;funcion de espera de un caracter del teclado
    int 16h ;llama al bios
    cmp al,'S' ;compara el caracter con 'S'
    loope Lee_car  ;si es igual salta a otro
   
    mov ah,0eh ;funcion para imprimir caracter
    int 10h ;llamada al bios
   
    ;colocar el fin de la linea para que baje una linea y lo imprima
    mov ah,0eh ;funcion del bios para imprimir caracter
    mov al,10
    int 10h ;PARA SERVISIOS DE VIDEO
   
    ;colocar el retorno de carro para ir al inicio
    mov al,13
    int 10h   ;PARA SERVISIOS DE VIDEO
    ;prepara la salida del programa
    mov ax,4c00h
    int 21h
end inicio


programa que compara cadenas y sudcadenas

org 100h
include 'emu8086.inc'
mov si, 0    ;ponemos si en 0
  
  
comienzo:
mov al, msg2[0]   ;copiar la primera letra de la palabra A al

cmp msg[si],"$"   ;si es el fin de la cadena mandar a final
 jz final      ; brinca si es igual

cmp msg[si], al   ;comparar si encuentra la primera letra de la cadena
 jne seguir    ;brica si es diferente


mov di, 1         ;poner en 1 di 

comprobar:

 mov al, msg2[di]
 mov bx, di
 cmp msg[si+bx], al     ;posicion de la letra coincidente + di, comparar con la cadena
 jne seguir             ;si no coincide mandar a seguir 


 inc di                 ;incrementar di para seguir recorriendo cadena

 cmp msg2[di],"$"       ;si es el fin de la cadena y el programa llego
 jz resultado           ;aca quiere decir que la cadena es parte de la palabra


loop comprobar         ;bucle para recorrer cadena
                                                  
                                                  
seguir: 

 inc si       ;para seguir recorriendo la palabra

loop comienzo   ;bucle principal para recorrer palabra

resultado:

  mov dx, offset msg3    ;copiar msg3 a dx
  mov ah, 9              ;preparar ah con 9 para la interrupcion 21h
  int 21h                ;mostrar contenido en dx 
 
final:
  cmp di,0
  jz no
  ret
 
no:
print "No se encuentra"

ret  

msg db "tecnologico$"
msg2 db "tec$"

msg3 db "Si se encuentra$"

jueves, 14 de marzo de 2019

programa de loop subcabenas

org 100h
include 'emu8086.inc'   ;incluimos la biblioteca emu8086
mov si, 0    ;ponemos si en 0
 
 
comienzo:
mov al, msg2[0]   ;copiar la primera letra de la palabra A al

cmp msg[si],"$"   ;si es el fin de la cadena mandar a final
 jz final      ; brinca si es igual

cmp msg[si], al   ;comparar si encuentra la primera letra de la cadena
 jne seguir    ;brica si es diferente


mov di, 1         ;poner en 1 di

comprobar:

 mov al, msg2[di]
 mov bx, di
 cmp msg[si+bx], al     ;posicion de la letra coincidente + di, comparar con la cadena
 jne seguir             ;si no coincide mandar a seguir


 inc di                 ;incrementar di para seguir recorriendo cadena

 cmp msg2[di],"$"       ;si es el fin de la cadena y el programa llego
 jz resultado           ;aca quiere decir que la cadena es parte de la palabra


loop comprobar         ;bucle para recorrer cadena
                                                 
                                                 
seguir:

 inc si       ;para seguir recorriendo la palabra

loop comienzo   ;bucle principal para recorrer palabra

resultado:

  mov dx, offset msg3    ;copiar msg3 a dx
  mov ah, 9              ;preparar ah con 9 para la interrupcion 21h
  int 21h                ;mostrar contenido en dx

final:
  cmp di,0
  jz no
  ret

no:
print "No se encuentra"

ret 

msg db "tecnologico$"
msg2 db "tec$"

msg3 db "Si se encuentra$"

martes, 12 de marzo de 2019

programa con loop

org 100h
include "emu8086.inc"
mov cx,50

comienzo:
    print "letrero"
    inc cx
LOOP comienzo   
ret






org 100h
.data
msj db 10,13,"letrero $"

.code
inicio:
mov cx,50

comienzo:             
    mov dx, offset msj
    mov ah,09
 
    int 21h       
     
   
LOOP comienzo   
ret

org 100h
.data
msj db 10,13,"letrero $"

.code
inicio:
mov cx,50

comienzo:               
    lea dx, msj
    mov ah,09
    
    int 21h          
       
     
LOOP comienzo      
ret

loop

Control de Bucles (instrucciones simples)
Éstas posibilitan el grupo de control más elemental de nuestros programas. Un bucle es
un bloque de código que se ejecuta varias veces. Hay 4 tipos de bucles básicos:
o Bucles sin fin
o Bucles por conteo
o Bucles hasta
o Bucles mientras
Las instrucciones de control de bucles son las siguientes:
· INC incrementar
· DEC decrementar
· LOOP realizar un bucle
· LOOPZ,LOOPE realizar un bucle si es cero
· LOOPNZ,LOOPNE realizar un bucle si no es cero
· JCXZ salta si CX es cero



jueves, 7 de marzo de 2019

salto condicional

include emu8086.inc

ORG    100h

MOV    AL, 25     ; set AL to 25.
MOV    BL, 10     ; set BL to 10.

CMP    AL, BL     ; compare AL - BL.

JE     equal      ; jump if AL = BL (ZF = 1).

printn  'no es igual'     ; if it gets here, then AL <> BL,
JMP    stop        ; so print 'N', and jump to stop.

equal:             ; if gets here,
printn   'es igual'  ; then AL = BL, so print 'Y'.

stop:

RET               ; gets here no matter what.

END


saltos de cual es mayor y igual de dos numeros

.model small
.stack
.data
    num1 db 4
    num2 db 4
    msg1 db "numero iguales","$" 
    msg2 db "numero 1 mayor","$"
    msg3 db "numero 2 mayor","$" 
.code
    main:
    mov ax,@data
    mov ds,ax
   
    mov al,num1
   
    cmp al, num2
   
    jc mayor2
    jz igual
    jnz mayor1
   
.exit

igual:
    mov ah,09h
    lea dx ,msg1
    int 21h
.exit 

mayor1:
    mov ah,09h
    lea dx ,msg2
    int 21h
.exit 
   
mayor2:
    mov ah,09h
    lea dx ,msg3
    int 21h 
.exit 
   
end

miércoles, 6 de marzo de 2019

emu8086.inc documentacion

emu8086.inc define las siguientes macros :

PUTC char - macro con 1 parámetro, imprime un carácter ASCII en la posición actual del cursor.

GOTOXY col, fila - macro con 2 parámetros, establece la posición del cursor.

PRINT string - macro con 1 parámetro, imprime una cadena.

PRINTN string - macro con 1 parámetro, imprime una cadena. Lo mismo que PRINT pero agrega automáticamente "retorno de carro" al final de la cadena.

CURSOROFF - apaga el cursor de texto.

CURSORON - enciende el cursor de texto.

Para usar cualquiera de las macros anteriores, simplemente escriba su nombre en algún lugar de su código y, si es necesario, los parámetros


emu8086.inc también define los siguientes procedimientos :

PRINT_STRING : procedimiento para imprimir una cadena terminada en nulo en la posición actual del cursor, recibe la dirección de la cadena en el registro DS: SI . Para usarlo declare: DEFINE_PRINT_STRING antes de la directiva END .

PTHIS : procedimiento para imprimir una cadena terminada en nulo en la posición actual del cursor (igual que PRINT_STRING), pero recibe la dirección de la cadena desde la Pila. La cadena TERMINADA A CERO debe definirse justo después de la instrucción CALL. Por ejemplo: 

CALL PTHIS 
db 'Hello World!', 0

Para usarlo declare: DEFINE_PTHIS antes de la directiva END .

GET_STRING : procedimiento para obtener una cadena terminada en nulo de un usuario, la cadena recibida se escribe en el búfer en DS: DI , el tamaño del búfer debe estar en DX . El procedimiento detiene la entrada cuando se presiona 'Enter'. Para usarlo declare: DEFINE_GET_STRING antes de la directiva END .

CLEAR_SCREEN : procedimiento para borrar la pantalla (que se realiza al desplazar la ventana completa de la pantalla) y establecer la posición del cursor en la parte superior. Para usarlo declare: DEFINE_CLEAR_SCREEN antes de la directiva END .

SCAN_NUM : procedimiento que obtiene el número FIRMADO de varios dígitos del teclado y almacena el resultado en el registro CX . Para usarlo declare: DEFINE_SCAN_NUM antes de la directiva END .

PRINT_NUM : procedimiento que imprime un número firmado en el registro AX . Para usarlo declare: DEFINE_PRINT_NUM y DEFINE_PRINT_NUM_UNS antes de la directiva END .

PRINT_NUM_UNS : procedimiento que imprime un número sin firma en el registro AX . Para usarlo declare: DEFINE_PRINT_NUM_UNS antes de la directiva END .

Para utilizar cualquiera de los procedimientos anteriores, primero debe declarar la función en la parte inferior de su archivo (pero antes de END ), y luego usar la instrucción CALL seguida de un nombre de procedimiento.

jueves, 28 de febrero de 2019

calificacion

.MODEL SMALL
.STACK 64
.DATA 
    include "emu8086.inc"
   
    nota db 0

   
.CODE 
OPERACIONES PROC FAR ;DECLARACION DE PROCEDIMIENTO   

    ;MUESTRO EL MENSAJE       
    print " "  ;macro print
    print "Ingrese la calificacion: "
   
    call scan_num    ;Leo el numero
    mov nota,cl      ;lo guardo en nota
   
    xor ax,ax        ;borro el contenido de ax
    mov al,nota      ;muevo nota a al
   
    CMP AL,70d       ;comparo al con 70   la d es para tomarlo como decimal
    JGE MAYOR        ;si es mayor o igual pasa a mayor
    JMP MENOR        ;si no a menor
       
   MAYOR:
    printn " "   
    print "Aprobado"
    JMP SALIR
       
   MENOR: 
    printn " "   
    print "Reprobado"
    JMP SALIR
   
   SALIR:
         print " "
         printn " "
         gotoxy 10,10  ;macro para poner los letreros en una posicion coloco el cursor en las coordenadas 10x,10y
         print "Presiona enter para salir..." ;imprimo despues este mensaje
         mov ah,0  ;servicio de lectura de pulsacion de tecla
         int 16h   ;invoca servicios de teclado
         mov ah,4ch
         int 21h
         ret
     
OPERACIONES ENDP 

define_print_string
define_print_num
define_print_num_uns
define_scan_num   
   
END 

Programa que dice si eres mayor de edad o no con emu8086

.model small
.stack
.data                     
include "emu8086.inc"         
num1 db 0; variable para la edad
.code
inicio proc far
 
    ;poner el primer letrero
    print " Ingrese su edad: "
 
    ;lectura del valor
    call scan_num  ;llama al
    mov num1,cl
 
    ;lectura segundo valor
 

    xor ax,ax ; xor limpiar el reg ax
    mov al,num1
    cmp al,18d ;Si lo que se encuentra en al>18
    JGE mayor ;salta a mayor
    JMP menor ;sino ve a menor
 
    mayor:
        printn " "
        print "Eres mayor de edad"
        jmp final
    menor:
        printn " "
        print "Eres menor de edad"
             
        jmp final
         
         
    final:
         print " "
         printn " "
         print "Presiona enter para salir..."
         mov ah,0 ;servicios de lectura de una pulsación de teclado
         int 16h  ;Invoca a servicios de teclado
         mov ah,4ch
         int 21h
         ret
define_print_string
define_print_num     
define_print_num_uns    ;para recidir numeros decimales
define_scan_num   ;del procedimiento  de scam_num
endp inicio

suma de numeros

name "suma de dos numeros"
include "emu8086.inc"
org 100h

.data
suma db 2 dup (?)   ;declara un areglo de dos variables
.code
sumas proc
    print " Introduce el primer numero: "  ;macro de lib
    call scan_num ;llamada a un proceminiento  para pedir un numero
    mov suma[0],cl
    printn " "
    print " Introduce el segundo numero: "
    call scan_num ;llamada a un proceminiento  para pedir un numero
    mov suma[1],cl
    xor ax,ax   ;nominacion que limpia registros
    add al,suma[0] ;valor de la suma  pos 0
    add al,suma[1]  ;valor de la suma  pos 1
    printn " "
    print " La suma es: "
    call print_num
sumas endp
exit:
    print " "
    printn " "
    print "Presiona enter para salir..."
    mov ah,0  ;servicio de pulsación de teclado
    int 16h   ;invoca a servicios de taclado
    ret
define_print_string
define_print_num  ;ws  del prim_num
define_print_num_uns  ;conversion a decimal del scam_num
define_scan_num ;es del scam num del proc
end

Ejercicio del 26 de febrero

include 'emu8086.inc'
 
org 100h
 
.code   
Cursoroff      ;apaga el cursor
call scan_num  ;pide un numero
 
define_scan_num  ;define la funcion
 
gotoxy 2,5
putc 'A'   ;imprime un solo caracter
 
gotoxy 5,7    ;define en donde se ira a la pantalla
print 'dame un numero'
call scan_num  
mov ax,cx
gotoxy 8,7
call print_num                  
    
define_print_num
define_print_num_uns
end
ret

cuadros de colores alex

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...