gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:54:25 24 4
gpt4 key购买 nike

我目前正在 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。

  • 这可以通过首先执行 shr ecx, 2 使用 'movsd' 来优化 CPU。在您的长度上以 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。

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

    关于string - 在 x86 程序集中附加两个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10895650/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com