Tp 10: Un peu de DOS
La cross-compilation



L'objectif

Il est de vous montrer qu’il est possible d’écrire des programmes en assembleur sous Linux, pour MSDos. De plus vous constaterez que les appels systèmes ou les interruptions logicielles sont différentes selon le système d’exploitation que l’on utilise.

Remarque Il est possible qu'il ne fonctionne pas correctement sous Windows XP.

Le temps imparti

1h30

Le sujet

Nous verrons dans ce TP :

A faire

Afin de pouvoir tester correctement ce TP, on vous conseille de travailler sous Windows via SSH. La compilation sera faite sous Unix, son exécution se fera sous Windows. Pour exécuter votre programme sous Windows, vous aurez besoin d'une fenêtre console : Vous l'obtiendrez avec la commande CMD.

Dans un premier temps, nous allons réécrire le programme hello world du TP 1 (hello2.s) en version DOS, puis le programme first du TP 5. On pourra remarquer la différence de codage entre le retour à la ligne de Linux et de DOS.
Attention : Ce programme est écrit selon la norme Intel.
Saisir le programme suivant :

Hello2_dos.s
  1. text
  2. .globl _main
  3. .org 0x100 ! le programme débute à l'adresse 100H
  4. _main:
  5. ! Pose la question
  6. mov dx,#message
  7. mov ah,#9
  8. int 0x21 ! interruption dos
  9. !Retour au dos
  10. ret
  11. .data ! Segment de données
  12. message:
  13. .ascii " hello world ?"
  14. .byte 13,10
  15. .ascii "$"

Remarque : as86 et ld86 sont deux utilitaires qui permettent de générer du code x86 et non x386. Quand un PC démarre, c'est en mode réel. Quand on écrit une application purement DOS, elle doit être exécutée en mode réel (et non en mode protégé).
Pour ceux que ça intéresse, si vous allez fouiller dans les sources du noyau Linux, vous verrez qu'au début, il démarre en mode réel et que les sources sont compilés à l'aide de ces deux utilitaires.

Assembler ce source en tapant la commande suivante :

$ as86 -0 -a -w -o hello2_dos.o hello2_dos.s

On récupère donc un fichier objet hello2_dos.o.
Regarder la signification des options dans le man.

Faire l’édition des liens avec la commande :

$ ld86 -0 -s -o hello2_dos.img hello2_dos.o

On récupère un fichier image hello2_dos.img, qui n'est pas un fichier exécutable sous le SE Linux. Vérifier avec la commande Linux file.
Un fichier exécutable Linux, n’ayant pas le même format qu'un fichier exécutable MSDos, il va falloir le convertir. Pour cela, lancer la commande suivante :

$ dd if=hello2_dos.img of= hello2_dos.com bs=288 skip=1

Attention : L'extension .com du fichier est importante !
Regarder dans le man les options utilisées.
Que fait cette commande ?
Comparer la taille du fichier hello2 du TP 1 à celle de hello2_dos.com.

Vous pouvez naviguer dans la console MSDos comme sous Unix, avec la commande cd. Pour obtenir la liste des fichiers contenus dans un dossier, utilisez la commande dir.
Exécuter ce programme sous MSDos :

> hello2_dos

Constater qu’il fait la même chose que hello2 sous Linux.
À la ligne 12 de hello2_dos.s retirer l'une des valeurs 13 et 10 et recommencer les opérations ci-dessus.
Déterminer le rôle de ces deux codes.

Insérer après la ligne 8 le code suivant, et recommencer les opérations ci-dessus.

  1. ! Attente de la saisie d’une touche.
  2. mov ah,#1
  3. int 0x21 !interruption MSDos

Maintenant, nous allons voir que le programme first.s peut lui aussi être écrit en mode MSDOS.

First_dos.s
  1. text
  2. .globl _main
  3. .org 0x100
  4. _main:
  5. ! Pose la question
  6. mov dx ,#Question
  7. mov ah, #9
  8. int 0x21 ! interruption MSDos
  9. ! Attend la saisie d'un caractère dont le code ASCII sera retournée dans AL
  10. mov ah, #1
  11. int 0x21 ! interruption MSDos
  12. cmp al, #111 ! est-ce 'o' ?
  13. je oui !si oui, va à oui
  14. Pas_oui: ! c'est non
  15. mov dx,#Reponse1
  16. jmp Affiche
  17. Oui: ! c'est oui
  18. mov dx,#Reponse2
  19. Affiche:
  20. mov ah,#9
  21. int 0x21 ! interruption MSDos
  22. ret ! Retour au dos
  23. Question:
  24. .ascii "Avez-vous passe un bon week-end (O/N) ?"
  25. .byte 13,10
  26. .ascii "$"
  27. Reponse1:
  28. .ascii "Dommage pour vous ! J'en suis navre!"
  29. .byte 13,10
  30. .ascii "$"
  31. Reponse2:
  32. .ascii "Je suis content pour vous ! "
  33. .byte 13,10
  34. .ascii "$"

Retour à la liste des TP