【问题标题】:Issue properly comparing strings in intel assembly问题正确比较英特尔汇编中的字符串
【发布时间】:2020-07-31 09:55:33
【问题描述】:

我的目标是比较两个字符串。如果它们相等,则继续该程序。如果不相等,则在其他地方分支。如果我不在字符串的末尾并且到目前为止一切都相等,则循环到下一个字符。

我正在使用 Visual Studio,内联 intel asm。

程序正在运行,尽管在第一次运行时,它采用 NOTSAME 分支并继续结束程序,即使正在比较的字符串相同。 因此它根本不循环,这意味着比较中出现了问题。

我已经尝试调试它,似乎寄存器保存了正确的地址。根据我的理解,递增/递减它似乎有效,递增它只是将指针向前移动一个字节,指向下一个字符。我真的不清楚哪个部分出了问题,我只知道它没有按照我的计划进行比较。

int main()
{
    string arr[] = {"a","b","c","d","e" };

    string a= "a";

__asm
    {

        lea esi, arr // load address into esi
        lea edi, a
        dec edi

        LOOPING:
        inc edi// ds:di->next character in string2
        lodsb// load al with next char from string, lodsb increments si automatically.
        cmp[edi], al//; compare characters
        jne NOTSAME//; jump out of loop if they are not the same
        cmp al, 0//; they are the same, but end of string ?
        jne LOOPING//; no - so go round loop again

经过更多调试,似乎 AL 没有从字符串中获取正确的字节。还不知道为什么。

【问题讨论】:

  • 乍一看,您的代码看起来不错。但是您只提供了部分相关代码。你能提供更多的上下文(代码)吗?
  • @zx485 抱歉,我添加了变量以使其更具可读性。我没有在下面包含代码,因为无论参数如何,总是采用从底部开始的第三行(jne NOTSAME)。
  • 我不确定这是否相关,但string arr[] 不是创建字符串数组而不是字符数组吗? ATM 我不知道“字符串”类型是如何实现为字节序列的。所以一个建议:看看数据定义创建的字节序列。
  • @zx485 我不完全理解数据定义创建的字节序列是什么意思。我检查了指针指向的内容并找到了字符串的数据(我将其更改为比“a”更长的内容,以便更容易发现)。它让我认为 edi 是指向字符串的指针,我想访问该字符串的第一个字节,所以我使用 [edi]。 [edi] 是否显示一两个字节,因为 edi 是一个 32 位寄存器?我尝试从 cmp [edi],al 更改为 cmp byte ptr [edi],al 但仍然没有运气。
  • @zx485 感谢您的帮助。我对这些东西的了解大大增加了。我知道我应该朝哪个方向努力解决这个问题。

标签: arrays string visual-c++ x86 inline-assembly


【解决方案1】:

因此,出于某种原因,LEA 将地址存储在字符串开始位置之前的 4 个字节。我不确定为什么会这样,但为了解决这个问题,我向每个寄存器(指针)添加了 4 个字节,它们都进行了调整,现在可以正确比较。 更改了以下内容

lea esi, a// load address into esi
lea edi,arr
add edi,4
add esi,4

【讨论】:

  • 这可能是因为你有 C++ std::string 对象,而不仅仅是 char*。字符串数据仅作为短字符串对象的一部分内联,短字符串使用内联数据与指针之间的联合。除非这一切对你来说都有意义,并且你明白为什么在[edi+1] 上找不到b,我建议坚持使用C 字符串和char [](LEA 获取字符的地址)或@987654327 @(MOV 加载以获取字符的地址)。
猜你喜欢
  • 2011-04-26
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
  • 2011-02-14
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多