繁体   English   中英

在x86程序集中附加两个字符串

[英]Appending two string in x86 assembly

我目前正在AT&T Assembly工作,现在我必须追加两个字符串:

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

我真的不知道该怎么做或如何开始。 我已经在网上搜索过但我找不到任何有用的信息。 我想我必须手动将第二个字符串的字符复制到第一个字符串的末尾,但我不确定。

谁有人可以向我解释如何做到这一点? :)

这个问题没有提到目标记忆,这使得回答有些困难。 我也不知道你是16位,32位还是64位。 为方便起见,我还假设它们是C风格的0端接字符串。

无论如何,这似乎是一般程序:

  • 获取第一个字符串的长度(有关编写asm strlen的说明,请访问: http//www.int80h.org/strlen/
  • 将ptr设置为目标内存
  • 使用rep(e/ne) movsb将第一个字符串复制到目标内存,其大小为ecx。

这可以通过使用'movsd'进行CPU优化,首先使用shr ecx, 2长度为shr ecx, 2 ,以4个字节的批量获取,然后使用movsb进行余下的操作。 我已经看到这样做了:

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
  • 获取第二个字符串的长度(如果需要,请确保将edi备份到堆栈或其他寄存器中;它包含复制下一个字符串所需的地址)
  • 将第二个字符串复制到目标内存(正如我所说,在第一个字符串操作后,正确的地址应该在edi中)
  • 为安全起见,在它后面添加一个新的0。

如果您将第二个字符串复制到第一个字符串的末尾,则需要少一个复制操作,但是您必须确保实际上有足够的空间来复制第二个字符串而不会覆盖其他重要的内容。

这不是一件小事。 字符串长度可变,占用内存中的不同空间,必须有一些方法可以知道它们的长度或结束位置。 对于C或C ++,nul字节(零值的字节)表示字符串的结尾。 对于其他一些程序语言,您有一个指向字符串开头和单独存储的字符串长度的指针,这样可以让您在字符串中存储二进制文件(包括零值字节)。 即使使用C和其余部分,您也必须有一个指向字符串开始位置的指针。

通常必须发生的是,您必须使用asm来联系操作系统并请求一个当前空闲的内存块,该内存块足够大,可以在连接后包含两个字符串的内容。 这将是与两个字符串中的任何一个开始分开的内存,它来自所谓的内存堆,一旦给出该内存块的起始点,就将第一个字符串的内容复制到其中,然后继续复制第一个字符串后面的第二个字符串的内容。 然后释放已分配给第一个字符串的内存,并通过更改其指针以及可能的长度将块重新分配给该字符串。 释放的内存由操作系统返回到内存堆,以便在其他地方重用。

实际上,操作系统并不是释放内存的唯一来源。 有些编译器,甚至汇编器,可以自己处理内存管理,也可以根据需要为程序员提供合适的工具。

换句话说,这可能是一项非常雄心勃勃的任务,你必须要了解正在做的事情。 你做错了,你可能会遇到崩溃系统和需要重启的后果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM