Assembleur et emulateur 8086 !

Soyez le premier à donner votre avis sur cette source.

Vue 16 985 fois - Téléchargée 1 207 fois

Description

My86Ware contient

My86Asm : un assembleur pour 8086 qui génère des fichiers .com que vous pouvez éxécuter directement sous windows

My86Emul : un émulateur de 8086 qui permet aussi de lancer les fichiers .com générés par My86Asm (et d'autres)

et un peu de documentation

Mais ATTENTION : aucun de ces deux programmes ne sont finis : l'émulateur pour le moment ne peut émuler que
Fonction H9 de l'interruption H21 du DOS
Fonction H7 de l'interruption H21 du DOS
Fonction H7 de l'interruption H21 du DOS
Fonction H4c de l'interruption H21 du DOS
les registres ah,ax,dx

l'assembleur est un peu plus avancé, mais pas tellement en fait....

J'avais déja posté le début de l'assembleur mais j'ai totalement changé la syntaxe, et aussi un peu modifié la structure pour qu'il soit plus facile a développer et a débugger.

Source / Exemple :


'le zip... si non un exemple de programme assembleur que My86Asm sait 'assembler et my86Emul sait emuler :

';démo01 de My86
';(C)2003 orisa

'	;Affichage dun message de bienvenue
'	mov	#ah,	h9
'	mov	#dx,	@hello 
'	int	h21

'	;Affichage dun message de suite
'	mov	#ah,	h9
'	mov	#dx,	@suite 
'	int	h21
	
'	;attente de carractère
'	mov	#ah,	h7
'	int	h21

'	;Affichage dun message de suite
'	mov	#ah,h9
'	mov	#dx,@suite2 
'	int	h21
	
'	;attente de carractère
'	mov	#ah,h1
'	int	h21

'	;affichage du message de fin
'        mov     #ah,h9
'        mov     #dx,@fin
'        int     h21

'	;rien, juste pour montrer que ça marche
'	nope

'	;fin du programme
'        mov     #ax,h4c
'        int     h21

'	;les données ha,hd correspond à 10,13 en hexa :)
'	.db hello	ha,hd,'Hello, world!',ha,hd,'$'
'	.db Suite	'Appuyez sur une touche pour continuer sans echo!',ha,hd,'$'
'	.db Suite2	'Appuyez sur une touche pour continuer avec echo!',ha,hd,'$'
'	.db fin		ha,hd,'Voila, c',h27,'est fini!',ha,hd,'$';h27 c'est ' en asci

'lol ça le fait :)

Conclusion :


Je vise a assembler et a émuler le 8086 uniquement, pas au dessus (c'est deja assez de boulot comme ça, lol)

Dites moi ce que vous pensez mais ne ralez pas après l'inutilitée de cette source : C'est EVIDENT qu'un assembleur en VB n'a aucun avenir _serieux_ et c'est vrai aussi qu'un émulateur en vb, c'est encore plus capilotracté, mais après tout, ça sert a apprendre et a comprendre, et ça aussi c'est interessant ! :)

voila, A+ et comme d'hab'
http://www.rature.com

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

DedeSurf
Messages postés
159
Date d'inscription
mardi 17 décembre 2002
Statut
Membre
Dernière intervention
23 novembre 2011
-
Vous me faite plané les mecs !!!
Je vien de plusieurs sources et EBArtSoft vous doze tous un par un, il vous explose et vous marcher tous, certe a première vue il a l'aire doué en la matière ... mais il n'en reste que des commentaire ki me sont utile a ... bien rire ;)

Bon trève de plaisanterie je sui fatigué i fo k jaille dormir o taff lol

Tchao

Thyraël
cs_orisa
Messages postés
38
Date d'inscription
lundi 18 mars 2002
Statut
Membre
Dernière intervention
29 octobre 2003
-
merci pour ces détails : j'ai mieux compris certaines choses que tu essayant de m'expliquer.

Pour l'émulateur, on va dire que je développe un simulateur, le terme est plus adapté.

Pour l'assembleur : la fonction move je vais de toute façon la réécrire puisque il suffit d'aditionner b0 au numéro du registre. pour les autres cas que tu soulève, tu as raison... je n'avais pas réfléchi a ça... faudra que je voie.

pour le jump ce n'est pas un gros problème par contre une soustraction me donne la distance, par contre pour la suite du travail sur le tableau ce ne sera certes pas particulièrement obtimisé :)

en tout cas merci pour tes conseils, ça me donne des nouvelles pistes de réflexions ! a+
cs_EBArtSoft
Messages postés
4531
Date d'inscription
dimanche 29 septembre 2002
Statut
Modérateur
Dernière intervention
22 avril 2019
5 -
ok qlq precisions...

