ASSEMBLEUR ET EMULATEUR 8086 !

NoRabbit Messages postés 224 Date d'inscription samedi 26 juillet 2003 Statut Membre Dernière intervention 30 mars 2009 - 5 sept. 2003 à 12:10
DedeSurf Messages postés 156 Date d'inscription mardi 17 décembre 2002 Statut Membre Dernière intervention 23 novembre 2011 - 2 juin 2005 à 23:50
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/8457-assembleur-et-emulateur-8086

DedeSurf Messages postés 156 Date d'inscription mardi 17 décembre 2002 Statut Membre Dernière intervention 23 novembre 2011
2 juin 2005 à 23:50
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
6 sept. 2003 à 19:30
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 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
6 sept. 2003 à 15:35
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
6 sept. 2003 à 13:20
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
5 sept. 2003 à 20:18
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é)
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
5 sept. 2003 à 19:54
Si je peut me permettre qlq commentaire je dirait tout d'abord
que ton emulateur n'en ai pas un ... car pour les interruption tu ne fait rien d'autre que d'interpreter les effets de l'interruption, en principe
tu doit charger en memoire la zone de bios pour lire les veteur d'interruption et recolter le code (je sait pas si je suis bien clair la ? lol)

ensuite si je peut te donner un conseil pour l'assembleur, il faudrait que tu construise un arbre ou une collection d'action a faire puis lors d'une deuxieme passe tu lit les label et les offset de variable et enfin
tu ecris ton prog ... j'explique

tu fait une premiere passe du texte et tu rencontre l'instruction suivante :

MOV AX, Var1

tu ajoute dans ta collection d'action une action de type
MOV
auquel tu ajoute 2 paramettres
premier : de type registre 16 bits
deuxieme : de type memoire (label) 16 bits
tu luit applique le code hexa suivant : A10000 (4 0 car tu ne sait pas encore l'adresse de la variable)
puis lors d'une deuxieme passe une fois que toutes les actions sont identifiées tu peut changer les 4 0 par l'offset

puis en dernier tu ecrit le exe ou com

bref c'est un bon debut mais je crois que tu est bien partis pour réécrir une fois de plus toute la base !

(et arretez de dire que l'on ne peut pas faire de compilateur en vb c'est de la connerie :-Z)

by@
Tilois Messages postés 721 Date d'inscription dimanche 10 juin 2001 Statut Membre Dernière intervention 27 mars 2011 7
5 sept. 2003 à 16:44
tu t'attaques a un énorme morceau la... Par contre c'est passionant ... dis pas que ca n'as pas d'avenir serieux: ds la vie quand on veut on peut !!
NoRabbit Messages postés 224 Date d'inscription samedi 26 juillet 2003 Statut Membre Dernière intervention 30 mars 2009
5 sept. 2003 à 12:10
je n'ai pas encore regardé, je n'ai pas trop le temps pour le moment, mais ça m'intéresse énormément.
je l'ai down, je te dirai quoi plus tard.
Rejoignez-nous