NoRabbit
Messages postés224Date d'inscriptionsamedi 26 juillet 2003StatutMembreDernière intervention30 mars 2009
-
5 sept. 2003 à 12:10
DedeSurf
Messages postés156Date d'inscriptionmardi 17 décembre 2002StatutMembreDernière intervention23 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.
DedeSurf
Messages postés156Date d'inscriptionmardi 17 décembre 2002StatutMembreDernière intervention23 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és38Date d'inscriptionlundi 18 mars 2002StatutMembreDernière intervention29 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és4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 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és38Date d'inscriptionlundi 18 mars 2002StatutMembreDernière intervention29 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és248Date d'inscriptionvendredi 10 novembre 2000StatutMembreDernière intervention19 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és4525Date d'inscriptiondimanche 29 septembre 2002StatutModérateurDernière intervention22 avril 20199 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és721Date d'inscriptiondimanche 10 juin 2001StatutMembreDernière intervention27 mars 20117 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és224Date d'inscriptionsamedi 26 juillet 2003StatutMembreDernière intervention30 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.
2 juin 2005 à 23:50
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
6 sept. 2003 à 19:30
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+
6 sept. 2003 à 15:35
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
@+
6 sept. 2003 à 13:20
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+
5 sept. 2003 à 20:18
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é)
5 sept. 2003 à 19:54
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@
5 sept. 2003 à 16:44
5 sept. 2003 à 12:10
je l'ai down, je te dirai quoi plus tard.