如何在x86汇编中连接两个字符串?

时间:2017-12-03 13:59:01

标签: assembly x86

例如我有两个字符串

section .bss

stringA     resb    16
stringB     resb    16

读完stringA =" abcde&#34 ;, stringB =" fghij"。 我也知道他们的长度。我如何将它们连接成一个新的stringC?  (它应该包含" abcdefghij")

我希望你明白我想要的东西,我最近开始学习装配。感谢您回答$

1 个答案:

答案 0 :(得分:0)

汇编程序没有数据类型,但它对CPU的每条指令都有一条指令。

不同的编程语言有不同的方法将字符串存储在内存中:

某些语言(如C)使用终止字符串:字符串是存储字符的内存中的某个数组。字符串的结尾由特殊字符(例如NUL)标记,因为数组的长度大于最大可能的字符串长度:

char a[100] = "Hello";

实际上意味着:

char a[100] = { 'H', 'e', 'l', 'l', 'o', 0, 'f', 'o', 'o', 'b', 'a', 'r', ...};

其他语言(如Java,Pascal或C#)在内部将字符串的长度存储在某个变量中,并将字符存储在数组中:

string a = "Hello";

实际上意味着:

int a_len = 5;
char a_text[100] = { 'H', 'e', 'l', 'l', 'o', 'f', 'o', 'o', 'b', 'a', 'r', ...};

或(在旧的Pascal变体的情况下):

char a[100] = { 5, 'H', 'e', 'l', 'l', 'o', 'f', 'o', 'o', 'b', 'a', 'r', ...};

因为汇编语言是“只是”CPU指令的另一种表示,所以任何编程语言使用的所有变体都可以用汇编语言。

所以这取决于你的字符串存储在内存中的方式。

如果要连接两个以NUL结尾的字符串,可以按以下方式进行连接:

  1. 您可以将ds:siesirsi(取决于您是否编写16位,32位或64位代码)设置为第一个字符串的第一个字符。
  2. 您将es:diedirdi设置为目标内存
  3. 清除方向标志
  4. 您使用lodsb指令
  5. 读取一个字节
  6. 使用stosb指令
  7. 编写相同的字节
  8. 如果al寄存器不为零,则继续执行步骤4.(循环)
  9. 您递减diedirdi
  10. 您将ds:siesirsi设置为第二个字符串的第一个字符
  11. 您再次执行循环(步骤4.-6。)
  12. 如果你想使用其他CPU(例如ARM,MIPS,PowerPC,......)而不是x86,你当然必须使用其他寄存器。大多数CPU没有等效的lodsbstosb,但您必须使用两条指令:加载一个字节并递增寄存器。