ASM Errori nella compilazione di un semplice boot loader

Stato
Discussione chiusa ad ulteriori risposte.

Giuseppe Morgano

Utente Bronze
24 Luglio 2014
6
3
0
39
Durante la compilazione nasm mi da questi errori e non capisco perché li dia, mi aiutate a risolverli? sotto c'è l'intero codice e l'immagine cosi potete capire meglio l'errore
http://110.imagebam.com/download/JxT24Jd80sXATMJpn_gd1Q/34087/340861594/Immagine.jpg

Codice:
bits 16;
org 0x7c; bios setup


;variables type


Message db "Newspoint Software BootLoader V0.1", 0x0
Message1 db "BootLoader developed by", 0x0
Message2 db "Giuseppe Alessandro Morgana", 0x0
message3 db "", 0x0
message4 db "Premi un tasto per continuare", 0x0


;print character 
Println
    lodsb
    or al; al = loop
    jz complete
    mov ah, 0x0e
    int 0x10; stampa variables from memory video
    jmp println
complete:
    call println
    
    PrintNwl:
    mov al, 0
    stosb
    
    mov ah, 0x0E
    mov al, 0x0B
    int 0x10
    mov al, 0x0A
    int 0x10
    ret
        
;reboot machine
reboot
mov si, AnyKey
call println
call GetPressedKey


;


db 0x0ea
dw 0x0000
dw 0xffff


GetPressedKey:
mov ah, 0x16 ;bios keyboard service
;bios required entry code
main:
cli
mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax
sti
;print character
mov si message, 0
call println 
mov si message2, 0
call println
mov si message3, 0
call println
mov si message4, 0
call println
call PrintNwl
call reboot


times 510 - ($ $$) db 0
dw 0xAA55
 
Il BIOS carica i primi 512 bytes all' indirizzo fisico 0x7C00, quindi dovresti modificare la seconda linea di codice con "org 0x7c00".
Poi ci sono diversi errori di sintassi come "mov si message, 0", dovresti scrivere "mov si, message".

Qui puoi trovare qualche info in più sul tuo progetto: http://wiki.osdev.org/Babystep2

P.S: nella label GetPressedKey manca un "ret" finale e la call dell' interrupt
P.S.S: non è presente un CRT0 e il codice e compilato in formato binario, quindi non vi è un vero e proprio entry point, quindi il "main" andrebbe all' inizio (Benvenuto nel basso livello della programmazione xD)
 
Ultima modifica:
Ahimè, i giovani d'oggi.. Non sanno manco più copiare.. Perché tu hai copiato, dico bene ? Building Your Own Bootloader - Fisnik Hasani eh si.. La curiosità mi ha spinto a fare qualche ricerca ed ho trovato lo stesso pezzo postato da te.. La differenza tra i due ? che la è scritto in modo corretto mentre nel tuo ci sono errori di battitura.. Inoltre non segui una logica ben precisa ma questo non fa una piega..

Dato che non aspetta me giudicarti, passiamo avanti.. Eccoti il codice sistemato.. Mi sono permesso di apportare qualche miglioria al codice ma premetto di non averlo testato.. Tutto sommato dovrebbe andare..

Codice:
[BITS 16] ; codice a 16 bit
[ORG 0x7C00]


Main:
    mov ax, 0x00
    mov ds, ax
    
    mov si, Message
    call Println
    mov si, Message1
    call Println
    mov si, Message2
    call Println
    
    call Reboot
    
    jmp $
    
Println:
    mov ah, 0x0E
    mov bh, 0x00
    mov bl, 0x07
    .NextCharacter
        lodsb
        or al, al
        jz .Return
        int 0x10
        jmp .NextCharacter
    .Return
        ret
    
ReadKey:
    mov ah, 0x00
    int 0x16
    ret
    
Reboot:
    mov si, Message3
    call Println
    call ReadKey
    dw 0x00EA
    dw 0x0000
    dw 0xFFFF


Message  db 'Newspoint Software BootLoader V0.1', 13, 10, 0
Message1 db 'BootLoader developed by Giuseppe Alessandro Morgana', 13, 10, 0
Message3 db 'Premi un tasto per continuare..', 13, 10, 0


times 510-($-$$) db 0
dw 0xAA55

La funzione PrintNwl non è servita (ho semplicemente aggiunto ,13, 10, a fine stringa) ma te la posto lo stesso in caso ti serva più avanti..

Codice:
PrintNwl:
    mov ah, 0x0E
    mov bh, 0x00
    mov bl, 0x07
    mov al, 0x0D
    int 0x10
    mov al, 0x0A
    int 0x10
    ret

Che dire a riguardo ? hai fatto la tua figura.

Cordiali saluti,
RagazzoTM.
 
Non hai messo i numeri di linea, ma ad occhio e croce le istruzioni che danno errore sono queste:

mov si message, 0
mov si message2, 0
mov si message3, 0
mov si message4, 0

Difatti non hanno alcun senso in quanto

mov si message4, 0 è errato proprio nella forma.

o fai MOV SI, message4
o fai MOV SI, 0

Io non voglio entrare nel merito di cosa debba fare il programma, ma questi sono gli errori secondo me.
 
Non hai messo i numeri di linea, ma ad occhio e croce le istruzioni che danno errore sono queste:

