Vistas de página en total

89893

martes, 17 de septiembre de 2013

RUTINAS ERROR


   Para completar la librería hoy pongo las rutinas asociadas a la cabecera de error.mac.
   Con estas funciones, se podrá presentar en pantalla, el código texto asociado al error que el sistema nos indique al hacer una operación.

   A partir de ahora ya tenemos una librería básica bastante potente para poder hacer casi de todo.
   Por supuesto se podrá ampliar, pero no vale la pena, ya que todo esto es de MS-DOS y ahora estamos en Windows. Por lo tanto, si se desea más potencia es mejor pasar a TASM 11 y usar Windows. Sin embargo creo que con todas las entradas de este blog he mostrado una forma de estructurar y  gestionar los programas, que para mí, es muy potente y sencilla de manejar, por su aproximación a los lenguajes de alto nivel, y por su claridad en la lectura del programa principal.
   Por supuesto cuando programo en los nuevos ensambladores, retoco todas las funciones y me creo mis propias macros de llamada que necesito, con la misma filosofía; de manera que me quede la estructura de programa clara.
   Como ya he dicho, la función Invoke,  creada y usada en las llamadas a funciones Windows en los compiladores NASM y WINASM, es muy cómoda de crear, pero muy engorrosa de usar. Para usarla tengo que conocer todos los nombres y paso de parámetros de cada función, y luego el programa  resulta engorroso de leer, pues  simplemente está lleno de invoke.
   Por lo tanto, aunque sea más laborioso al principio, siguiendo mi filosofía “ Trabaja un poco al principio, para no volver a trabajar”, prefiero crearme mis macros de llamada para las funciones que realmente uso, reuniendo,  si es necesario, varios invoke en un solo comando.
 
    Por todo esto a partir de ahora ya no añadiré librerías ni macros. Ya están todas las que se necesitan. Añadiré solo programas como ejemplo de lo que podemos hacer con ensamblador.  Simplemente para eliminar miedos de algunos a este lenguaje, y demostrar que con organización es igual de fácil que cualquier otro.







ERROR.ASM
; Copyright (C) 2013  José Ángel Moneo Fernández

;    This program is free software: you can redistribute it and/or modify
;    it under the terms of the GNU General Public License as published by
;    the Free Software Foundation, either version 3 of the License, or
;   (at your option) any later version.

;    This program is distributed in the hope that it will be useful,
;    but WITHOUT ANY WARRANTY; without even the implied warranty of
;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;    GNU General Public License for more details.

;    You should have received a copy of the GNU General Public License
;    along with this program.  If not, see <http://www.gnu.org/licenses/>.

include stdio.mac
;rutina de gestión de errores
;(c) José Angel Moneo Fdez

.model compact,pascal
.data
     ;; mensajes de error de print_error
_error_extendido dw 0,_ee1,_ee2,_ee3,_ee4,_ee5,_ee6,_ee7,_ee8,_ee9
                 dw _ee10,_ee11,_ee12,_ee13
                 dw _ee14,_ee15,_ee16,_ee17
                 dw _ee18,_ee19,_ee20,_ee21,_ee22,_ee23,_ee24
                 dw _ee25,_ee26,_ee27,_ee28,_ee29,_ee30,_ee31
                 dw _ee32,_ee33,_ee34,_ee35,_ee36,_ee37,_ee38
                 dw _ee39,_ee40,_ee41,_ee42,_ee43,_ee44,_ee45
                 dw _ee46,_ee47,_ee48,_ee49,_ee50,_ee51,_ee52
                 dw _ee53,_ee54,_ee55,_ee56,_ee57,_ee58,_ee59
                 dw _ee60
_ee1 db "Número de función no válido",0
_ee2 db "Fichero no encontrado",0
_ee3 db "Via de acceso no encontrada",0
_ee4 db "No hay mas handles disponibles",0
_ee5 db "Acceso denegado",0
_ee6 db "Handle no Válido",0
_ee7 db "Bloque de control de memoria destruidos",0
_ee8 db "No hay memoria suficiente",0
_ee9 db "Direccion de bloque de memoria no válido",0
_ee10 db "Bloque de entorno no valido",0
_ee11 db "Formato no valido",0
_ee12 db "Codigo de acceso a fichero no valido",0
_ee13 db "Datos no validos",0
_ee14 db " ",0
_ee15 db "Especificacion de unidad no valida",0
_ee16 db "Intento de borrar el directorio activo",0
_ee17 db "No es el mismo dispositivo",0
_ee18 db "No hay más ficheros",0
_ee19 db "El disco está protegido contra escritura",0
_ee20 db "Identificador de unidad de disco desconocida",0
_ee21 db "Unidad de disco no preparada",0
_ee22 db "Comando de disco desconocido",0
_ee23 db "Error de datos de disco",0
_ee24 db "Longitud de escritura solicitada para disco incorrecta",0
_ee25 db "Error de búsqueda de disco",0
_ee26 db "No es un disco DOS",0
_ee27 db "Sector de disco no encontrado",0
_ee28 db "Impresora sin papel",0
_ee29 db "Error de escritura",0
_ee30 db "Error de lectura",0
_ee31 db "Fallo general",0
_ee32 db "Violacion de fichero compartido",0
_ee33 db "Violacion de bloqueo de fichero",0
_ee34 db "Cambio de disco no valido",0
_ee35 db "No hay FCB disponible",0
_ee36 db "Desbordamiento de buffer compartido",0
_ee37 db " ",0
_ee38 db " ",0
_ee39 db " ",0
_ee40 db " ",0
_ee41 db " ",0
_ee42 db " ",0
_ee43 db " ",0
_ee44 db " ",0
_ee45 db " ",0
_ee46 db " ",0
_ee47 db " ",0
_ee48 db " ",0
_ee49 db " ",0
_ee50 db "Solicitud de red no soportada",0
_ee51 db "Ordenador remoto no escuchado",0
_ee52 db "Nombre duplicado en red",0
_ee53 db "Nombre de red no encontado",0
_ee54 db "Red ocupada",0
_ee55 db "El dispositivo de red no existirá mas tiempo",0
_ee56 db "Excedido el límite de comandos del BIOS de red",0
_ee57 db "Error de hadware del adaptador de red",0
_ee58 db "Respuesta incorrecta de la red",0
_ee59 db "Error de red inexperado",0
_ee60 db "Adaptador remoto incompatible",0
;;
;;
.code

    public _print_error
    public _p_error
;Localiza el error del sistema e imprime su texto asociado  
_print_error proc near  uses  ax bx cx dx si di es ds
        mov ah,59h
        mov bx,0
        int 21h
        call _p_error
        ret
_print_error endp

;imprime uno de los textos de error indicando el número de error
_p_error proc near  uses si di bx,numero
        mov bx,offset _error_extendido
        mov si,numero
        cmp si,60
        ja sal_p_error
        shl si,1
        mov di,[bx+si]   ;pasamos el puntero deseado a di, para pasarlo a la macro puts
        puts  [di]
  sal_p_error:
        ret
_p_error endp

No hay comentarios:

Publicar un comentario

Si tienes algún comentario, duda o sugerencia, o si quieres aportar algún código creado a partir de las librerías expuestas aquí, por favor, indícamelo.