2016-11-23 1 views
1

Je suis encore très jeune à l'assemblage et seulement ce soir j'ai commencé à commencer à comprendre la majorité de ce que je voudrais faire, donc je peux avoir beaucoup de problèmes mais c'est dur pour moi de dire où en raison du manque d'expérience.Copier une chaîne dans l'assemblage x86 en utilisant l'adressage indirect

Je tente de copier une chaîne de la source à la cible en utilisant l'adressage indirect dans l'assemblage x86. J'essaie d'appliquer la compréhension que j'ai de cette explication, mais j'ai du mal à comprendre comment copier exactement les données @ esi dans edi.

.data 
val1 BYTE 10h,20h,30h 
.code 
mov esi,OFFSET val1 
mov al,[esi] ; dereference ESI (AL = 10h) 

inc esi 
mov al,[esi] ; AL = 20h 

inc esi 
mov al,[esi] ; AL = 30h 

C'est ce que je l'ai fait jusqu'à présent et je l'ai fait Gotten à courir (!!!), mais malheureusement, il ne copie pas du tout. Je pense que ma boucle est mauvais (je ne sais pas exactement comment sortir correctement) et il y a quelque chose de fou se passe avec ma copie, mais je ne sais pas où je me trompe:

INCLUDE Irvine32.inc 
.data 
    source BYTE "Source string I want to copy",0 
    target BYTE SIZEOF source DUP(0) 

.code 
main PROC 
    mov esi,OFFSET source    
    mov edi,OFFSET target    
L1: 
    mov al,[esi]  ; get char from source 
    mov [edi],al  ; store it in target 
    inc esi   ;move to next char in source 
    inc edi   ;move to next position in target 
    cmp al, 28   ;compare al to 28 (the number of chars in source string) 
    JNZ L1    ;repeat the loop if al != 28 (length of source string) 

    mov edx, OFFSET source 
    call WriteString ;Prints out source string (working fine) 
    mov edx, OFFSET target 
    call WriteString ;Prints out dest string (working fine) 

Les writestrings fonctionnent correctement en bas parce que j'ai été en mesure de l'obtenir à la sortie "Chaîne source que je veux copySource chaîne que je veux copier" dans la console lors de l'exécution en utilisant l'adressage indexé.

+0

vous devriez comparer al avec 28, pas esi. et votre chaîne source devrait se terminer par un "#" puis – Tommylee2k

+1

bien sûr, votre chaîne source n'est pas terminée par "'#" ;-) – Tommylee2k

+0

Je n'ai jamais vu cela auparavant et je ne sais pas où cela est supposé aller/Pourquoi. Pourriez-vous expliquer ce que cela fait et où exactement cela se passe-t-il? J'ai essayé dans les citations de la chaîne, juste à l'extérieur, et juste après 0 et il continue de s'écraser. La recherche Google/stackoverflow ne montre pas grand-chose sur les chaînes se terminant par "#". – zr0z

Répondre

1

Votre chaîne est terminée par NUL (,0 à la fin de la chaîne). Donc, oubliez de comparer avec une certaine longueur codée en dur que vous devrez changer si vous modifiez la chaîne; il suffit de vérifier si l'octet que vous lisez est zéro à la place:

L1: 
    mov al,[esi]  
    mov [edi],al  
    inc esi    
    inc edi    
    test al,al   ; you could also use cmp al,0 if you prefer that 
    JNZ L1    ; repeat the loop if al != 0 
+0

Oui! C'était si simple et aidé une tonne! C'était la première fois que j'utilisais cmp/test et j'avais l'idée générale mais je ne l'ai pas exécutée correctement à 100%. Merci beaucoup pour l'explication. Ma seule expérience précédente avec les boucles dans l'assemblage était avec un compteur de boucle utilisant l'adressage indexé, donc c'était une bonne expérience d'apprentissage :) – zr0z