String 在x86程序集中追加两个字符串
我目前正在AT&T Assembly中处理一项作业,现在我必须附加两个字符串: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结
message: .asciz "String 1"
before: .asciz "String 2"
我真的不知道怎么做或者怎么开始。我已经在网上搜索过了,但找不到任何有用的信息。我想我必须手动将第二个字符串的字符复制到第一个字符串的末尾,但我不确定这一点
谁能告诉我怎么做吗?:) 这个问题没有提到目标内存,这使得回答起来有些困难。我也不知道是16位、32位还是64位。为了方便起见,我还假设它们是C风格的以0结尾的字符串 无论如何,这似乎是一般的程序:
- 获取第一个字符串的长度(有关编写asm strlen的说明可在此处找到:)
- 将ptr设置为目标内存
- 使用大小为ecx的
将第一个字符串复制到目标内存rep(e/ne)movsb
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汇编,也许吧?:)好的,我冒昧地编辑了你的问题:)不知道如何通过执行连接字符串的程序使系统崩溃。