Vistas de página en total

viernes, 10 de mayo de 2013

_LIN_COMAND

   _LIN_COMAND - IMPLEMENTACIÓN DE  ARGC Y ARGV

  Una vez visto lo que queremos hacer y definido la parte exterior del programa, es decir lo que vemos y escribimos habitualmente, vamos a pasar al código almacenado en nuestras librerías.
   Para poder trabajar fácilmente, se crearon las liberías (.LIB). Estas son almacenes de código compilado, que serán recopiladas por el linker según vayan siendo declaradas.
   El programa declarará las librerías, que han de ser usadas, a través del compilador, y el linker las añadirá al código final, enlazando las llamadas a ellas con la posición donde coloca cada rutina. 
   Debido a que la unión la realiza el linker, el código fuente de las librerías ha de ser compilado y posteriormente almacenado en la librería.  Para ello usaremos el compilador, en este caso TASM, y posteriormente el gestor de librerías TLIB para almacenar el " código objeto" en la librería.
   Como todo esto es parte del manejo de los compiladores, no entraré en como se hace.
  Simplemente quiero recordar que la mayor parte del código a utilizar lo deberemos almacenar en las librerías. 
   Existen librerías ya construidas, que pueden ser usadas. Como el sistema que utilizo de paso de parámetros es el estandar de C, se pueden enlazar con nuestros programas cualquier rutina de las librerías de Borland C. En mi caso no existe librería C ya que, no hay código previo. Parto de cero. Todo el código es nuevo.
  Más adelante indicaré como aprovecharnos de funciones ya creadas en otras librerías, para realizar programas con apoyo de instrucciones más complejas.

 Como mostré en la declaración del Main.mac la macro main llama a una función que extrae los argumentos de la linea de comandos y los almacena en una estructura, para luego poder analizarlos individualmente. Esta función es la que hoy presento. La función _lin_comand.

   Como se ve en la definición de la función existe algunas novedades.
   Primero Public. Directiva de compilación que permite declarar el nombre como localizable por el linkador para poder asociar la rutina al resto del código. Public lo que hace es añadir una entrada en una tabla de referencias en la librería con el nombre y la dirección en del código dentro de la librería. De esta manera el linkador podrá tomar la función y añadirla al código en curso. Si no se declara no será localizable.
 Igualmente debemos publicar las variables que debamos alcanzar desde el exterior. En este caso   _argc y _argv, que son precisamente las que se declararon como extern en el argum.mac.
   
  La función _lin_comand recorre la linea de comandos del dos, y va tomando las palabras, almacenando la dirección de cada una en una lista de punteros llamada argv. El número de palabras lo guarda en argc.
  Esta función no será incorporada al main.mac si no se incluye la cabecera ARGUM.MAC



MAIN.ASM (Versión Clásica TASM2.0)
; 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/>.

title libreria del sistema operativo
code segment byte public 'code'
      assume ds:data, cs:code
      public _lin_comand
      public _argc
      public _argv
_lin_comand proc near
        push ds
        push es
        push dx
        push bx
        push cx
        push si
        push di
        xor cx, cx
        cld
        mov si, 81h
        mov ax, data
        mov es, ax
        mov di, offset _lista
        mov bx, 80h
        mov cl,[bx]
        rep movsb
        mov cl, [bx]
        inc cx
        push es
        pop ds
        cmp cx, 0
        ja anali
        mov _argc, 0
        jmp fin

    anali:
        mov bx, offset _argv
        mov di, offset _lista
        mov al,' '
    anali1:
        repe scasb
        cmp cx, 0
        je fin
        dec di
        inc cx
        mov [bx], di
        inc bx
        inc bx
        repne scasb
        inc _argc
        dec di
        mov byte ptr [di], 0
        inc di
        cmp cx, 0
        je fin
        jmp anali1

    fin:
        pop di
        pop si
        pop cx
        pop bx
        pop dx
        pop es
        pop ds
        ret
_lin_comand endp
code ends
data segment byte public 'data'
        _argc db 0
        _argv dw 16 dup(0)
        _lista db 20 dup(0)

data ends
end

Si aplicamos las macros de mejora de directivas mías definidas en main.mac quedará.

MAIN.ASM (Versión Propia con mis macros)
; 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 main.mac
title libreria del sistema operativo

_modelo exe

_code
      public _lin_comand
      public _argc
      public _argv
_lin_comand proc near
        push ds
        push es
        push dx
        push bx
        push cx
        push si
        push di
        xor cx, cx
        cld
        mov si, 81h
        mov ax, data
        mov es, ax
        mov di, offset _lista
        mov bx, 80h
        mov cl,[bx]
        rep movsb
        mov cl, [bx]
        inc cx
        push es
        pop ds
        cmp cx, 0
        ja anali
        mov _argc, 0
        jmp fin

    anali:
        mov bx, offset _argv
        mov di, offset _lista
        mov al,' '
    anali1:
        repe scasb
        cmp cx, 0
        je fin
        dec di
        inc cx
        mov [bx], di
        inc bx
        inc bx
        repne scasb
        inc _argc
        dec di
        mov byte ptr [di], 0
        inc di
        cmp cx, 0
        je fin
        jmp anali1

    fin:
        pop di
        pop si
        pop cx
        pop bx
        pop dx
        pop es
        pop ds
        ret
_lin_comand endp

_data
        _argc db 0
        _argv dw 16 dup(0)
        _lista db 20 dup(0)
_end


  Como se ve hemos simplificado el programa y lo hemos acercado a TASM5.0. Además, ahora con solo cambiar la línea de"_model exe" a "_model com" podremos compilarla librería para realizar ficheros .com

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