Concaténer deux chaînes de caractères en x86 assemblée
Je suis actuellement en train de travailler sur un projet dans le AT&T de l'Assemblée et maintenant, je dois ajouter deux chaînes:
message: .asciz "String 1"
before: .asciz "String 2"
J'ai vraiment aucune idée de comment faire ou comment commencer. J'ai déjà cherché sur internet mais je ne pouvais pas trouver toutes les informations utiles. Je pense que je dois copier manuellement les caractères de la deuxième chaîne à la fin de la première chaîne, mais je ne suis pas sûr à ce sujet.
Quelqu'un pourrait-il m'expliquer comment faire? 🙂
AT&T de l'assemblée n'existe pas, c'est juste une syntaxe différente.. je suppose que vous vouliez dire x86 assemblée peut-être? 🙂
C'est ce que je voulais dire 😉
Ok, j'ai pris la liberté de modifier votre question 🙂
C'est ce que je voulais dire 😉
Ok, j'ai pris la liberté de modifier votre question 🙂
OriginalL'auteur Devos50 | 2012-06-05
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas une mince affaire. Les chaînes sont de longueur variable et occupent des espaces différents dans la mémoire, et il doit y avoir un moyen de savoir combien de temps ils sont ou d'où ils fin. Avec le C ou le C++, un nul octets (octets de valeur zéro) indique la fin de la chaîne. Avec quelques autres
programme de langues, vous avez un pointeur vers le début de la chaîne et de la longueur de la chaîne stockée séparément, ce qui a l'avantage de vous laisser stocker les binaires (y compris les octets de
la valeur zéro) dans la chaîne. Même avec le C et le reste, vous devez avoir un pointeur à l'endroit où la chaîne de caractères commence.
Ce qui a généralement pour se produire est que vous devez utiliser l'asm à communiquer avec le système d'exploitation et demande un bloc de mémoire qui est actuellement gratuit qui est assez grand pour contenir le contenu de deux chaînes, une fois qu'ils sont attachés. Ce serait de la mémoire distinct de celui des
deux chaînes de commencer avec, et il s'agit de ce que l'on appelle la Mémoire du Tas, une Fois que vous êtes donné le point de départ de ce bloc de mémoire, vous copiez le contenu de la première
chaîne en elle, puis vous continuez sur tout en copiant le contenu de la deuxième chaîne, en
il y a juste derrière la première. Ensuite, vous libérer de la mémoire qui avait été affecté à la
première chaîne et de réaffecter le blocage de chaîne en changeant son pointeur, et, éventuellement,
sa longueur. La mémoire libérée est retourné à la Mémoire de Tas par le Système d'Exploitation pour les réutiliser ailleurs.
En fait, le système d'exploitation n'est pas la seule source de libéré de la mémoire. Certains compilateurs, même assemblage, et de prendre en charge la gestion de la mémoire sur leur propre, ou de fournir les outils appropriés
pour le programmeur de le faire en tant que de besoin.
En d'autres termes, ce peut être un projet d'entreprise ambitieux, et vous avez à connaître un
peu à propos de ce qui se passe sur la droite. Vous le faites mal, vous pouvez vous attendre à des conséquences
comme le plantage de votre système et avoir à redémarrer.
OriginalL'auteur oldefoxx
Cette question ne mentionne pas la cible de la mémoire, ce qui le rend un peu difficile à répondre. Aussi, je ne sais pas si vous êtes en 16 bits, 32 bits ou 64 bits. Souci de commodité, je vais également supposons qu'ils sont de style C 0-chaînes terminées.
De toute façon, cela semble être la procédure générale:
rep(e/ne) movsb
avec la taille dans ecx.Cela peut être de l'UC optimisé par l'utilisation de 'movsd" par abord faire un
shr ecx, 2
sur votre longueur pour obtenir des lots de 4 octets, et ensuite de faire le reste avec movsb. J'ai vu ce fait comme ceci:Si vous êtes à la copie de la deuxième chaîne à la fin de la première chaîne, vous avez besoin d'un moins de l'opération de copie, mais vous ont assurez-vous qu'il est effectivement assez d'espace pour copier la deuxième chaîne, sans écraser les autres trucs.
OriginalL'auteur Nyerguds