Ammorce.asm

Soyez le premier à donner votre avis sur cette source.

Snippet vu 2 616 fois - Téléchargée 15 fois

Contenu du snippet

secteur boot principale: ammorce.asm simple en 16 bites chargent un fichier programme.com deux binaires compilables avec nasm en .img
pour être booter sur des processeur 8086,80286,80386

Source / Exemple :


org 0x0000 ; Adresse de dÈbut bootloader

	jmp 0x07C0:debut ; On est chargÈ dans le segment 0x07C0
debut:
	; Met les segments utiles au segment de code courant
	mov ax, cs
	mov ds, ax
	call detect_cpu

initialise_disque: ; Initialise le lecteur de disque
	xor ax, ax
	int 0x13
	jc initialise_disque; En cas d'erreur on recommence (sinon, de toute faÁon, on ne peut rien faire)

lire:
	mov ax, 0x1000 ; ES:BX = 1000:0000
	xor bx, bx
	mov es, ax
	mov ah, 2 ; Fonction 0x02 : chargement mÈmoire
	mov al, 6 ; On s'arrÍte au secteur n∞ 6
	xor ch, ch ; Premier cylindre (n∞ 0)
	mov cl, 2 ; Premier secteur (porte le n∞ 2, le n∞ 1, on est dedans, et le n∞ 0 n'existe pas)
	; Ca fait donc 5 secteurs
	xor dh, dh ; TÍte de lecture n∞ 0
	; Toujours pas d'identifiant de disque, c'est toujours le mÍme.
	int 0x13 ; Lit !
	jc lire ; En cas d'erreur, on recommence
	mov si, sautNoyau ; Un petit message pour rassurer les troupes.
	call affiche_chaine
	jmp 0x1000:0000 ; Et on donne la main au programme que nous venons de charger

detect_cpu:
	mov si, processormsg ; Dit ‡ l' utilisateur ce qu'on est en train de faire
	call affiche_chaine

	mov si, proc8086 ; De base, on considËre qu'il s'agit d'un 8086
	pushf ; sauvegarde les valeurs originales des drapeaux

	; teste si un 8088/8086 est prÈsent (les bits 12-15 sont ‡ 1)
	xor ah, ah ; Met les bits 12-15 ‡ 0
	call test_drapeaux
	cmp ah, 0xF0
	je finDetectCpu ; 8088/8086 dÈtectÈ

	mov si, proc286 ; On considËre qu'il s'agit d'un 286
	; teste si un 286 est prÈsent (les bits 12-15 sont effacÈs)
	mov ah, 0xF0 ; Met les bits 12-15 ‡ 1
	call test_drapeaux
	jz finDetectCpu ; 286 dÈtectÈ

	mov si, proc386 ; aucun 8088/8086 ou 286, donc c' est un 386 ou plus
finDetectCpu:
	popf ; restaure les valeurs originales des flags	
	call affiche_chaine
	ret

test_drapeaux:
	push ax ; copie AX dans la pile
	popf ; RÈcupËre AX en tant que registre de drapeaux. Les bits 12-15 sont initialisÈs pour le test
	pushf ; Remet le registre de drapeaux sur la pile
	pop ax ; Les drapeaux sont mis dans AX pour analyse
	and ah, 0xF0 ; Ne garde que les bits 12-15
	ret

affiche_chaine:
	push ax
	push bx
	push cx
	push dx
	xor bh, bh; RAZ de bh, qui stocke la page d'affichage
	mov ah, 0x03
	int 0x10; appel de l'interruption BIOS qui donne la position du curseur, stockÈe dans dx
	mov cx, 1; nombre de fois o˘ l'on va afficher un caractËre
affiche_suivant:
	lodsb
	or al, al;on compare al ‡ zÈro pour s'arrÍter
	jz fin_affiche_suivant
	cmp al, 13
	je nouvelle_ligne
	mov ah, 0x0A;on affiche le caractËre courant cx fois
	int 0x10
	inc dl; on passe ‡ la colonne suivante pour la position du curseur
	cmp dl, 80
	jne positionne_curseur
nouvelle_ligne:
	inc dh; on passe ‡ la ligne suivante
	xor dl, dl; colonne 0
positionne_curseur:
	mov ah, 0x02;on positionne le curseur
	int 0x10
	jmp affiche_suivant
fin_affiche_suivant:
	pop dx
	pop cx
	pop bx
	pop ax
	ret
;fin de affiche_chaine

proc8086: db '8086', 13, 0
proc286: db '286', 13, 0
proc386: db '386', 13, 0
processormsg: db 'Test du processeur : ', 0
sautNoyau: db 'Saut au noyau', 13, 0
times 510-($-$$) db 0
dw 0xAA55

Conclusion :


Sur bochs le system démarre initialise le sorte de noyau:
NB: pour compiler ammorce.asm avec nasm taper : nasm -o ammorce.com ammorce.asm
pour compiler programme.asm avec nasm taper : nasm -o programme.com programme.asm
pour compiler amorce.com et programme.com avec nasm taper: copy ammorce.com/b+programme.com/B disk.img /Y

A voir également

Ajouter un commentaire

Commentaire

cs_patatalo
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1 -
Salut,

Pour commencer, l'adresse d'origine du programme d'amorçage est 0x7C00 et non 0.

initialise_disque: ; Initialise le lecteur de disque
xor ax, ax
int 0x13
jc initialise_disque; En cas d'erreur on recommence (sinon, de toute faÁon, on ne peut rien faire)

Le problème est que s'il y a un problème disque, personne n'en saura rien et le PC bloquera. Il faut générer un compteur qui testera n fois et affichera un message d'erreur en cas d'echec.

Niveau expert ? Mouais bof.

@++

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (aminadaou)