Come avrete sicuramente notato, manca
il '
$' prima della costante
0x4100, che quindi viene
interpretata come un indirizzo di memoria a cui accedere per prelevare
la maschera con cui testare il contenuto di %ax. Se siete fortunati,
al'indirizzo 0x4100 troverete una word con i bit 14 e 8 (i bit che
volevate controllare in %ax con la maschera $0x4100) pari ad uno. Il
valore degli altri bit della word, prelevata dalla memoria, importa
poco, perchè, tipicamente, i bit di %ax diversi dal n. 14 e dal
n. 8 sono già pari a zero dopo una
fstsw %ax. In altre parole, non
solo il vostro programma prosegue come se niente fosse (accede in
lettura all'indirizzo 0x4100 che contiene codice e non dati, ma il
sistema non lo interrompe), ma sembra anche funzionare correttamente
(per caso, esegue il test sui bit giusti di %ax).
Su FreeBSD (come su tutti i sistemi che adottano il formato ELF
[7]),
gli eseguibili vengono invece caricati a partire dall'indirizzo
0x08048000 (134512640 in decimale) e gli indirizzi precedenti sono
inaccessibili (protetti da lettura e scrittura). Ecco perchè il
vostro programma causerà un errore di protezione a tempo di
esecuzione.
NOTA: questo non vuol dire che
FreeBSD è meglio di Windows XP (almeno, non per questo motivo).
Infatti, si può verificare benissimo la situazione opposta, se per
sbaglio il vostro programma accede ad un indirizzo di memoria di poco
superiore a 0x08048000.
Esempio 3:
Una situazione abbastanza frequente, nonostante io cerchi di
sconsigliarla durante le esercitazioni, è la seguente:
# siamo all'inizio del secondo
esercizio
movl 8(%ebp), %eax