logo Homepage
+  NewbieContest
|-+  Programmation» Langages compilés» Une erreur d'assembleur ?
Username:
Password:
Pages: [1]
  Imprimer  
Auteur Fil de discussion: Une erreur d'assembleur ?  (Lu 10102 fois)
DarK-CrasH

Profil challenge

Classement : 3019/54440

Membre Junior
**
Hors ligne Hors ligne
Messages: 79


Voir le profil
« le: 07 Août 2012 à 12:16:38 »

Bonjour à tous.
Depuis peu, l'assembleur et moi vivons des choses .. Extrêmement désagréables. Je m'explique :

Je cherche à faire un secteur boot, donc en asm. Cependant, n'étant que débutant, je m'inspire d'un site : a.michelizza.free.fr/pmwiki.php?n=TutoOS.Bootsect


Voici le code :

Code:
[BITS 16]  ; indique a nasm que l'on travaille en 16 bits
[ORG 0x0]

; initialisation des segments en 0x07C00
    mov ax, 0x07C0
    mov ds, ax
    mov es, ax
    mov ax, 0x8000
    mov ss, ax
    mov sp, 0xf000    ; stack de 0x8F000 -> 0x80000

; affiche un msg
    mov si, msgDebut
    call afficher


end:
    jmp end


;--- Variables ---
    msgDebut db "Hello world !", 13, 10, 0
;-----------------

;---------------------------------------------------------
; Synopsis: Affiche une chaine de caracteres se terminant par 0x0
; Entree:   DS:SI -> pointe sur la chaine a afficher
;---------------------------------------------------------
afficher:
    push ax
    push bx
.debut:
    lodsb         ; ds:si -> al
    cmp al, 0     ; fin chaine ?
    jz .fin
    mov ah, 0x0E  ; appel au service 0x0e, int 0x10 du bios
    mov bx, 0x07  ; bx -> attribut, al -> caractere ascii
    int 0x10
    jmp .debut

.fin:
    pop bx
    pop ax
    ret

;--- NOP jusqu'a 510 ---
    times 510-($-$$) db 144
    dw 0xAA55


Bon, pour :
Code:
[BITS 16]  ; indique a nasm que l'on travaille en 16 bits
[ORG 0x0]


Vu que ce doit être une spécificité de nasm, on peut retirer la première ligne.

Je lance avec RadAsm, et il me sort .. Une multitude d'erreurs : [ est une balise non-reconnue, et les lignes : 3, 4, 5, 6, 7, 8, 9, 10, et 11 "must be in segment block."

Ligne 15 : missing operand after unary operator


Donc, outre résoudre ces problèmes, j'ai une autre question :

Code:
; initialisation des segments en 0x07C00
    mov ax, 0x07C0
    mov ds, ax
    mov es, ax
    mov ax, 0x8000
    mov ss, ax.. etc


Pourquoi initialise t'on les segments en 0x07C00 ? C'est aléatoire ? Y'a une raison précise ? Comment choisit-on l'adresse d'initialisation ?


Merci à vous !
Journalisée

Toujours repousser ses limites c'est bien. Le faire avec méthode, c'est mieux.
harvey

Profil challenge

Classement : 12/54440

Membre Senior
****
Hors ligne Hors ligne
Messages: 316


Voir le profil WWW
« #1 le: 07 Août 2012 à 16:37:51 »

Citation
Je lance avec RadAsm, et il me sort .. Une multitude d'erreurs : [ est une balise non-reconnue, et les lignes : 3, 4, 5, 6, 7, 8, 9, 10, et 11 "must be in segment block."

Ligne 15 : missing operand after unary operator

Je n'ai pas ces erreurs avec
Code:
nasm -f bin bootloader.asm
, et l'image fait bien 512 octets.

Citation
Vu que ce doit être une spécificité de nasm, on peut retirer la première ligne.
RadAsm supporterait la syntaxe nasm, mais pas les directives BITS et ORG ? Si c'est le cas, difficile de spéculer sur le reste (je n'ai jamais utilisé RadAsm).
Qu'est-ce que ça donne sans les crochets ("BITS 16")?

Tu assembles sous quel format, quelle sont les options ou la ligne de commande ?
Ne serait-il pas plus simple de faire ça directement avec nasm ?
Journalisée

L'entropie vient en mangeant.
DarK-CrasH

Profil challenge

Classement : 3019/54440

Membre Junior
**
Hors ligne Hors ligne
Messages: 79


Voir le profil
« #2 le: 07 Août 2012 à 16:59:02 »

Je compile avec RadAsm, plus simple, car je ne peux plus voir de lignes de commande -.-, et c'est lui qui me sort ces erreurs, en réponse à harvey. De plus, avec ta commande, il ne se passe .. Rien..

