Ciao ho un problema con la creazione di un codice che deve essere inserito nel settore d'avvio di un floppy. Quando il computer si avvia entra in modalità reale con segmentazione e carica il codice che ho inserito nel settore d'avvio.
Io so esattamente dove è inserito il programma in memoria dopo l'avvio o meglio so esattamente in che segmento verrà caricato, quindi io devo creare un codice assoluto per avere un corretto funzionamento, pero il compilatore non traduce l'indirizzo della variabile, dando il compito al linker, ovviamente quando cerco i dati questi non sono ragiungibili..
Posto l'output dell'assemblatore : as -a esercizio.s
codice:
GAS LISTING es1.s page 1
1 #
2 # es1.s
3 #
4 # Settore di avviamento per floppy, stampa una stringa a schermo
5 # e blocca la macchina in un ciclo infinito
6 #
7
8 .code16 # Necessario per eseguire il codice in modo reale
9
10 .set SEG_BOOT, 0x07c0
11 .set INIT_STACK, 0x400
12
13 .text
14
15 0000 B8C007 movw $SEG_BOOT, %ax # caricamento di valori noti nei registri
16 0003 8ED8 movw %ax, %ds # selettore
17 0005 8EC0 movw %ax, %es
18
19 0007 FA cli # interruzioni disabilitate nel cambiamento
20 # di pila
21 0008 8ED0 movw %ax, %ss
22 000a BC0004 movw $INIT_STACK, %sp # pila iniziale a 0x07c0:0400, cioe'
23 # 512 byte dopo la fine del settore
24 # di avviamento in memoria
25
26 000d FB sti
27
28 000e BE0000 movw $mess, %si # indirizzo del primo carattere del messaggio
29 # in si
30 # impostazione parametri int 0x10:
31 0011 B40E movb $0x0e, %ah # servizio stampa carattere
32 0013 B700 movb $0, %bh # numero di pagina
33
34 nuovo_car:
35 0015 AC lodsb # carica il carattere in al
36 0016 3C00 cmpb $0, %al # verifica se e' l' ultimo
37 0018 7404 je fine
38 001a CD10 int $0x10 # lo stampa
39 001c EBF7 jmp nuovo_car
40
41 001e EBFE fine: jmp fine # ciclo infinito
42
43 0020 48656C6C mess : .asciz "Hello word"
43 6F20776F
43 726400
44
45 002b 00000000 .org 510
45 00000000
45 00000000
45 00000000
45 00000000
46 01fe 55 sign: .byte 0x55 # signature per un settore di avviamento valido
47 01ff AA .byte 0xaa
48
GAS LISTING es1.s page 2
DEFINED SYMBOLS
es1.s:10 *ABS*:00000000000007c0 SEG_BOOT
es1.s:11 *ABS*:0000000000000400 INIT_STACK
es1.s:43 .text:0000000000000020 mess
es1.s:34 .text:0000000000000015 nuovo_car
es1.s:41 .text:000000000000001e fine
es1.s:46 .text:00000000000001fe sign
NO UNDEFINED SYMBOLS
Il problema è alla linea 28 dove l'istruzione BE0000 deve essere risolta in BE0020
per poter prelevare i dati corretti!
Esiste un modo per indicare al compilatore o al linker che deve tradurre il codice in modo assoluto???