Afficher une chaine de caractere au boot

Afficher une chaine de caractere au boot - ASM - Programmation

Marsh Posté le 25-08-2006 à 15:12:26    

Bonjour à tous.
Je suis tout nouveau dans le monde de la programmation en asm, et je commence déjà à rencontrer quelque probleme :
j'ai codé un petit programme qui affiche un message et attend ensuite l'appuie sur une touche du clavier pour effectuer une action.
 
Mon but est qu'il soit autonome, donc j'utilise exclusivement des interruptions du BIOS.
 
Une fois compilé (j'utilise TASM) et linké, il s'execute trés bien sous windows.
 
Je l'ai copié sur le premier secteur d'une disquette pour qu'il se lance au boot, mais une fois lancé, il affiche des caracteres bizarre au lieu de mes phrases.
 
Je pense qu'il s'agit d'un probleme de segment ou d'offset mais je seche.
 
Quelqu'un peut m'aider ?
 
Mon code (je compile en .COM) :

Code :
  1. code segment use16
  2. assume cs:code
  3. org 100h
  4. debut:
  5. mov ax, cs   ;initialisation
  6. mov ds, ax
  7. mov es, ax
  8. ecrit macro text, long   ;macro pour récupérer la position du curseur et écrire à la suite
  9. mov ah, 03h
  10. mov bh, 0
  11. int 10h
  12. mov ah, 13h
  13. mov al, 1
  14. mov bx, 14
  15. mov cx, long
  16. lea bp, text
  17. int 10h
  18. endm
  19. ecrit message, 49
  20. boucle:
  21. mov ah, 00h   ;boucle pour tester la touche du clavier enfoncée
  22. int 16h
  23. cmp al, ' '
  24. jz fin   ;si on appuie sur ESPACE, le programme va à la fin, sinon il affiche "Fonction inconnu"
  25. ecrit erreur, 19
  26. jmp boucle
  27. fin:
  28. ecrit fini, 36
  29. mov ah, 00h
  30. int 16h
  31. int 19h
  32. message db "Bonjour",10,10,13,"Que faire ?",10,13,"- SPACE pour redemarrer",10,10,13
  33. erreur db "Fonction inconnue",10,13
  34. fini db "Merci d'avoir utilise ce programme",10,13
  35. code ends
  36. end debut


 
Merci.


Message édité par ganply le 25-08-2006 à 18:02:30
Reply

Marsh Posté le 25-08-2006 à 15:12:26   

Reply

Marsh Posté le 27-08-2006 à 11:23:02    

C'est bon j'ai trouvé, pour les intéressés : http://www.developpez.net/forums/s [...] p?t=201652

Reply

Marsh Posté le 27-08-2006 à 14:04:31    

tu sais, la programmation 16 bits avec interruptions DOS, segments, et tout, c'est dépassé depuis un bon moment.... :sarcastic:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 27-08-2006 à 17:54:35    

Je sais, mais c'est toujours intéressant de l'apprendre.

Reply

Marsh Posté le 27-08-2006 à 18:06:54    

ah ? si tu le dis... je vois pas ce qu'il y a d'intéressant à apprendre un truc qui ne te serviras jamais, mais bon...


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 04-09-2006 à 12:18:39    

Bonjour
Sur le 386, au démarrage, le processeur est en mode réel 16 bits. Il est donc nécessaire d'écrire un bout de code pour déclarer la GDT et l'IDT voir autre choses et passer ensuite en mode 32 bits.
Il se peut que depuis la méthode ait changé.
Si on n'a pas de changement de contexte à faire et que l'on soit déjà sous un système d'exploitation, la programmation 16 bits n'a pas grand intéret sauf pour les masochistes, d'autant plus qu'il est possible d'utiliser l'adressage vers du transfert 8 ou 16 bits si on veut en mode protégé.

Reply

Marsh Posté le 04-09-2006 à 13:12:05    

Harkonnen a écrit :

ah ? si tu le dis... je vois pas ce qu'il y a d'intéressant à apprendre un truc qui ne te serviras jamais, mais bon...


 
faire un tweaker intégré au bios :D

Reply

Marsh Posté le 04-10-2006 à 13:23:18    

si tu veut que ton programme s'execute au boot d'une machine, tu dois reasembler ton programme
avec une origine a 0
il marche sous dos car dos cree 100h octet avant de charger ton programme (contenant diverse choses... pour plus de doc, c'est la zone PSP, c'est le pourquoi du org 100h au debut des .COM)
et ton assembleur ajoute 100h a DS, ce qui fausse l'acces a tes donnees lorsqu'il est charger par le BIOS(le BOIS connait pas le PSP!! :-p)
si tu veux avoir une compatibiliter boot-dos tu pourrais par exemble inserer un caractere de signature dans ton programme et le comparer en dur dans ton programme, ainsi si la signature n'est pas verifier (donc si DS est decaler de 100h) tu pourras ratraper l'erreur par simple soustraction de DS.
 
m'enfin ce n'est qu'une suggestion personnel dans le cas ou ton programme n'est pas trop gros.
car un bootsecteur ne fait QUE 512 octets

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed