J'ai essayé de comprendre comment faire une copie de mémoire via un tampon.Copie d'ESI vers Buffer vers EDI
Les paramètres de ma fonction sont: void* dest, void* src, size_t length
-je configurer ma fonction comme ceci:
push ebp
mov ebp, esp
push edi
push esi
push ebx
mov edi, [ebp+0x8] ; this is dest
mov esi, [ebp+0xc] ; this is src
mov ecx, [ebp+0x10] ; this is length
Je suis un peu d'une perte sur ce qu'il faut faire ensuite. Je comprends que j'ai besoin de créer un tampon parce que je pourrais potentiellement avoir de la mémoire qui se chevauche, mais je ne sais pas comment définir ma mémoire tampon dans ma fonction.
Une fois que je fais, j'imagine le code suivant ressemblerait à quelque chose comme (en supposant ebx
comme le tampon):
mov ebx, [esi+4*ecx]
mov edi, [ebx]
pop edi
pop esi
pop ebx
mov esp, ebp
pop ebp
Merci à l'avance! Edit: Pour clarifier, je mets un de mes commentaires ici: Essentiellement, je veux prendre les données stockées dans esi
et le déplacer à edi
, mais je veux aussi éviter la situation où il pourrait y avoir de la mémoire chevaucher esi
et edi
. Je crois, en utilisant quelque chose comme un tampon pourrait accomplir cela (est-ce que j'utilise le terme incorrectement?).
"La copie de mémoire via un tampon" n'est pas assez précise d'une description pour comprendre ce que vous voulez. Pourriez-vous élaborer? – fuz
Désolé pour le manque de clarté, je suis très nouveau pour l'assemblage. Essentiellement, je veux prendre les données stockées dans 'esi' et les déplacer dans' edi', mais je veux aussi éviter la situation où il pourrait y avoir un chevauchement de mémoire entre 'esi' et' edi'. Je crois, en utilisant quelque chose comme un tampon pourrait accomplir cela (est-ce que j'utilise le terme incorrectement?). –
pour 'memcpy' après votre installation, vous pouvez faire' rep movsb' pour copier le bloc de mémoire. Mais pour les régions chevauchantes 'memcpy' est UB, alors' memmove' devrait être utilisé. Ce qui permet de détecter dans quelle direction se produit le chevauchement et de le copier depuis le début ou la fin du bloc.Dans un assemblage simple et naïf, vous pouvez utiliser 'rep movsb' à nouveau, mais avec' std' (drapeau de direction défini sur 1). Juste ajouter à la valeur de pointeurs (taille-1). Cela dit une telle routine n'aura pas la meilleure performance possible, qui aurait besoin de code optimisé pour les différentes familles de processeurs x86, la résolution de l'alignement, etc. Donc, vérifiez quelques didacticiels/docs 'rep movsb'? – Ped7g