; Nombres: Codigos: ; Jean Carlos Cortissoz 9413360 ; Igor Tamara Patiño 9414858 ;Entrega Final de Ensambladores: detector de virus sobre toda ; la memoria del 8086 ; 16 segmentos de tamaño FFFFH ; Cuando la memoria no tiene nada extraño la tabla ; debe presentarse asi: ; VIRUS APARECE ; 1 5 Veces ; 2 6 Veces ; 3 10 Veces ; 4 4 Veces ; 5 4 Veces ; 6 5 Veces .SALL INCLUDE macros.asm Pila SEGMENT STACK DW 1000 DUP (?) Pila ENDS Datos SEGMENT ;------------------ LARGO EQU 560 ;Longitud de la malla ANCHO EQU 30 ;Ancho de la malla NSegments EQU 16 ;Numero de segmentos Paso EQU 35 ;Paso*NSegments=LARGO XIni EQU 40 ;Posicion x de la malla YIni EQU 420 ;Posicion y de la malla XUlt EQU 10 YUlt EQU 10 XPat EQU 40 YPat EQU 23 XDir EQU 10 YDir EQU 12 ;------------------ ;---------------------------------------------------- NVIRUS EQU 6 ;Tabla de virus Virus DB 10,'Otro Virus' ;Note que va a ser consistente al DB 4,'Otro' ;pedirle que busque dos veces el DB 8,'Patron 1' ;mismo virus, y tambien es consistente DB 8,'Virus #3' ;cuando hay un patron subcadena de DB 9,'Mas Virus' ;otro patron DB 10,'Otro Virus' ;---------------------------------------------------- DB 8,'Virus #3' DB 10,'Otro Virus' DB 9,'Mas Virus' Encontro DW NVIRUS dup(0) ;Ojo, se declaro DW y no DB VirusCad DB 5,'VIRUS' ;Se usan para la presentacion Aparece DB 7,'APARECE' ;de la tabla Ultimo DB 24,'Ultimo virus encontrado:' Patrones DB 21,'Patrones encontrados:' Direccion DB 19,'Direcci¢n absoluta:' Direc DB 9,'0000:0000' Lleva DW 0 DB 9,'Mas Virus' DB 8,'Patron 1' Veces DB 5,'Veces' Contador DW 1 ;Cuenta en que virus va DB 9,'Mas Virus' Modo DW 1 ;Modo de la pantalla DB 8,'Patron 1' DB 'Virus #3' DB 'Virus #3' Datos ENDS primer SEGMENT ;Segmento declarado para hacer pruebas DB 8,'Patron 1' DB 8,'Patron 1' DB 10,'Otro Virus' DB 8,'Patron 1' primer ENDS Codigo SEGMENT Principal PROC FAR Empezar Codigo, Datos MOV AH,0FH ;Tomar el estado inicial de la tarjeta INT 10H MOV Modo,AX MOV AH,00H ;Cambio de modo de la pantalla MOV AL,11H INT 10H MOV AX,0A000H ;Segmento para pintar en pantalla MOV DS,AX CALL Inicial ;Pinta el estado inicial de la pantalla ;En este momento la malla en pantalla esta desocupada MOV AX,Datos ;DS en Datos MOV DS,AX MOV DH, YUlt MOV DL, XUlt Posicion_x_y Escribir_Cadena Ultimo MOV DH, YPat MOV DL, XPat Posicion_x_y Escribir_Cadena Patrones MOV DH, YDir MOV DL, XDir Posicion_x_y Escribir_Cadena Direccion MOV AX,0 ;El segmento extra va a recorrer MOV ES,AX ;toda la memoria MOV SI,0 ;Comienza desde 0000:0000 MOV DX,NVirus ;Cantidad de virus a buscar LEA BX,Virus ;Inicio de la tabla Inicio_Ciclo2: ;Hace la busqueda en paralelo CALL Buscar_Caracter ;Funcion que busca cualquier caracter ;del inicio de cada virus de la tabla JNC Fin_Ciclo2 CALL Compara_Cadena ;Funcion que cumple las condiciones ;de la funcion 1 asignada JNC Saltar_Inc MOV DI,Contador ;Si el Carry esta encendido se DEC DI ;incrementa el vector de apariciones ADD DI, DI ;de virus en la casilla apropiada INC Encontro[DI] INC Lleva CALL Numero_Encontrado Saltar_Inc: CMP Contador,DX ;Saber si se puede incrementar si JL Etiq ;si ya reviso todos los virus en una INC SI ;posicion de la memoria CMP SI,0000h ;Ver si hay cambio de segmento JNE Inicio_Ciclo2 MOV AX,ES ADD AX,01000H ;Cambio de segmento JC Fin_Ciclo2 ;Ver si se reviso la memoria entera MOV ES,AX STC ;Necesario para la funcion Pintelo CALL Pintelo Etiq: CALL SiguienteVir ;Ir al siguiente virus de la tabla JMP Inicio_Ciclo2 Fin_Ciclo2: MOV AX,Modo ;Se retorna el estado normal de la MOV AH,00H ;tarjeta INT 10H mov AX,Seg Encontro mov DS,AX mov DI,Offset Encontro CALL Imprime_Tabla ;Fucion que imprime la tabla con la ;cantidad de apariciones de virus MOV AH,08H ;Espera interrupcion del teclado INT 21H Borrar_Pantalla Terminar Principal ENDP Inicial PROC ;========================== ;Parametros para rectangulo MOV DX,LARGO PUSH DX MOV DX,ANCHO PUSH DX MOV DX,XIni PUSH DX MOV DX,YIni PUSH DX ;========================== CALL Rectangulo ;========================== ;Parametros para cuadricula MOV DX,NSegments PUSH DX MOV DX,LARGO PUSH DX MOV DX,XIni PUSH DX MOV DX,YIni PUSH DX ;========================== CALL Cuadricula ;========================== ;Parametros para rectangulo MOV DX,90 PUSH DX MOV DX,20 PUSH DX MOV DX,500 PUSH DX MOV DX,365 PUSH DX ;========================== CALL Rectangulo ;========================== ;Parametros para rectangulo MOV DX,90 PUSH DX MOV DX,20 PUSH DX MOV DX,278 PUSH DX MOV DX,157 PUSH DX ;========================== CALL Rectangulo ;========================== ;Parametros para rectangulo MOV DX,90 PUSH DX MOV DX,20 PUSH DX MOV DX,278 PUSH DX MOV DX,190 PUSH DX ;========================== CALL Rectangulo Inicial ENDP SiguienteVir PROC ;PRE: Contador indica el virus en que va ; ES:[BX] Tiene la longitud del virus en que va ; DX tiene NVirus ;POST: Contador= Contador + 1 Si contador=NVirus LEA BX,Virus JMP Retor avance2: ;contador MOV CL,DS:[BX] MOV CH,0 ;CX Longitud de la cadena patron INC BX MOV DX,ES Comparar_Cadenas: CMP CX,0 JE PrendaCarry MOV AL,DS:[BX] ;Longitud>0 CMP AL,ES:[SI] JNE ApagueCarry ;Cadenas distintas DEC CX ;Longitud disminuye INC BX ;Corre los apuntadores de los INC SI ;caracteres a comparar JNC Comparar_Cadenas MOV AX,ES ;Cambio de segmento ADD AX,01000H JC ApagueCarry MOV ES,AX ;No estaba en el ultimo segmento JMP Comparar_Cadenas PrendaCarry: ;La cadena apuntada por bx estaba STC ;en si JMP Fin_rutina ApagueCarry: ;No encontro la cadena o se acabo CLC ;la memoria Fin_rutina: POP SI MOV ES,DX Recuperar_registros RET Compara_Cadena ENDP Buscar_Caracter PROC ;PRE: En [BX+1] se tiene el caracter a buscar, en SI se tiene ; el sitio desde el cual se va a buscar, en CX se tiene lo ; que falta para acabar el segmento ;POST: En CX se retorna lo que falta para acabar el segmento de ; datos, y en SI el sitio donde se encontro el caracter, si no ; esta entonces SI apunta al final Salvar_Registros MOV CX,Contador ;CX tiene el contador Buscar: CMP CX,NVIRUS ;Compara contador con NVirus JG Avanzar MOV AL, DS:[BX+1] ;Caracter a buscar CMP AL,ES:[SI] JE PrenderCarry CALL SiguienteVir ;Cambia de virus en la tabla INC CX JMP Buscar Avanzar: ;Avanza el apuntador sobre la MOV CX,Contador ADD SI,1 JNC Buscar MOV DX,ES ;Cambio de segmento ADD DX,01000H JC ApagarCarry ;Va al final de la memoria MOV ES,DX STC CALL Pintelo ;Indica que acabo un segmento JMP Buscar PrenderCarry: ;SI apunta al sitio donde encontro el STC ;caracter inicial de algun virus JMP Retornar ;estar en el sitio de SI ApagarCarry: ;Se acabo la memoria CLC CALL Pintelo ;Pinta el ultimo segmento MOV AH,08H ;Espera que el interrupcion del teclado INT 21H CLC Retornar: Recuperar_Registros RET Buscar_Caracter ENDP Imprime_Tabla PROC ;PRE: En DI se tiene la direccion del vector con las apariciones ; de los virus ;POST: Imprime en pantalla la tabla de virus pedida Borrar_Pantalla Salvar_Registros MOV SI,NVirus ;SI tiene la cantidad de virus MOV DH,0 ;Posicionar para escribir Virus MOV DL,26 Posicion_x_y Escribir_Cadena VirusCad ;Escribe Virus MOV DL,46 ;Posicionar para escribir Aparece Posicion_x_y Escribir_Cadena Aparece ;Escribe Aparece MOV CX,1 MOV BX,0 Inicio_imprima: MOV DH,CL ;Posicionar para el numero del MOV DL,28 ;virus MOV AX,CX Posicion_x_y Escribir_Numero ;Escribe el numero del virus n MOV DL,45 ;en la tabla 1<=n<=NVirus MOV AX,DS:[BX+DI] Posicion_x_y ;Escribe la cantidad de ocasiones Escribir_Numero ;que ocurre el virus n ADD DL,4 Posicion_x_y Escribir_Cadena Veces ;Escribe Veces INC CX INC BX ;Recordar que el vector se INC BX ;declaro como DW para almacenar CMP CX,SI ;muchas apariciones JLE Inicio_imprima Recuperar_Registros RET Imprime_Tabla ENDP Recta STRUC ;Estructura para el manejo de subrutinas del modo grafico DW ? ;Sitio de BP DW ? ;Direccion de retorno Fila DW ? ;Espacio para la fila Columna DW ? ;Espacio para la columna Longitud DW ? ;Longitud de la linea a pintar Color DW ? ;Color a ubicar en el sitio Recta ENDS Pintar_Punto PROC ;Pre: BX : Fila ; CX : Columna ; DX : Color ;Post: Pinta un pixel con el color que encuentra en ; DX 0 negro, 1 blanco ; La estructura se usa asi: ; Sitio de BP ; Direccion de retorno ; Fila ; Punto ; Basura ; color del pixel CLI Salvar_Registros MOV BP,SP MOV AX,BX ;AX con el valor de fila MOV BX,CX ;BX tiene la columna MOV CX,3 SHR BX,CL ;Division entera de BX entre 8 MOV DX,80 DEC AX MUL DX ;(640/8=80)*AX ADD AX,BX ;Posicion en la memoria/8,byte a modificar MOV CX,[BP].Columna AND CX,00000111B ;Punto(mod)8 SUB CX,7 ;En CX queda el numero de bits a correr NEG CX ;En la memoria XCHG AX,BX ;BX tiene fila*60 + punto/8 MOV AX,DS:[BX] MOV DX,[BP].Color CMP DX,0 ;Identifica si se apaga JE ApaguePixel ;o enciende el pixel SHL DX,CL ;Enciende el Pixel de la OR DS:[BX],DX ;posicion indicada JMP Coloreado ApaguePixel: NOT DX AND DS:[BX],DX ;Apaga el pixel de la posicion Coloreado: ;indicada Recuperar_Registros STI RET Pintar_Punto ENDP Recta_Ver PROC ;PRE: Recibe fila, columna, longitud y color por la pila ;POST: Pinta una raya vertical en el sitio especificado ; La estructura se usa asi: ; Sitio de BP ; Direccion de retorno ; Fila ; Columna ; Longitud ; color de la linea PUSH BP ;Se salva BP MOV BP,SP Salvar_Registros MOV BX,[BP].Fila ;BX tiene la Fila MOV CX,[BP].Columna ;CX tiene la columna MOV DX,[BP].Color ;DX tiene el color a pintar MOV AX, 0 CicloVer: CMP AX,[BP].Longitud ;Longitud que lleva la linea JE Fin_Ver INC BX CALL Pintar_Punto ;Se pinta el punto INC AX JMP CicloVer Fin_Ver : Recuperar_Registros RET 8 Recta_Ver ENDP Recta_Hor PROC ;PRE: Recibe fila, columna, longitud y color por la pila ;POST: Pinta una raya horizontal en el sitio especificado ; La estructura se usa asi: ; Sitio de BP ; Direccion de retorno ; Fila ; Columna ; Longitud ; color de la linea PUSH BP ;Se salva BP MOV BP,SP Salvar_Registros MOV CX,[BP].Columna ;BX tiene la columna MOV BX,[BP].Fila ;CX tiene la Fila MOV DX,[BP].Color ;DX tiene el color a pintar MOV AX, 0 CicloHor: CMP AX,[BP].Longitud ;Longitud que lleva la linea JE Fin_Hor INC CX CALL Pintar_Punto ;Se pinta el punto INC AX JMP CicloHor Fin_Hor : Recuperar_Registros RET 8 Recta_Hor ENDP Relleno PROC ;PRE: Recibe fila, columna, ancho y largo por la pila ;POST: Dibuja un rectangulo blanco de ancho*largo ; en la posicion columna,fila ; La estructura se usa asi: ; Sitio de BP ; Direccion de retorno ; Fila ; Columna ; Largo ; Ancho PUSH BP MOV BP, SP Salvar_Registros MOV CX, 0 Ciclo_Rellenar: CMP CX, [BP].Longitud ;Se llena de derecha a izquierda JE Fin_Ciclo ;========================== ;Parametros para recta vertical MOV AX, 1 PUSH AX MOV AX, [BP].Color PUSH AX MOV AX, [BP].Columna ADD AX, CX PUSH AX MOV AX, [BP].Fila PUSH AX ;========================== CALL Recta_Ver INC CX JMP Ciclo_Rellenar Fin_Ciclo: Recuperar_Registros RET 8 Relleno ENDP Rectangulo PROC ;PRE: Recibe fila, columna, ancho y largo por la pila ;POST: Dibuja el contorno de un rectangulo de ancho*largo ; en la posicion columna,fila ; Sitio de BP ; Direccion de retorno ; Fila ; Columna ; Ancho ; Largo ;========================== ;Parametros para recta vertical PUSH BP MOV BP,SP PUSH DX PUSH AX MOV DX,1 PUSH DX MOV DX,[BP].Longitud PUSH DX MOV DX,[BP].Columna PUSH DX MOV DX,[BP].Fila PUSH DX ;========================== CALL Recta_Ver ;Se dibuja la linea vertical izquierda ;========================== ;Parametros para recta horizontal MOV DX,1 PUSH DX MOV DX,[BP].Color PUSH DX MOV DX,[BP].Columna PUSH DX MOV DX,[BP].Fila INC DX PUSH DX ;========================== CALL Recta_Hor ;Se dibuja la linea horizontal superior ;========================== ;Parametros para recta vertical MOV DX,1 PUSH DX MOV DX,[BP].Longitud PUSH DX MOV DX,[BP].Columna ADD DX,[BP].Color PUSH DX MOV DX,[BP].Fila PUSH DX ;========================== CALL Recta_Ver ;Se dibuja la linea vertical derecha ;========================== ;Parametros para recta horizontal MOV DX,1 PUSH DX MOV DX,[BP].Color PUSH DX MOV DX,[BP].Columna PUSH DX MOV DX,[BP].Fila ADD DX,[BP].Longitud PUSH DX ;========================== CALL Recta_Hor ;Se dibuja la linea horizontal inferior MOV BX,0 POP AX POP DX POP BP RET 8 Rectangulo ENDP Cuadricula PROC ;PRE: Recibe fila, columna,longitud total entre la linea inicial y ; la linea final, numero de lineas, por la pila; y usa las constantes ; ANCHO y Paso ;POST: Dibuja la cantidad de lineas verticales entre la distancia total ; de ANCHO, y separadas Paso una de otra. ; La estructura se usa asi: ; Sitio de BP ; Direccion de retorno ; Fila ; Columna ; Diferencia en x entre la linea inicial y la final ; Numero de lineas PUSH BP MOV BP,SP Salvar_Registros MOV CX,[BP].Longitud ;CX tiene la distancia total Inicio_Cuadricula: CMP CX,0 JLE Fin_Cuadricula ;========================== ;No ha hecho todas las lineas ;Parametros para hacer la recta vertical MOV DX,1 PUSH DX MOV DX,ANCHO PUSH DX MOV DX,[BP].Columna ADD DX,CX PUSH DX MOV DX,[BP].Fila PUSH DX ;========================== CALL Recta_Ver ;Se hace la recta vertical SUB CX,Paso JMP Inicio_Cuadricula Fin_Cuadricula: ;Termino de hacer las lineas Recuperar_Registros ;verticales RET 8 Cuadricula ENDP Pintelo PROC ;PRE: El Carry esta apagado si termino los segmentos, si no esta ; prendido ;POST: Rellena un cuadro en la cuadricula Salvar_Registros JNC Ultimo_Segmento ;========================== ;No esta en el ultimo segmento ;Parametros para invocar Relleno MOV BX,ANCHO SUB BX,4 PUSH BX MOV BX,Paso SUB BX,3 PUSH BX JMP Otro_Segmento ;========================== Ultimo_Segmento: ;========================== ;Este es el cuadro del ultimo ;Parametros para invocar Relleno segmento MOV BX,ANCHO SUB BX,4 PUSH BX MOV BX,Paso SUB BX,3 PUSH BX MOV AX,Paso MOV BX,NSegments DEC BX MUL BX ADD AX,XIni ADD AX,2 PUSH AX ;========================== JMP Siempre Otro_Segmento: ;========================== ;Continuacion de parametros en un segmento que no es el ultimo MOV CX,12 MOV BX,ES SHR BX,CL DEC BX MOV AX,Paso MUL BX ADD AX,XIni ADD AX,2 PUSH AX ;========================== Siempre: ;========================== ;Parametros comunes en la invocacion de relleno MOV AX,YIni ADD AX,2 PUSH AX ;========================== MOV AX,0A000H ;Cambio en el segmento de datos MOV DS,AX ;al sitio de la tarjeta CALL Relleno MOV AX,Datos ;Cambio del segmento de datos MOV DS,AX ;al segmento de declaracion Recuperar_Registros RET Pintelo ENDP Numero_Encontrado PROC Salvar_Registros MOV DL,XUlt ADD DL,Ultimo ADD DL,2 MOV DH,YUlt MOV AX,DI ADD AX,2 SHR AX,1 Posicion_x_y Escribir_Numero MOV DL,Patrones ADD DL,XPat MOV DH,YPat ADD DL,2 MOV AX,Lleva Posicion_x_y Escribir_Numero MOV DH,YDir MOV AX,ES LEA BX,Direc CALL Convierta_Caracter_Hexadecimal MOV DL,Direccion ADD DL,XDir ADD DL,7 MOV AX,SI LEA BX,Direc ADD BX,5 CALL Convierta_Caracter_Hexadecimal Posicion_x_y Escribir_Cadena Direc Recuperar_Registros RET Numero_Encontrado ENDP Convierta_Caracter_Hexadecimal PROC ;PRE: Recibe en AX el numero a escribir ;POST: En la direccion de BX escribe el numero ; en Hexadecimal Salvar_Registros MOV BP,SP PUSH BX MOV BX,1000H PUSH BX MOV CX,12 Inicio_Cambio: CMP BX,0 JE Fin_Cambio MOV DX,AX CMP DX,BX JB Ponga_Cero MOV BX,[BP-2] INC BX MOV [BP-2],BX SHR DX,CL AND DX,000000001111B CMP DX,9 JA Letra ADD DL,30H JMP Ponga Letra: SUB DL,10 ADD DL,41H Ponga: MOV DS:[BX],DL JMP Comun Ponga_Cero: MOV BX,[BP-2] INC BX MOV [BP-2],BX MOV DL,30H MOV DS:[BX],DL JMP Comun Comun: MOV BX,SS:[BP-4] PUSH CX MOV CX,4 SHR BX,CL POP CX MOV SS:[BP-4],BX SUB CX,4 JMP Inicio_Cambio Fin_Cambio: POP BX POP BX Recuperar_Registros RET Convierta_Caracter_Hexadecimal ENDP Codigo ENDS Rutinas_Auxiliares SEGMENT ASSUME CS:Rutinas_Auxiliares, DS: Datos, ES:Datos INCLUDE rutinas.asm Rutinas_Auxiliares ENDS segundo SEGMENT ;Segmento declarado para hacer pruebas DB 8,'Patron 1' DB 8,'Patron 1' DB 8,'Patron 1' DB 8,'Patron 1' DB 10,'Otro Virus' segundo ENDS END Principal