Ho ripassato le procedure esterne NEAR (ossia facenti parte dello stesso segmento).
Ecco i due sorgenti, quello del programma principale e quello di una procedura esterna:
extrn X:near
;definiamo il segmento
text segment public
;inizio del programma
start:
mov ah,00h
mov al,03h
int 10h
mov al,'X'
call X
mov ah,00h
int 16h
mov ah,4ch
int 21H
text ends
end start
public X
text segment public
X proc near
mov ah,09h
mov bh,00h
mov bl,0ch
mov cx,1
int 10h
ret
X endp
text ends
end
assemblo e linko insieme l'uno e l'altro:
c:\Assembly>ml /Zm /c uno.asm
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.
Assembling: uno.asm
c:\Assembly>ml /Zm /c proced.asm
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.
Assembling: proced.asm
c:\Assembly>link uno proced
Microsoft (R) Segmented Executable Linker Version 5.60.339 Dec 5 1994
Copyright (C) Microsoft Corp 1984-1993. All rights reserved.
Run File [uno.exe]:
List File [nul.map]:
Libraries [.lib]:
Definitions File [nul.def]:
LINK : warning L4021: no stack segment
c:\Assembly>
e funziona:
X
c:\Assembly>
Adesso, invece di linkare due files oggetto insieme uso una libreria:
Costruisco una libreria.
c:\Assembly>lib libreria
Microsoft (R) Library Manager Version 3.40
Copyright (C) Microsoft Corp 1983-1993. All rights reserved.
Library does not exist. Create? (y/n) y
Operations:
List file:
c:\Assembly>dir libreria*
Il volume nell'unità C non ha etichetta.
Numero di serie del volume: ECE6-4560
Directory di c:\Assembly
20/09/2013 00.31 1.033 libreria.lib
1 File 1.033 byte
0 Directory 12.002.516.992 byte disponibili
c:\Assembly>
Adesso ci agginugo il file oggetto proced.obj.
Troviamolo...
c:\Assembly>dir proced*
Il volume nell'unità C non ha etichetta.
Numero di serie del volume: ECE6-4560
Directory di c:\Assembly
19/09/2013 22.07 137 proced.asm
20/09/2013 00.33 77 proced.obj
2 File 214 byte
0 Directory 12.002.582.528 byte disponibili
c:\Assembly>
Eccolo!
Aggiungiamolo:
c:\Assembly>lib libreria + proced
Microsoft (R) Library Manager Version 3.40
Copyright (C) Microsoft Corp 1983-1993. All rights reserved.
List file:
Output library:
c:\Assembly>
Leggiamo la libreria per vedere se contiene la procedura:
c:\Assembly>lib libreria
Microsoft (R) Library Manager Version 3.40
Copyright (C) Microsoft Corp 1983-1993. All rights reserved.
Operations:
List file: con
X.................proced
proced Offset: 00000010H Code and data size: cH
X
c:\Assembly>
Perfetto!