jeudi 16 août 2007

Constructor, destructor, procedure : Quels différences ?

C’était pour dire….euh…rien du tout (?)

En fait le constructeur de TObject ne fait rien....ou presque...

constructor TObject.Create;
begin
end;

le destructeur non plus...

destructor TObject.Destroy;
begin
end;

Rôle de NewInstance et FreeInstance

En fait le mots-clé constructor va obliger le compilateur à rajouter un appel à la méthode NewInstance au moment du begin. C'est ce qui différencie le constructeur d'une bête procédure.
Sur le même principe, le mot clé destructor va provoquer un appel à FreeInstance.

Comment fonctionne NewInstance ?

Là encore il s'agit de quelques chose de très simple : il va d'abord récupérer la taille en octets
de l'instance d'une classe grâce à la méthode InstanceSize, puis va appeler un GetMem pour allouer l'espace mémoire auprès du système. Ensuite un appel à InitInstance va initialiser les octets alloué à des valeurs par défaut.
La valeur retournée par InstanceSize est définie au moment de la compilation.
Dans le cas de TObject, la taille en mémoire d'une instance est 4 octets. Elle permet de stocker un pointeur vers la classe associée à l'instance.

Comment fonctionne FreeInstance ?

Il s'agit d'un bête appel à FreeMem.


Hello World OS

Le but de cet article est de présenter comment coder un petit hello world au boot d'un PC.

Rappels sur le démarrage d'un PC


  • Le premier programme qui démarre est le bios
  • Il effectue des contrôles sur le PC
  • Il initialise les périphériques
  • Il charge le secteur de boot et il l'éxécute
Le secteur de boot

Rappel : un programme en assembleur se présente sous la forme d'une suite d'octets

Un secteur de boot contient :

  • Des informations donnant les caractéristiques du disque
  • Les octets du programme de secteurs de boot
  • 2 octets magiques indiquant que le disque est bootable
  • Le seul secteur chargé automatiquement par le bios
  • Il stocke moins de 512 octets pour le programme
Le source

[BITS 16]

[ORG 0x0]

; initialisation des segments en 0x07C0
mov ax,0x07C0
mov ds,ax
mov es,ax
mov ax,0x8000
mov ss,ax
mov sp, 0xf000

;--- les données ---
msgDebut db "Hello world OS is running ! ",13,10,0

; 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
; nombre magique : indique au pc que le secteur est bootable
dw 0xAA55