Je ne sais pas par rapport à ta remarque. Je sais juste qu'il me sort une jolie erreur.

("BITS 16") : Ce serait pas juste une chaine de caractère, identifiée par les guillemets ?



Geo : Merci pour la correction, la coquille n'était pas intentionnelle. Je pense que tu as raison. Aurais-tu les restes de docs t'ayant servie il y a quelques mois ?
Journalisée

Toujours repousser ses limites c'est bien. Le faire avec méthode, c'est mieux.
harvey

Profil challenge

Classement : 12/54440

Membre Senior
****
Hors ligne Hors ligne
Messages: 316


Voir le profil WWW
« #3 le: 07 Août 2012 à 17:22:21 »

Citation
Je compile avec RadAsm, plus simple, car je ne peux plus voir de lignes de commande -.-, et c'est lui qui me sort ces erreurs
Certes, mais utiliser la ligne de commande permet de savoir précisément ce qu'on demande à l'assembleur (modulo les options par défaut), plutôt que de devoir modifier une option cachée dans un sous-menu.
Nasm supporte de nombreux formats (bin, coff, elf...). Es-tu sûr que ton code est assemblé au format bin, qui convient pour un secteur de boot ? L'interprétation du code dépend du format choisi.

Citation
De plus, avec ta commande, il ne se passe .. Rien..
Donc, pas d'erreur. Regarde si tu n'as pas un fichier "bootloader" dans le répertoire où tu as lancé la commande (ou autre, le nom par défaut est le nom du fichier asm sans l'extension; tu peux choisir le fichier de sortie avec l'option -o, comme le fait l'auteur de l'article).

Citation
("BITS 16") : Ce serait pas juste une chaine de caractère, identifiée par les guillemets ?
Non, juste BITS 16, sans crochets ni guillemets. Je l'ai toujours vu écrit comme ça.
Cela dit, BITS 16 et ORG 0 sont les choix par défaut quand on assemble au format bin. Tu devrais donc pouvoir enlever ces lignes, mais le fait qu'elles causent des erreurs révèle un problème.


*edit: s/bootloader/secteur de boot/
« Dernière édition: 09 Août 2012 à 05:37:46 par harvey » Journalisée

L'entropie vient en mangeant.
DarK-CrasH

Profil challenge

Classement : 3019/54440

Membre Junior
**
Hors ligne Hors ligne
Messages: 79


Voir le profil
« #4 le: 07 Août 2012 à 18:29:55 »

Bien, tu as raison
J'ai un fichier "boot" de 1 ko .. Après utilisation de la ligne de commande que tu m'as conseillé

Code:
C:\Users\Ackermann Q\Desktop\ASM\boot sector\boot.asm(1) : error A2008: syntax error : BITS
Donc, à priori, cela me cause une erreur. Je ne comprends pas, j'ai essayé avec [], sans, avec ""... Bizarre
Journalisée

Toujours repousser ses limites c'est bien. Le faire avec méthode, c'est mieux.
DarK-CrasH

Profil challenge

Classement : 3019/54440

Membre Junior
**
Hors ligne Hors ligne
Messages: 79


Voir le profil
« #5 le: 07 Août 2012 à 22:18:10 »

Yep, bon, j'ai résolu le problème des BITS / ORG.

Maintenant, les erreurs block segments, je sais pas d'où elles sortent..
Journalisée

Toujours repousser ses limites c'est bien. Le faire avec méthode, c'est mieux.
harvey

Profil challenge

Classement : 12/54440

Membre Senior
****
Hors ligne Hors ligne
Messages: 316


Voir le profil WWW
« #6 le: 07 Août 2012 à 22:41:02 »

Citation de: DarK-Crash
Yep, bon, j'ai résolu le problème des BITS / ORG.
Comment ?

En regardant comment Radasm fonctionne, on voit qu'il appelle nasm en sous-main, avec une ligne de commande puisque nasm fonctionne comme ça. Tu as même dû lui fournir l'adresse du binaire à un moment ou à un autre.

Donc, si ça marche "avec nasm" mais pas "avec radasm", c'est que la ligne de commande n'est pas la même (ou l'environnement, mais je ne crois pas que ça puisse jouer ici).

Je t'avoue que je n'ai pas trouvé comment modifier la ligne de commande. J'ai juste vu qu'en créant un nouveau projet, on peut choisir l'assembleur et le type d'application. Avec RadAsm fraîchement dézippé, je n'ai que "Win32 App" sous nasm, ce qui ne conviendra évidemment pas.

La manière dont un type d'application correspond à une ligne de commande est probablement défini dans nasm.ini, que tu peux toujours modifier, ou en chercher un dans lequel le bon format est défini... si tu tiens toujours à utiliser cet IDE.

Citation de: Geo
(Coucou harvey au passage )
o/
« Dernière édition: 07 Août 2012 à 22:45:07 par harvey » Journalisée

L'entropie vient en mangeant.
DarK-CrasH

Profil challenge

Classement : 3019/54440

Membre Junior
**
Hors ligne Hors ligne
Messages: 79


Voir le profil
« #7 le: 07 Août 2012 à 22:48:24 »

Alors, j'ai lu -dans le tas de doc, ça va me revenir- qu'un bootloader commence avec un décalage 100h, donc j'ai mis :

ORG 100h
(BITS n'est apparemment pas essentiel)
Depuis, je n'ai plus d'erreur. Il n'empêche qu'à priori, les segments sont pas au bon endroit.. Donc je continue à enfiler la doc, et les bootloader d'autres programmeurs afin de cerner mon erreur
Journalisée

Toujours repousser ses limites c'est bien. Le faire avec méthode, c'est mieux.
DarK-CrasH

Profil challenge

Classement : 3019/54440

Membre Junior
**
Hors ligne Hors ligne
Messages: 79


Voir le profil
« #8 le: 08 Août 2012 à 17:10:14 »

Alors, j'ai décidé de retourner aux sources, et quelque chose de curieux est apparu :

mon process de test fonctionne, je le vois dans le gestionnaire des tâches, mais la console n'apparait pas sur mon écran ..


Par exemple :

Code:

.386
.model flat, stdcall
option casemap : none

include C:\masm32\include\masm32rt.inc


.code

salut :

print "Essai d'affichage de texte", 13, 10
inkey "Appuyer sur une touche pour continuer..."
exit


end salut

La console avec mon print n'apparait pas, mais dans mes processus, il apparait..
Journalisée

Toujours repousser ses limites c'est bien. Le faire avec méthode, c'est mieux.
DarK-CrasH

Profil challenge

Classement : 3019/54440

Membre Junior
**
Hors ligne Hors ligne
Messages: 79


Voir le profil
« #9 le: 08 Août 2012 à 21:42:03 »

YEA !


Bon, le secteur de boot, problème réglé, il s'assemble et j'obtiens mon fichier bin de 512 mo

Alors, la correction :

Code:
                                                                 
    mov eax, 0x00007c00                                             
    mov ds, eax                                                     
    mov es, eax                                                     
    mov eax, 0x80000                                                 
    mov ss, eax                                                     
    mov esp, 0x8F000    ; stack de 0x8F000 -> 0x80000               
                                                                   
; affiche un msg                                                   
    mov si, msgDebut                                               
    call afficher                                                   
                                                                   
                                                                   
end:                                                               
    jmp end                                                         
                                                                   
                                                                   
;--- Variables ---                                                 
    msgDebut db "Hello world !", 13, 10, 0                         
;-----------------                                                 
                                                                   
;---------------------------------------------------------         
; Synopsis: Affiche une chaine de caracteres se terminant par 0x0   
; Entree:   DS:SI -> pointe sur la chaine a afficher               
;---------------------------------------------------------         
afficher:                                                           
    push ax                                                         
    push bx                                                         
.debut:                                                             
    lodsb         ; ds:si -> al                                     
    cmp al, 0     ; fin chaine ?                                   
    jz .fin                                                         
    mov ah, 0x0E  ; appel au service 0x0e, int 0x10 du bios         
    mov bx, 0x07  ; bx -> attribut, al -> caractere ascii           
    int 0x10                                                       
    jmp .debut                                                     
                                                                   
.fin:                                                               
    pop bx                                                         
    pop ax                                                         
    ret                                                             
                                                                   
;--- NOP jusqu'a 510 ---                                           
    times 510-($-$$) db 144                                         
    dw 0xAA55                                                       


Lorsque je le compilais, nasm me faisait remarquer un problème d'espace pour les données, donc j'ai remplacé les registres 16b par des 32 (e-), et cela a résolu mon problème
Journalisée

Toujours repousser ses limites c'est bien. Le faire avec méthode, c'est mieux.
DarK-CrasH

Profil challenge

Classement : 3019/54440

Membre Junior
**
Hors ligne Hors ligne
Messages: 79


Voir le profil
« #10 le: 11 Août 2012 à 22:24:48 »

Maintenant si quelqu'un a des conseil pour coder un noyau.. ?!


Merci à vous !
Journalisée

Toujours repousser ses limites c'est bien. Le faire avec méthode, c'est mieux.
Pages: [1]
  Imprimer  
 
Aller à: