mardi 12 août 2008

Soyons des fous!!!

... Et développons sous Nasm
=> http://nasm.sourceforge.net/

Téléchargement:

- Windoze
- Linuske

Un peu de supayr mizik, ca peut aider
http://www.deezer.com/#music/playlist/9927274/1201024

Et on commence par un pitit programme (COM) DOS:


[ORG 0x0100]
; On décale notre offset de 0x100. pourquoi? on est dans un programme COM (donc pas un EXE). DONC, les 256 premiers octets sont réservés au PSP
(Program Segment Prefix). Il contient certaines infos relatives au programme parfois utiles au programmeur, et vu que je suis gentil, certaines sont fournies dans un tableau un peu plus bas ;)

[SEGMENT .data]
message db 'hello world',10,13,'$'
; Bin la... on déclare une variable ... elle s'apelle message, contient 'hello world', la suite sont un retour a la ligne (10 13) et la caractère de terminaison de chaine ($). Ca correspond à \n\0 en C, quoi.

[SEGMENT .text]
call affichage
; On apelle la routine affichage

call fin
; Puis la routine fin

affichage:
mov dx,message
; On met le pointeur sur notre chaine de caractère dans le registre DX

mov ah,0x09
; On met 0x09 dans ax, 9 est le numéro de la fonction de l’interruption dans 21h (car l'interruption 21h fournit plusieurs fonctions :]) qui écrit une chaîne de caractères à l’écran.
; Pitit rappel:
; EAX : partie basse 32 bits (bits 0 à 31) de RAX.
; AX : partie basse 16 bits (bits 0 à 15) de EAX.
; AH : partie haute 8 bits (bits 8 à 15) de AX.
; AL : partie basse 8 bits (bit 0 à 7) de AX.
; DONC un mov eax,0x09 ou un mov ax,0x09 auraient marché aussi

int 0x21
; On appelle l'interruption 0x21 (Liste d'interruptions un peu + loin)

ret
; On rend la main a l'appellant (return en C)

fin:
mov ax,0x4c
; On met 0x4c dans ax, 0x4c est le numéro de la fonction qui sert à quitter le programme
int 0x21
; On appelle l'interruption 0x21


Petite table des Interruptions DOS, non-exhaustive et reprise des cours de Haypo:


* 01h: Lancement d'un programme en mode pas-à-pas (permet de le débogueur).
* 02h: Interruption non masquable.
* 03h: Erreur de rupture.
* 04h: Erreur de dépassement (par calcul, exemple : "mov al, 200 ; add al,140" -> 340 > 255 !!!).
* 05h "Imprime écran", imprime une copie de l'écran en mode texte.
* 08h: Horloge tournant à 18.6 clics/seconde.
* 09h: Lecture du clavier. La touche est codée avec un 'code clavier' (scan code en anglais) traduit en code standart ASCII par l'interruption 16h.
* 0Bh: Gestion du port COM2.
* 0Ch: Gestion du port COM1.
* 10h: Gestion de la carte vidéo.
* 11h : Liste de configuration (mémoire, nombre de ports COM, co-processeur, ...).
* 12h: Taille de la mémoire basse (640 Ko maximum).
* 13h: Gestion des différents disques.
* 14h: Gestion de l'interface série (ports COM, voir les interruptions 0Bh et 0Ch).
* 15h: Manette de jeu, cassette et TopView.
* 16h: Conversion du code de la touche (lu par l'interruption 09h) en code standart ASCII.
* 17h: Gestion de l'imprimante.
* 18h: Rom BASIC.
* 19h: Rountine de chargement du DOS.
* 1Ah: Gestion de l'heure réelle.
* 1Bh: Surveille la pression de la combinaison de touche 'CTRL + C'.
* 1Ch: Chronomètre clic/clic à la vitesse de l'horloge 08h : 18.6 Hz. Sa valeur est stockée à l'emplacement 0040h: 0060h.
* 1Dh: La table d'initialisation vidéo.
* 1Eh: La table de paramètre des disquettes.
* 1Fh: La table des caractères graphiques.
* 20h: L'interruption DOS : Fin d'un programme au format COM (le format EXE est largement plus répendu aujourd'hui).
* 21h: L'interruption DOS : Fonctions universelles (disque dur, horloge, ...).
* 22h: L'interruption DOS : Adresse de fin de processus.
* 23h: L'interruption DOS : Surveille CTRL + PAUSE (ou CTRL + BREAK).
* 24h: L'interruption DOS : Erreur fatale d'un vecteur d'interruption.
* 25h: L'interruption DOS : Lecture directe d'un disque.
* 26h: L'interruption DOS : Ecriture directe sur un disque.
* 27h: L'interruption DOS : Programmes résidents.
* 28h: Fin d'un programme restant résidant en mémoire.
* 2Fh: Interruption pour plusieurs sous programmes. Gestion du réseau, driver CD-Rom MSCDEX, ...


Il y en a apparement une liste plus fournie ici: http://www.delorie.com/djgpp/doc/rbinter/

Regardons maintenant le schema simplifié du PSP:



Ben maintenant, on à écrit un programme en assembleur Nasm, va peut être finir par falloir... l'assembler justement... Comment on fait? On cherche :]



So, pour assembler, on va tout simplement faire

nasm programme1.asm -o programme1.com

Wahou, ca y est, je pense que maintenant nous sommes de vrais fous! La suite un de ces 4 :p
Byebye

Aucun commentaire: