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
lunes, 6 de mayo de 2019
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
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, 9 de abril de 2019
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
.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$"
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$"
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
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
É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
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
.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
.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
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
Suscribirse a:
Entradas (Atom)
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...
-
name "suma de dos numeros" include "emu8086.inc" org 100h .data suma db 2 dup (?) ;declara un areglo de dos varia...
-
.model small .stack 64 .data n1 db 0 n2 db 0 suma db 0 msg1 db "dame el primer valor$" msg2 db 10,13,"dame e...
-
Hola mundo 2 veces en emu8086 .MODEL SMALL .STACK .DATA CADENA1 DB 'HOLA MUNDO.$' CADENA2 DB 'HOLA MUNDO2.$' ...