IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

[NASM] Allouer mémoire + stosb


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 101
    Par défaut [NASM] Allouer mémoire + stosb
    Bonjour,
    j'ai essayé de réaliser un rot13 en asm, c'est à dire une rotation de 13 lettres dans l'alphabet. (a + 13, b+13, m = m, n -13, o - 13 ...).

    Dans une première partie je l'ai codé (et cela fonctionne), de manière peut optimiser et pour comprendre comment cela fonctionne.
    je met le pointeur de ma chaine qui est dans .data dans esi, mais je suis obligé de créer une chaine de meme longueur dans .data et la mettre dans edi. Voici le code pour comprendre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    %macro write 2
    mov al, 4
    mov bl, 1
    mov ecx, %1
    mov dl, %2
    int 0x80
    %endmacro
    
    
    section .text
    	global _start:
    	
    
    _start:
    mov esi, chaine
    mov edi, chainerot
    
    rot13:
    mov al, [esi]
    cmp al, 0x0
    je .finish
    cmp al, 0x4D ;M
    jng .upper
    cmp al, 0x5A ;Z
    jng .lower
    cmp al, 0x6D ;m
    jng .upper
    cmp al, 0x7A ;z
    jng .lower
    
    .lower:
    sub al, 0xD
    jmp .clean
    
    .upper:
    add al, 0xD
    
    .clean
    mov [edi], al
    inc esi
    inc edi
    jmp rot13
    
    .finish:
    write chainerot,9
    
    mov al, 1
    int 0x80
    
    section .data
    
    chaine    db    "rotation",0
    chainerot   db    "        ",0
    Ce programme affichera : ebgngvba


    J'aimerais savoir comment peut-on faire pour réaliser ce programme sans passer par un chainerot db " ",0 dans .data :S et inc esi, inc edi. J'ai entendu qu'on pouvait utiliser lodsb et stosb pour placer la valeur contenu dans le registre eax dans edi et qui automatise l'incrémentation ? Comment adapter ce programme en utilisant cette opération et sans passer par une déclaration dans .data ?

    En gros ce que j'aimerais faire : donner une chaine dans .data et pouvoir afficher son rot13.

    Merci beaucoup !

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 59
    Par défaut
    Tu n'es pas obliger de creer une autre chaine
    Tu charge la valeur [esi] dans AL, tu modifie AL, et tu remets AL à l'adresse ou tu etais.

    lodsb te permet d'effectuer la premiere action, et l'incrementation de esi en 1 fois.

    stosb fait l'action inverse de lodsb, mais place à l'adresse [edi]. Il faut donc t'assurer que les 2 pointent vers la meme adresse, et ca devrait etre bon

    Je peux pas tester la, mais essaye:

    mov esi, chaine
    mov edi, chaine

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    _start:
    mov esi, chaine
    mov edi, chaine
     
    rot13:
    lodsb
    cmp al, 0x0
    je .finish
    cmp al, 0x4D ;M
    jng .upper
    cmp al, 0x5A ;Z
    jng .lower
    cmp al, 0x6D ;m
    jng .upper
    cmp al, 0x7A ;z
    jng .lower
     
    .lower:
    sub al, 0xD
    jmp .clean
     
    .upper:
    add al, 0xD
     
    .clean
    stosb
    jmp rot13
    Ou quelque chose comme ca, mais il y a encore moyen d'optimiser ton algo je pense.

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2006
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 101
    Par défaut
    Edit:

    Ca marche bien merci . Le pointeur de la chaine modifiée est donc la ou pointe chaine. On ne peut pas se passer de mov edi, esi ? Un mov [esi], al segfault

    Sinon je ne vois pas trop comment optimiser cette algo

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Par défaut
    Les optimisations les plus efficaces sont d'éviter les sauts conditionnels. Celui de la boucle n'est pas gênant parce qu'il est bien prévisible. Il faut éviter d'utiliser lods et stos pour des raisons de performances.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    section .data
     
    chaine    db    "rotation",0
    translation   db    "mnopqrstuvwxyzabcdefghijkl";
     
     
    section .text
    	global _start:
     
    _start:
     
    mov esi, chaine
    xor eax, eax
     
    rot13:
    mov al, [esi]
    cmp al, 0x0
    je .finish
     
    mov al, translation[eax - 'a'] ; La partie haute de eax est à 0 depuis le début
    mov [esi], al ;
    inc esi;
     
    jmp rot13
    Définissez plutôt un tableau translation de 256 caractères, qui transcrive au moins la rotation des minuscules et des majuscules.

Discussions similaires

  1. Allouer mémoire à une requête SQL
    Par renowep dans le forum Développement
    Réponses: 2
    Dernier message: 15/01/2014, 16h35
  2. allouer plus de mémoire
    Par fontaigo dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 05/02/2007, 16h54
  3. Allouer un segment de mémoire avec "GNU GCC Compiler&qu
    Par damien99 dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 22/06/2006, 23h18
  4. Réponses: 4
    Dernier message: 01/06/2006, 15h55
  5. [DOS][Mémoire] Allouer plus de 64 Ko
    Par Pascool dans le forum C
    Réponses: 3
    Dernier message: 11/02/2003, 10h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo