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
Il problema è alla linea 28 dove l'istruzione BE0000 deve essere risolta in BE0020codice: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
per poter prelevare i dati corretti!
Esiste un modo per indicare al compilatore o al linker che deve tradurre il codice in modo assoluto???

Rispondi quotando