coder un strlen en asssembleur?? [ASM] - ASM - Programmation
Marsh Posté le 05-04-2007 à 15:31:33
S'il s'agit d'une chaine C qui n'est pas en unicode,
initialise un compteur à 0, pointe le début de la chaine, charge un caractère puis pointe le suivant, compare le à 0 si pas incrémente le compteur, si 0 sort.
Si c'est de l'unicode ça va être très chiant.
y-a-pu-ka
Marsh Posté le 07-04-2007 à 19:27:26
cherche l'instruction scasb en asm et regarde comment elle fonctionne.
PS: tu vas aussi demander qu'on te file la solution pour les 14 fonctions du sujet d'assembleur, et pour tous les autres projets de l'ecole ? :-)
Marsh Posté le 14-04-2007 à 12:24:41
Tiens c'est marrant je viens de faire le même exercice. J'ai fait comme ça :
Code :
|
J'en profite pour poser une question : est-ce qu'il vaut mieux retourner le résultat par EAX ou prendre en paramètre un pointeur vers une variable qui contiendra le résultat ? Merci.
Marsh Posté le 14-04-2007 à 13:17:27
tant que possible c mieux de retourner une valeur , comme le strlen de C, et tu n'a pas a utiliser eax, tu fait juste ret c tout, parce que la ton programme retourne toujours 2 ?!
Marsh Posté le 15-04-2007 à 22:34:59
red faction a écrit : tant que possible c mieux de retourner une valeur , comme le strlen de C, et tu n'a pas a utiliser eax, tu fait juste ret c tout, parce que la ton programme retourne toujours 2 ?! |
Euh, y'a un truc qui m'échappe...
Le 2 correspond à la taille que prennent les paramètres sur la pile. Ici, il n'y a qu'un paramètre et on est en mode 16 bits, donc pour aligner la pile, il faut ajouter 2 octets à ESP.
Par convention, la valeur de retour se trouve dans le registre EAX, mais on pourrait très bien avoir plusieurs valeurs de retour dans plusieurs registres.
Je ne comprend pas pourquoi tu viens donner des conseils si tu ne connais pas les bases de l'assembleur.
Marsh Posté le 16-04-2007 à 18:40:10
Merci pour la précision, je ne sais pas pourquoi je croyais que les registres étaient empilés / dépilés pour qu'après le retour de la fonction ils aient le même état qu'à son appel, mais apparemment j'ai rêvé.
Marsh Posté le 16-04-2007 à 20:15:18
Oui, je n'ai pas détaillé.
Effectivement, certains registres doivent être sauvegardés sur la pile. En fait, seuls EAX (puisqu'il contient la valeur de retour), ECX (qui est un compteur) et EDX n'ont pas besoin d'être sauvegardés.
Normalement, ESP n'a pas à être manipulé (à part pour rétablir la pile ou allouer des variables locales) donc, il n'a pas besoin d'être sauvegardé.
Marsh Posté le 16-04-2007 à 21:09:01
(question du gars qui a fait 3 heures de TP sur 386)
eax c'est pas 32 bits ?
alors si c'est pour bosser qu'avec du 16 bits, pkoi ne pas utiliser simplement AX ?
ça peut toujours être intéressant de conserver la partie haute de EAX pour stocker d'autres infos, genre un strlen évolué qui permet de compter la longueur d'une chaine, et en plus le nombre de sauts de lignes (par exemple) non ?
Marsh Posté le 16-04-2007 à 23:59:20
Bah, tu fais ce que tu veux.
Mais on ne peut pas accéder directement à la partie haute de EAX, donc il faudra utiliser les instructions de décalage binaire (SHL, SHR, ROR, ROL). Et puis, comme je le disais, tu peux même renvoyer plusieurs valeurs dans EAX et EDX par exemple. C'est d'ailleurs ce que font certaines instructions, comme RDTSC ou CPUID par exemple.
Mais bon, c'est un peu abusé de parler d'asm 16 bits alors que le PC moyen est en train de migrer vers le 64 bits.
Marsh Posté le 26-04-2007 à 10:55:56
Petite question concernant la sauvegarde des registres: (pardon d'avance si c'est trop trivial, je connais pas grand chose à l'assembleur)
pourquoi n'est-il pas necessaire de rétablir les valeurs initiale de EAX, ECX et EDX ??. Si on code par exemple une routine asm dans un programme C, comment peut-on est sûr qu'au moment de l'appel de la routine, un de ces trois registre ne soit pas utilisé pour autre chose ?
Marsh Posté le 26-04-2007 à 11:38:25
logiquement, le compilo sauvegarde et restore lui-même les registres et pilesavant que tu ne lances ton bout d'ASM
Marsh Posté le 05-04-2007 à 13:46:00
Bonjour a tous.
Je debute en ASM et je voudrais coder une fontion permettant de connaitre la taille d'une chaine de caractere (un strlen en C)
Quelqu'un a -t-il la solution??
Merci
---------------
L'etre humain juge tres vite comprend lentement, s'enerve facilement et perd vite ses facultees d'enfant!!!!