|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Inscription : décembre 2006 Messages : 6 ![]() |
Bonjour tout le monde,
j'ai un autre problème avec un autre programme. J'explique : On met une chaîne de caractères (ex: "bonjour") et on doit faire en sorte qu'en sortie on ait "ruojnob", c'est-à-dire qu'on doit inverser la chaîne de caractères. J'ai fait ce programme mais je n'obtiens pas du tout ça. Quelqu'un pourrait me dire ce qui ne va pas ? Code :
|
||
|
|
00
|
|
|
#2 | ||
![]() ![]() ![]() |
Bonjour !
En fait, tu te compliques la vie en voulant utiliser uniquement le registre bx comme index : tu peux très bien utiliser également un registre d'index comme si. Ca pourrait donner quelque chose comme ceci : Code :
En changeant la valeur de bh, tu changes la valeur de bx pour la suite des opérations.
__________________
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell] |
||
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : octobre 2011 Messages : 1 ![]() |
et si la chaine etait de taille inconnue et qu on a un deja un macro qui nous donne la taille , comment faire ??
|
|
|
00
|
|
|
#4 |
|
Membre confirmé
![]() ![]() Inscription : octobre 2005 Messages : 173 ![]() |
Si la taille de la taille est inconnue,on la mesure (lstrlen..... +++)
Elle doit être >= 2 Le principe est simple. Un pointeur debut chaine Un pointeur en fin de chaine on charge le byte de debut mov al,byte ptr [registre pointeur] on charge le byte de fin on stocke le byte de debut a la fin on stocke le byte de fin au debut le pointeur de debut est incremente de +1 (inc) le pointeur de fin se decremente de 1 (dec) on verifie que les pointeurs ne sont pas égaux on recommence |
|
|
00
|
|
|
#5 |
|
Membre chevronné
![]() être humain Inscription : décembre 2007 Messages : 471 ![]() |
on peut aussi tester en premier que les pointeurs de fin et de debut ne sont pas egaux, en testant la taille du fichier.
le compteur est égal à la taille divisée par deux. si ce compteur est egal à 0, alors on termine la fonction. sinon, on continue l'index de fin est egal à (taille-1 + pointeur de chaine) l'index de debut est egal à (pointeur de chaine) loop_ici: lire AL dans fin, lire AH dans debut ecrire AL dans debut, ecrire AH dans fin incrementer debut decrementer fin loop_ici avec le compteur et c'est fini. et au final, on peut meme prendre les chaine de 0 ou 1 caractère. et le check d'erreur à lieu des le debut, ce qui economise des cycles. mais il faut penser qu'il serait judicieux de creer une fonction de copie de chaine, pour travailler sur une copie et non sur l'original. mais c'est un autre sujet. |
|
|
00
|
|
|
#6 |
|
Membre confirmé
![]() ![]() Inscription : octobre 2005 Messages : 173 ![]() |
Pas besoin de compteur
Taille >= 2 ;au debut Pointeur debut >= pointeur fin = c'est fini |
|
|
00
|
|
|
#7 | ||
|
Membre chevronné
![]() être humain Inscription : décembre 2007 Messages : 471 ![]() |
oui, mais ça coute un cmp de plus par iteration.
un loop iteration, ça va plus vite qu'un cmp debut,fin / jb iteration . jb car comme on travaille sur des pointeurs, il vaut mieux utiliser la logique non signée, ce qui est implicite avec loop. le fait de tester au debut l'egalité de pointeur (en divisant par deux la taille) permet de s'affranchir de bug en cas d'egalité dès le debut, et le fait d'utiliser ce meme nombre comme compteur de loop permet d'optimiser enormement le programme, en taille comme en rapidité. ça donnerait ça en 16 bits. Code :
du genre, tester si l'on a que 1, 2, ou 3 octets, utiliser un dword si l'on a plus que 3 octets. utiliser un micro bout de code pour les cas 1, 2 et 3, utiliser le dword pour tout les autres cas. inverser les octets d'un dword avec les instructions bswap, bswap ou ror/rol. etc... pourquoi pas utiliser les registres SSE pour les cas au dessus de 16 octets. etc... des optimisations qui ne sont même pas rentabilisées par le gain de cycles tellement c'est long à mettre au point. celà dit faudrait comparer les deux methodes pour voir. avec test d'egalité de pointeurs en fin de loop, et avec test d'egalité au debut avec taille divisée par deux. |
||
|
|
00
|
|
|
#8 |
|
Membre confirmé
![]() ![]() Inscription : octobre 2005 Messages : 173 ![]() |
La désolé , mais le loop est beaucoup plus lent que le cmp et est répété autant de fois que le cmp.
C'est un problème classique d'optimisation. |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com