【发布时间】: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