Appending two string in x86 assembly

Devos50 picture Devos50 · Jun 5, 2012 · Viewed 15.2k times · Source

I'm currently working on an assignment in AT&T Assembly and now I have to append two strings:

message: .asciz "String 1"
before: .asciz "String 2"

I have really no idea how to do this or how to begin. I've already searched on internet but I couldn't find any helpful information. I think I have to manually copy the characters of the second string to the end of the first string but I'm not sure about that.

Could anyone please explain to me how to do this? :)

Answer

Nyerguds picture Nyerguds · Jul 4, 2012

This question fails to mention the target memory, which makes it somewhat difficult to answer. I also don't know if you're in 16 bit, 32 bit or 64 bit. For convenience's sake, I'll also just assume they're C style 0-terminated strings.

Anyway, this seems to be the general procedure:

  • Get the length of the first string (instructions on writing an asm strlen can be found here: http://www.int80h.org/strlen/)
  • Set the ptr to the target memory
  • Copy the first string to the destination memory, using rep(e/ne) movsb with the size in ecx.

This can be CPU-optimized by using 'movsd' by first doing a shr ecx, 2 on your length to get it in batches of 4 bytes, and then doing the remainder with movsb. I've seen this done like this:

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
  • Get the length of the second string (be sure to back up your edi in stack or another register if needed; it contains the address you need to copy the next string to)
  • Copy the second string to the destination memory (as I said, the correct address should be in edi after the first string operation)
  • For safety, add a new 0 behind it.

If you're copying the second string to the end of the first string, you need one less copy operation, but you have to make sure there is actually enough space there to copy the second string without overwriting other vital stuff.