  | Per spirito d'osservazione vediamo che cosa
    succede se, nel programma  PROVA2.ASM, le 2 procedure
    EXTRN
    sono dichiarate di tipo FAR: il
    codice sorgente è pressocché identico a quello di prima (con  FAR al posto
    di NEAR), mentre il listato
    prodotto dal MASM  evidenzia ancora i 2
    
    indirizzi Offset, lasciati a  0000
    e marcati con una  E (appunto per  esterna),
    ma ora mostra anche  altri 2 bytes (----)
    necessari per consentire al Linker di inserire anche la parte
     Segment dell'indirizzo
    delle procedure:
        
      
                                
        EXTRN KEYwait:FAR 
                                  
        EXTRN BIOScls:FAR 
        0000               
        _prog  SEGMENT BYTE PUBLIC 'CODE' 
                                  
        ASSUME CS:_prog,DS:_prog 
        0100                      
        ORG   0100H 
        0100  9A 0000  ---- E
        Main:  CALL  BiosCls 
        0105  9A 0000  ---- E  
             CALL  KeyWait 
        010A B4 4C                
        MOV   AH,4CH 
        010C CD 21                
        INT   21H 
        010E               
        _prog  ENDS 
                                  
        END   Main | 
       
      | 
    | Nelle figure seguenti vediamo i 2 files   MAP (in alto) e
  
     EXE (in
    basso, con l'aiuto di Debug);
    aggiornati dalla nuova esigenza di codificare  FAR le procedure. | 
    | L'indirizzo del primo bytes da eseguire non è
    cambiato (Program entry point at
    0000:0100) mentre la lunghezza del file
    (Length 0011AH)
    è ora 4 bytes più grande per garantire la presenza di un indirizzo
    di puntamento lontano; il disassembly del file   EXE (parte
    bassa della figura seguente) conferma
    ancora entrambe
    le indicazioni e mostra le 2 procedure assunte dalla libreria siano state
    inserite dal Linker sempre sotto il
    Main:
        
      
      
      C:\ARCH-LAB\LAVORO> type prova2.map 
LINK : warning L4021: no stack segment 
         
      Start    Stop     Length   Name    Class 
      00000H 00119H 0011AH 
        _PROG  CODE 
         
       
        
      Program entry point at 0000:0100 | 
       
     
        
      
      
      C:\ARCH-LAB\LAVORO> debug prova2.exe 
        Microsoft (R) Symbolic Debug Utility Version 4.00 
        Copyright (C) Microsoft Corp 1984, 1985. All rights reserved. 
        - U 100              
        ; comando Debug per Unassemble 
        --------------------------------- istruzioni del Main Program 
        0100  9A1301A430
        CALL 30A4:0113;   CALL  BiosCls (far) 
        0105  9A0E01A430
        CALL 30A4:010E;   CALL  KeyWait (far) 
        010A B44C        MOV  AH,4C   
        ;   MOV   AH,4CH 
        010C CD21        INT 
        21       ;   INT   21H 
        ----------------------------------------------------------- 
        
        010E B400        MOV  AH,00   
        ;| 
        0110 CD16        INT  16      
        ;|Procedura KeyWait 
        0112  C3          RET          
        ;| 
        ----------------------------------------------------------- 
        
        0113 B400        MOV  AH,00   
        ;| 
        0115 B003        MOV  AL,03   
        ;|Procedura BiosCls 
        0117 CD10        INT  10      
        ;| 
        0119  C3          RET          
        ;| 
        0116A 0000   ; prima istruzione non appartenente al programma | 
       
      | 
    | L'analisi del codice macchina disassemblato ci
    suggerisce queste considerazioni: 
  
      | il codice prodotto dal  MASM è
        effettivamente di tipo lontano (FAR),
        almeno per la CALL (codice
        operativo 9A
        invece di E8)
        mentre per la RET
        viene mantenuta la codifica vicina (ancora codice operativo 
    C3
        invece CB);
        nonostante l'apparente discordanza non c'è incongruenza perchè la
        libreria definisce  NEAR tutte le proprie procedure. |  
      | il Linker
        ha sostituito i 2 byte vuoti 0000
        con la parte
        offset dell'indirizzo delle 2 procedure, rispettivamente
        con 0113
        e 010E
        (scritti alla rovescia, 1301   
        e
        0E01,
        in memoria, valendo sempre la
        regola Lo- Hi). Ora
        questi numeri esprimono un reale indirizzo (assoluto, non relativo come nel caso delle procedure NEAR). |  
      | il fatto nuovo
        è la presenza dei 2 bytes della  parte segment dell'indirizzo, a
        sostituzione degli spazi lasciati vuoti (----)
        da MASM nel file oggetto: il numero 30A4
        è stato scritto (nella giusta
        posizione nel programma  EXE) dal loader
        del Dos  nella fase di caricamento, in funzione delle
        indicazioni lasciate dal Linker
        nella Tabella
        di Rilocazione e in
        funzione del valore del
        primo segmento rilevato libero in memoria. In
        questo consiste la rilocabilità del
        programma  EXE. |  
   
   |