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.