Questa domanda non menziona la memoria di destinazione, il che rende piuttosto difficile rispondere. Inoltre, non so se sei a 16 bit, 32 bit o 64 bit. Per ragioni di convenienza, supporterò anche che siano stringhe a 0 terminate in stile C.
In ogni caso, questa sembra essere la procedura generale:
- ottenere la lunghezza della prima stringa (istruzioni su come scrivere uno strlen ASM può essere trovato qui: http://www.int80h.org/strlen/)
- Impostare Il PTR al bersaglio memoria
- Copia la prima stringa nella memoria di destinazione, utilizzando
rep(e/ne) movsb
con la dimensione in ecx.
Questo può essere CPU ottimizzata utilizzando 'movsd' dapprima facendo un shr ecx, 2
sulla lunghezza per ottenere in lotti di 4 byte, e poi facendo il rimanente con movsb. Ho visto questo fatto come questo:
mov edi, dest
mov esi, string_address
mov ecx, string_length
mov eax, ecx
shr ecx, 2
repne movsd
mov cl, al
and cl, 3
repne movsb ; esi and edi move along the addresses as they copy, meaning they are already set correctly here
- Ottenere la lunghezza della seconda stringa (assicuratevi di eseguire il backup del edi in pila o un altro registro, se necessario, ma contiene l'indirizzo è necessario copiare il stringa successiva a)
- Copia la seconda stringa nella memoria di destinazione (come ho detto, l'indirizzo corretto dovrebbe essere in edi dopo la prima operazione di stringa)
- Per sicurezza, aggiungere un nuovo 0 dietro di esso.
Se si sta copiando la seconda stringa alla fine della prima stringa, è necessario uno meno operazione di copia, ma si avere per assicurarsi che ci sia abbastanza spazio in realtà lì per copiare la seconda stringa senza sovrascrivere altre cose importanti.
L'assembly AT & T non esiste, è solo una sintassi diversa .. Immagino che intendessi forse l'assemblaggio di x86? :) – BlackBear
Ecco cosa intendevo;) – Devos50
Ok, mi sono preso la libertà di modificare la tua ricerca :) – BlackBear