[ASM]coder un strlen en asssembleur??

coder un strlen en asssembleur?? [ASM] - ASM - Programmation

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!!!!
Reply

Marsh Posté le 05-04-2007 à 13:46:00   

Reply

Marsh Posté le 05-04-2007 à 13:51:23    

Reply

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

Reply

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 ? :-)

Reply

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 :
  1. strlen proc
  2.         push bp
  3.         mov bp, sp
  4.        
  5.         xor eax, eax
  6.         mov si, [bp+4]
  7. iteration:
  8.         inc eax
  9.         inc si
  10.         cmp byte ptr[si], '$'
  11.         jne iteration
  12.        
  13.         pop bp
  14.         ret 2
  15. strlen endp


 
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. :hello:

Reply

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 ?!

Reply

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.  :heink:  
 

Reply

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é.

Reply

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é.

Reply

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 ?


Message édité par MagicBuzz le 16-04-2007 à 21:10:12
Reply

Marsh Posté le 16-04-2007 à 21:09:01   

Reply

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. :sarcastic:

Reply

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 ?

Reply

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed