ASM: Conversion ascii > hexa > decimal - Programmation
Marsh Posté le 30-01-2002 à 19:11:36
Angelicca a écrit a écrit : Personne ne prog en asm ? |
Pas moi
Marsh Posté le 30-01-2002 à 19:13:15
Très difficile l'ASM.... bon courage et mes respects !
Marsh Posté le 30-01-2002 à 19:15:05
PompUsine a écrit a écrit : Très difficile l'ASM.... bon courage et mes respects ! |
disons que c'est plus un jeu qu'autre chose, c'est amusant de manier des registres
Marsh Posté le 30-01-2002 à 19:15:08
ReplyMarsh Posté le 30-01-2002 à 19:16:36
Parceque l'ASM en fait c'est ZE langage...
Tu peux tout faire en ASM, ce que tu peux faire en JAVA, C, C++... tu peux le faire en ASM, mais tu ne peux pas forcément faire l'inverse
Marsh Posté le 30-01-2002 à 19:18:35
Bruce a écrit a écrit : Pkoi en asm ? |
comme ça en fait ,disons que mon prog est en une partie en C++, et une autre partie en asm ( avec asm {} ) et je suis interessé par ce genre de conversion de bas niveau capable d'etre effectuées en asm ...
voila
Marsh Posté le 30-01-2002 à 19:19:46
PompUsine a écrit a écrit : Parceque l'ASM en fait c'est ZE langage... Tu peux tout faire en ASM, ce que tu peux faire en JAVA, C, C++... tu peux le faire en ASM, mais tu ne peux pas forcément faire l'inverse |
Bien en fait moi je dit le contraire, en C++ tu peux incorporer du ASM donc tu peux tout faire ce que ASM peut faire et encore plus
Marsh Posté le 30-01-2002 à 19:20:51
pour l'hexa en binaire pur, tu prends chaque chiffre hexa
de gauche à droite
registre final<-0
pour chaque chiffre
shift registre final 4 bits vers la gauche
si <= '9' (0 à 9)
registre temporaire<-chiffre-'0'
sinon ('A' à 'F' ou 'a' à 'f'
si chiffre > 'F'
chiffre = chiffre + 'A' - 'a' (conversions caps)
finsi
registre temporaire<-chiffre-'A'+ 10
finsi
registre final <- reg final OU LOGIQUE reg temporaire
fin pour
valà
[edtdd]--Message édité par bjone--[/edtdd]
Marsh Posté le 30-01-2002 à 19:24:31
l'asm est très simple et basique....
ça colle avec l'algo....
quand on sait faire de l'asm, on est capable de voir les problèmes avec beaucoup plus de simplicité...
c ce qui manque à beaucoup de programmeurs la simplicité...
Marsh Posté le 30-01-2002 à 19:32:17
en asm x86 ça donnerai un truc dans ce gout: (version code de warrior pas décidé )
esi <= chaine de caractère
ecx <= longueur
xor eax,eax
xor ebx,ebx
lp:
shl eax,4
mov bl,[esi]
cmp bl,'9'
ja AZrange
sub bl,'0'
jmp ok
AZrange:
cmp bl,'Z'
jbe AZOk
add bl,'A'-'a'
AZOk:
add bl,10-'A'
ok:
or eax,ebx
inc esi
dec ecx
jnz lp
eax <= valeur
Marsh Posté le 30-01-2002 à 19:45:49
reg src <= valeur
tant que reg src > 9
reg src ; reg reste <- reg src/10
ajouter reg reste + '0' à la chaine
et avancer dans la chaine vers la gauche
fin tant que
ajouter reg src + '0' à la chaine
heu c ça ?
putainnnnnnnnnn je dois réfléchir
donc la valeur 100
reg src <- 100
passe 1
div 10
reg src <- 10
reste 0
chaine=> 0
passe 2
div 10
reg src <- 1
reste 0
chaine => 00
fin src < 10
chaine => 100
donc en asm:
edi : pointe sur la "fin" d'un tableau d'au moins 14 caractères
eax <- valeur src
mov ebx,10
lp:
cmp eax,9
ja fini
xor edx,edx
div ebx
(division de edx:eax par ebx, 64 bits/32bits => 32 bits)
add dl,'0'
mov [edi],dl
inc edi
jmp lp
fini:
add al,'0'
mov [edi],al
vala...
à toi de rajouter la gestion du signe si tu veux, et de corriger si j'ai marqué des conneries...
[edtdd]--Message édité par bjone--[/edtdd]
Marsh Posté le 30-01-2002 à 20:06:10
c vrai que pris comme ça c pas lisible
enfin une petit révision..... ça fait po de mol
Marsh Posté le 31-01-2002 à 20:58:55
Ca me semble plus complique que ca la conversion hexa -> numerique surtout si la chaine hexa peut etre infini... pour ascii hexa en asm par contre c'est bcp plus facile
char *Ascii;
char *Hex;
Ascii=new char[256];
Hex=new char[256];
sprintf(Ascii,"angel" );
__asm
{
// Ascii pointeur sur car, chaine terminée par 0
// Hex pointeur sur car, chaine terminée par 0
mov edx,Ascii
mov ebx,Hex
whileptpas0:
mov cl,[edx]
cmp cl,0
je FinWhile
//cl=Ascii[i]>>4
sar cl,4
//if(c>9)
cmp cl,9
jle Infa9
add cl,37h //'A'-10
jmp Suite
Infa9:
add cl,30h // '0'
Suite:
mov [ebx],cl
inc ebx
mov cl,[edx]
//c=Ascii[i]& 0fh
and cl,0fh
cmp cl,9
jle Infa9_2
add cl,37h //'A'-10
jmp Suite_2
Infa9_2:
add cl,30h // '0'
Suite_2:
mov [ebx],cl
inc ebx
inc edx
jmp whileptpas0
FinWhile:
mov byte ptr[ebx],0 // 0 final sur la chaine Hex
}
printf("%s\n",Hex);
delete []Ascii;
delete []Hex;
Marsh Posté le 31-01-2002 à 22:26:28
aïe aïe aïe ... je suis content d'être né 20 ans plus tard et de pas avoir eu tout ca à me patoger !!
vive le java !!!!!
[edtdd]--Message édité par benou--[/edtdd]
Marsh Posté le 31-01-2002 à 22:59:01
c clair c rapidement illisible....
c pour ça qui faut garder l'asm pour les routines critiques en temps...
Marsh Posté le 30-01-2002 à 17:29:47
bonjour,
qqn pourrait m'explique comment convertir en asm une suite de caractéres ASCII en hexa puis en décimal ? Je vous donne un exemple :
angel en hexa donne 616E67656Ch et 616E67656Ch en décimal donne 418464097644, je voudrai donc obtenir cette procédure en asm pour l'insérer ensuite dans mon proggie mais je ne sais pas comment faire ... de plus je souhaiterai savoir si cela est valable pour x caractéres ? (x == l'infini)
Merci à vous !