mov si message, 0
mov si message2, 0
mov si message3, 0
mov si message4, 0

Difatti non hanno alcun senso in quanto

mov si message4, 0 è errato proprio nella forma.

o fai MOV SI, message4
o fai MOV SI, 0

Io non voglio entrare nel merito di cosa debba fare il programma, ma questi sono gli errori secondo me.

Si ma non solo quello, ha sbagliato a trascrivere varie cose.
 
Ultima modifica:
Ma infatti non dico di averlo scritto da me da 0, mi chiedevo in cosa sbagliavo per dare questi errori, essendo poi alle prime armi in asm, comunque, sto cercando di mettere più di una schermata del tipo Main: ma mi da errore, ti posto il codice
Codice:
bits 16 ; 16-bit Real Mode
org 0x7c00 ; BIOS boot origin 

jmp main ;Jump to start main() entry-point 

Message db "", 0x0 
MessageB db " Newspoint Software Inc.                                  Bootloader Ver. 0.4.16", 0x0
Message2 db "        Num.Build: 0.4.18.51_MainRelase_RevolutionProject_1000_271014         ", 0x0
Message1 db "", 0x0
Message3 db " -            DEVELOPER bootloader Giuseppe Alessandro Morgana                -", 0x0
Message4 db "", 0x0
Message5 db "", 0x0
Message6 db "", 0x0 
Message7 db "", 0x0
Message8 db "", 0x0
Message9 db " Newspoint Software Inc.                                          RevOS (C)2014", 0x0
CancKey db " Premi un testo per tornare indietro", 0x0 
F2Key db "Per visualizzare un log dei file inizializati premi F2", 0x0
EscKey db "Per riavviare premi Esc", 0x0
;Menu su Jmp Menu

;Stampa i caratteri sullo schermo 
Println:
    lodsb ;Carica la stringhia
    or al, al
    jz complete
    mov ah, 0x0e 
    int 0x10 ;BIOS Interrupt 0x10 - Usato per stampare a schermo usando la memoria video 
    jmp Println ;Loop   
complete:
    call PrintNwL


;Stampa sulla nuova riga '\n' in C/C++ 
PrintNwL: 
    mov al, 0    ; null terminator '\0'
    stosb       ; Store string 


    ;Aggiunge una nuova riga '\n'
    mov ah, 0x0E
    mov al, 0x0D
    int 0x10
    mov al, 0x0A 
    int 0x10
ret


;Riavvia la macchina 
Reboot: 
    mov si, EscKey
    call Println
    call GetPressedKey 


    ;invia alla fine della memoria
    ;causando il riavvio
    db 0x0ea 
    dw 0x0000 
    dw 0xffff 


;Nuova finestra info    
Menu:
  mov si, F2Key
    call Println
    call GetPressedKey
   jmp menuInf
   
HomeMenu:


  mov si, CancKey   
  call Println
  call GetPressedKey
 jmp main
   
menuInf:
 cli 
   
   mov ax,cs              
   mov ds,ax   
   mov es,ax               
   mov ss,ax                
   sti 
   
   mov si, Message 
   call Println 


   mov si, MessageB
   call Println 
   
   mov si, Message2
   call Println
   
   mov si, Message1
   call Println
   
   mov si, Message 
   call Println
   
   mov si, Menu1
   call Println
   
   mov si, Menu2
   call Println
   
   mov si, Menu3
   call Println
   
   mov si, Menu4
   call Println


    
;Ottiene il tasto premuto
GetPressedKey:
    mov ah, 0
    int 0x16  ;BIOS Keyboard Service 
    ret 


;Bootloader entry-code 
main:
   cli 
 
   mov ax,cs              
   mov ds,ax   
   mov es,ax               
   mov ss,ax                
   sti 


  
   mov si, Message 
   call Println 


   mov si, MessageB
   call Println 
   
   mov si, Message2
   call Println
   
   mov si, Message1
   call Println
   
   mov si, Message3
   call Println
   
   mov si, Message4
   call Println
   
   mov si, Message5
   call Println
   
   mov si, Message6
   call Println
   
   mov si, Message7
   call Println
   
   mov si, Message8
   call Println
   
   mov si, Message9
   call Println
   
   call PrintNwL
   call PrintNwL
   
   call Menu
   call menuInf
   call HomeMenu
   call Reboot 


   times 510 - ($-$$) db 0 
   dw 0xAA55 ;Boot signature

Immagine.png
 
Hai scritto troppo codice, ricorda che il BIOS carica solo 512 Byte.
con "times 510 - ($-$$) db 0" crei un output che viene allineato fino a 510Byte e non oltre, quindi dovresti rivedere un po tutto.
 
  • Mi piace
Reazioni: Giuseppe Morgano
Grazie per il chiarimento, comunque la parte per richiamare nuove schermate è esatta no? tipo HomeMenu: Menu: MenuInf: giusto per capire perché nel poco tempo che ho da dedicare all'asm vorrei fare qualcosina xD
 
Come citato da WareX, il codice è abbastanza sporco (sembra scritto coi piedi giusto per fare qualcosa, a voi non da la stessa impressione ?), prova a sistemarlo un po. Personalmente trovo ridicolo lavorare ad una cosa simile in tempi diversi, si parla di 3 mesi e non di poche ore.
 
Stato
Discussione chiusa ad ulteriori risposte.