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