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