【问题标题】:GNU Assembler can't compare two variables stringGNU Assembler 无法比较两个变量字符串
【发布时间】:2024-01-20 00:47:01
【问题描述】:

我无法在 gnu 汇编器中比较两个变量字符串

   mov $[name], %eax            # move name into eax
   mov $[constname], %ebx       # move constname into ebx
   cmp %eax, %ebx               # compare two operands
   je if                        # if
   call else                    # else

【问题讨论】:

  • 这是比较地址,而不是数据。字符串是可变长度的,如果长度超过 4 个字节,则不适合单个寄存器。这就是为什么 strcmp 是 C 中的一个函数,而不是你可以用 == 做的事情。
  • 可能值得看看*.com/questions/38829719/…

标签: assembly x86 gnu-assembler att


【解决方案1】:

汇编语言与所有其他语言略有不同,因此与您在其他语言中习惯的方式不同。例如,您可以使用 C++ 或许多其他语言来执行此操作:

string s = "hello"
string d = "hello"
if (s == d) {}

在汇编中,您不能执行上述操作,因为您没有如此好的抽象可供您使用。你离机器很近,所以你必须自己做很多繁重的工作。

您的代码无法正常工作有几个原因

   mov $[name], %eax            # move name into eax

上述指令会将name地址移动到%eax。所以之后当你这样做时:

cmp %eax, %ebx

它比较两个地址,而不是“值”。

例如,如果我们想将mov 字符串的“值”写入寄存器,我们将编写:

mov name, %eax

这里重要的是%eax 只能包含 32 位(4 字节)的数据。因此,如果您的字符串是“Hello”,%eax 将仅包含 4 个字节“olle”。由于字节顺序而倒序。这极大地限制了我们,但我们还有其他方法可以绕过它。

我们可以使用cmpsb,只要我们有一个最小长度可以使用。

#our strings
.data
  name:      .string "Hello"
  constname: .string "Hello"

# other instructions...

   mov $(name), %edi            # move the "Address" of name into edi
   mov $(constname), %esi       # move "Address" of constname into esi
   mov $5, %ecx                 # compare 5 characters only, you can use string1 length here

   rep cmpsb                    # rep `cmpsb` (Compare String Byte), till %ecx is 0
   jz  if                       # Success, jump to if label if zero flag is set
   call else                    # Strings were not equal
# other stuff...

if:                          # if label


旁注:

我强烈建议您使用$(..) 语法而不是$[...]。 AT&T 语法已经充满了复杂的语法,所以让我们坚持使用最常用的一种。例如$name$(name)$[name] 都是同一个意思。

【讨论】:

  • 先生/妈妈你知道如何在 gnu 汇编器中生成 if else-if
  • 在汇编中没有简单的 if else 。有跳跃。您可以跳转到某个位置。例如,在上面的代码中,jz if 可以跳转到名为“if”的标签并开始在那里执行代码。 jz 代表“如果为零则跳转”,这里的零是零标志。如果此标志设置为 1,jz 将执行跳转。如果不是,则将执行下一条指令call else。这就是你在汇编中的做法。汇编中有很多跳转指令,请务必阅读,因为理解它们非常重要。
  • 如果这回答了您的问题,请接受答案。
最近更新 更多