d'abord sur la methode prenons ta methode MOV

- separe les instructions "SPLIT"
- teste le mot clef "SELECT CASE"
- lit les arguments "SELECT CASE" & "MID"
- puis tu ajoute ton code

tu gere independament les 8 et 16 bits c'est bien mais...
un probleme va se poser lorsque que tu va tomber sur une instruction
du type MOV AX,AH ou bien encore MOV BYTE PTR [BX],AX
ou bien pire encore MOV BYTE PTR ES:[SI+02],10

comment vas tu faire ?
vas tu gerer tout les cas un par un ?

deuxieme interrogation :
sur une instruction on ne peu plus simple comme ADD AX,10 comment vas tu faire pour gerer les multiples possibilités qui s'offre a toi comme d'utiliser l'opcode 01, 03 ou encore 05 ? sachat que pour ax l'op 05 utilise moin de cycle !

troisieme interrogation :
pour un simple saut JMP tu a deux possibilité utiliser EB pour
un saut de moin de 128 octets et E9 pour un saut superieur
a 127 sachant que EB utilise moin de cycle ... mais comment
vas tu connaitre la distance qui separe deux label ou instruction
si tu a deja ecris ton code ?

bref je pense que ce genre de question se poserons d'elle meme quand tu aura plus avancé

Ensuite pour ce qui est de ton emulateur le probleme (de taille !!!)
vient du faite que tu n'emule rien ! je veus dire par la que pour
faire un emulateur il faudrait que tu gere TOUT les registre AX (AH|AL) BX etc..
mais aussi les segments DS CS SS ES, les pointeurs SI DI IP SP BP, les flags
sous forme de bits CF PF AF (et notement IF flags d'interruption) etc..
ou bien d'un registre FLAG 16 bits ET LE PLUS COMPLEXE gerer la memoire
de 0000:0000 a FFFF:FFFF (par paragraph de 16K) dans un tableau ou tu aura
prealablement charger une image du bios

Cela veut dire que dans ton emulateur lorsque l'on rencontre un INT 21h
IP pointe sur la memoire contenu a l'adresse du vecteur d'interruption 21h
(que tu trouvre si mes souvenir sont bon au allentour de 0000:0040 + n°veteur*4)
la pile s'incremente pour reçevoir l'ip de retour etc..etc...

ce n'est pas si simple .....

car je ne t'ai pas encore parler du Hardware pour emuler la console
de l'espace video B800 etc...

bref ça fait deja un gros commentaire tout ça !
je te souhaite quand meme de reussir dans ta tache si tu continue dans cette voie ! lol

@+
cs_orisa
Messages postés
38
Date d'inscription
lundi 18 mars 2002
Statut
Membre
Dernière intervention
29 octobre 2003
-
Pour l'assembleur, ce que tu propose n'est pas très diférent de ce que je fais : première passe j'écris l'exécutable avec le code A10000 et je remplis un tableau d'endroit a remplir, puis je parcours ce tableau en fesant les remplacements, puis j'écris le fichier. non je n'ai pas l'intention de changer mon algo, il marche, et c'est le principal.

Bon ce qu'on va dire c'est que ce n'est pas un émulateur mais un simulateur... ava comme ça ? lol ! cela étant dis je ne sais pas si j'ai bien compris ce que tu explique mais si c'est ce que j'ai compris, un émulateur ne pourrait tourner que sur la machine qu'il émule (comme c'est débile je pense que je n'ai pas tout compris... lol) si tu peux me donner des détails...

A+
Proger
Messages postés
248
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
19 décembre 2008
-
Ya pas a dire, EBArtSoft y touche :) heu... non attend c pas le bon commentaire... ah oui, c'est celui-là :
exécuter des routines assembleur sous vb :
Declare Function CallWindowProc Lib "user32" etc...

ReDim ASMCode(10) As Byte
'ca commence par mov ecx, [esp + 4] ... ...
ASMCode(0) = &H8B
ASMCode(1) = &H4C
ASMCode(2) = &H24
ASMCode(3) = &H4
ASMCode(4) = &H8B
ASMCode(5) = &H44
ASMCode(6) = &HD
ASMCode(7) = &H0
ASMCode(8) = &HC2
ASMCode(9) = &H4
ASMCode(10) = &H0
Dim GetAlignedCodeStart As Long, j As Long
j = VarPtr(ASMCode(0))
GetAlignedCodeStart = j + (15 - (j - 1) Mod 16)
If (15 - (j - 1) Mod 16) = 0 Then
GetAlignedCodeStart = GetAlignedCodeStart + 16
End If
CallASM = CallWindowProc(GetAlignedCodeStart, 0, 0, 0, 0)

Ca peut servir...
(ps : trouvé sur psc et non testé)

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.