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.
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.
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)
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
; 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
Muy bueno, lo iré siguiendo. Gracias
ResponderEliminar