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

String 在x86程序集中追加两个字符串,string,x86,string-concatenation,att,String,X86,String Concatenation,Att,我目前正在AT&T Assembly中处理一项作业,现在我必须附加两个字符串: message: .asciz "String 1" before: .asciz "String 2" 我真的不知道怎么做或者怎么开始。我已经在网上搜索过了,但找不到任何有用的信息。我想我必须手动将第二个字符串的字符复制到第一个字符串的末尾,但我不确定这一点 谁能告诉我怎么做吗?:) 这个问题没有提到目标内存,这使得回答起来有些困难。我也不知道是16位、32位还是64位。为了方便起见,我还假设它们是C风格的以0结

我目前正在AT&T Assembly中处理一项作业,现在我必须附加两个字符串:

message: .asciz "String 1"
before: .asciz "String 2"
我真的不知道怎么做或者怎么开始。我已经在网上搜索过了,但找不到任何有用的信息。我想我必须手动将第二个字符串的字符复制到第一个字符串的末尾,但我不确定这一点


谁能告诉我怎么做吗?:)

这个问题没有提到目标内存,这使得回答起来有些困难。我也不知道是16位、32位还是64位。为了方便起见,我还假设它们是C风格的以0结尾的字符串

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

  • 获取第一个字符串的长度(有关编写asm strlen的说明可在此处找到:)
  • 将ptr设置为目标内存
  • 使用大小为ecx的
    rep(e/ne)movsb
    将第一个字符串复制到目标内存
这可以通过使用“movsd”进行CPU优化,首先对长度执行
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与操作系统联系,请求当前可用的内存块,该内存块的大小足以在连接两个字符串后包含它们的内容。这将是一个独立于 从两个字符串开始,它来自所谓的内存堆,一旦给定了该内存块的起点,就复制第一个内存块的内容 字符串,然后继续,同时在中复制第二个字符串的内容 就在第一个后面。然后释放已分配给的内存 第一个字符串,并通过更改其指针(可能的话)将块重新分配给该字符串 它的长度。释放的内存由操作系统返回内存堆,以便在其他地方重用

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

换句话说,这可能是一项非常雄心勃勃的事业,你必须知道很多 关于如何正确处理这件事。你做错了,你可以预料后果
比如系统崩溃,需要重新启动

AT&T程序集不存在,它只是一种不同的语法。。我猜你的意思是x86汇编,也许吧?:)好的,我冒昧地编辑了你的问题:)不知道如何通过执行连接字符串的程序使系统崩溃。