|
 |
Gli strumenti di Lavoro |
LINKER 5/10
[41 di 87] |
|
Aggiornato 10 luglio 2010 |
 |
|
Il file EXE in rapporto con il file MAP (Procedure
EXTRN di tipo NEAR) |
|
 | Il sorgente
PROVA1.ASM
definisce e chiama 2 procedure; nella
figura che segue viene mostrato il programma
PROVA2.ASM, funzionalmente identico al
precedente ma sostanzialmente differente, dato che obbliga il
Linker a cercare le 2
procedure di prima dentro la libreria
Giobe.LIB; notiamo il sorgente (a sinistra, con le 2
dichiarazioni
EXTRN
di tipo NEAR) e il listato
prodotto dal MASM (a destra, con i 2
indirizzi Offset lasciati a
0000, e marcati con una
E, appunto per esterna):
EXTRN KEYwait:NEAR
EXTRN BIOScls:NEAR
_prog SEGMENT BYTE PUBLIC 'CODE'
ASSUME CS:_prog,DS:_prog
ORG 0100H
Main: CALL BiosCls
CALL KeyWait
MOV AH,4CH
INT 21H
_prog ENDS
END Main |
EXTRN KEYwait:NEAR
EXTRN BIOScls:NEAR
0000 _prog SEGMENT BYTE PUBLIC 'CODE'
ASSUME CS:_prog,DS:_prog
0100 ORG 0100H
0100 E8 0000
E
Main: CALL BiosCls
0103 E8 0000
E CALL KeyWait
0106 B4 4C MOV AH,4CH
0108 CD 21 INT 21H
010A _prog ENDS
END Main |
|
 | Nelle figure seguenti vediamo ora cosa ci
dice il file opzionale MAP (in alto) e come
viene visualizzato il codice
EXE (in basso, con l'aiuto di
Debug); entrambi i files sono generati dal
Linker. |
 |
In particolare il file MAP
anticipa l'indirizzo del primo bytes da eseguire (Program
entry point at 0000:0100) e la
lunghezza del file (Length
00116H) corrispondente
all'indirizzo del primo bytes non appartenente all'eseguibile; il
disassembly del file EXE (parte
bassa) conferma entrambe le indicazioni e mostra come il
Linker
abbia inserito le 2 procedure assunte dalla libreria subito sotto il Main:
C:\ARCH-LAB\LAVORO> type prova2.map
LINK : warning L4021: no stack segment
Start Stop Length Name Class
00000H 00115H 00116H _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 E80C00
CALL 010F ; CALL BiosCls (near)
0103 E80400
CALL 010A ; CALL KeyWait (near)
0106 B44C MOV AH,4C ; MOV AH,4CH
0108 CD21 INT 21 ; INT 21H
-----------------------------------------------------------
010A B400 MOV AH,00 ;|
010C CD16 INT 16 ;|istruzioni della Procedura KeyWait
010E C3 RET ;|
-----------------------------------------------------------
010F B400 MOV AH,00 ;|
0111 B003 MOV AL,03 ;|istruzioni della Procedura BiosCls
0113 CD10 INT 10 ;|
0115 C3 RET ;|
0116 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 vicino (NEAR):
infatti sia CALL che
RET
sono codificate con codici operativi vicini,
E8
e
C3.
|
 | il Linker
ha sostituito i valori vuoti
0000
delle 2 procedure rispettivamente con
000C
e
0004; osserva come valga
la regola Lo- Hi, per la quale in memoria sono scritti
alla rovescia,
0C00
e
0400,
prima il byte meno significativo (Low) e poi quello più significativo
(High). |
 | si nota subito che questi numeri
non sono
indirizzi di offset (rispettivamente uguali a
010F
e
010A, come si legge dall'operando di
CALL)
ma rappresentano un indirizzo relativo, cioè indicano il
numero di bytes da aggiungere a quello
dell'istruzione che li ospita per trovare la procedura a cui si
riferiscono, rispettivamente
0C
(=12) e
04
(=4) bytes in avanti |
 | poichè il salto delle locazioni è
in avanti, nel
conto espresso dal numero dei bytes da aggiungere
non si tiene conto di
quelli che costituiscono l'istruzione di partenza e di d'arrivo; se il
salto fosse indietro,
l'indirizzo relativo
terrà invece conto
anche di questi !! |
|
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|