14.2.- Subrutinas externas Otro metodo que es mucho mejor que el inline es el uso de subrutinas externas en codigo maquina. Ya no tendra que desarrollar asi sus subrutinas externas en codigo maquina pero de repente pueda necesitar "linkear" su programa con alguno escrito de esa manera por ello vamos a ver como se logra esto, veamos algo escrito en el MASM de microsoft. CODE SEGMENT BYTE PUBLIC ASSUME CS:CODE ; EL PROCEDIMIENTO DEBE SER DECLARADO PUBLIC RUTINA ; PUBLIC PARA QUE PUEDA SER ACCEDIDO RUTINA PROC NEAR ; DESDE TURBO PASCAL. PUSH BP MOV BP,SP ; CONVENCI N DE LLAMADA MOV AX,[BP+4] ; COJE EL PRIMER PAR METRO ADD AX,[BP+6] ; LO SUMA AL SEGUNDO Y VUELVE. POP BP ; REGRESA NORMALMENTE. RET 4 ; FIN DEL PROCEDIMIENTO. RUTINA ENDP ; DEBEN QUITARSE LOS PARAMETROS (4 BYTES) CODE ENDS END La declaracion debe ser public para poder ser accesible, debe tenerse en cuenta que se utilizan 2 bytes en la pila para salvar a "bp" y 2 mas para la direccion de retorno (cuando se declara near) por esto los parametros deben empezarse a leerse a partir de un desplazamiento de 4 con respecto a "bp", algo muy incomodo para mas de 2 parametros, ademas debe observar la convencion de llamada standard de turbo pascal (push bp, mov bp sp), ademas deben quitarse los parametros que se hayan introducido en la pila, en este caso 4 bytes, esto se indica en el parametro del ret con el numero de bytes a retirar de la pila, en este caso 4. Ahora debe generar un fichero obj, que es el que se va a unir a turbo pascal, para ello debe ensamblar lo anterior, por ejemplo: C:\>MASM RUTINAS; Lo cual creara rutinas.obj, ahora esta listo para realizar la interfaz, vea el siguiente programa: PROGRAM SUMA; VAR A : WORD; {$L RUTINA} FUNCTION RUTINA (A,B : WORD) : WORD; EXTERNAL; BEGIN A := RUTINA (2,3); WRITELN ('LA SUMA DE 2+3 ES : ',A); END. Lo cual funciona perfectamente. La creacion del fichero obj es la base para crear la interfaz con cualquier lenguaje de programacion, solo tendra que respetar las convenciones y estructuras del lenguaje con el cual quiera crear la interfaz. El acceso a los parametros en la pila se puede mejorar mucho con la directiva struc pero ahondar en las caracteristicas del lenguaje ensamblador ya no es adecuado en un libro sobre pascal debido a que las subrutinas externas ya no son el metodo mas adecuado para hacer interfaces, en lo que sigue me voy a ocupar exclusivamente del ensamblador integrado (Basm). Como se trata de un libro sobre pascal considero que el lector al leer este capitulo ya conoce el assembler a un nivel por lo menos medio sino debe detener la lectura y dejarla para cuando conozca el lenguaje ensamblador. .