Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 比较程序集中的字符串_String_Assembly_Cmp - Fatal编程技术网

String 比较程序集中的字符串

String 比较程序集中的字符串,string,assembly,cmp,String,Assembly,Cmp,所以,我对阿塞姆比是个新手。我的任务是检查字符串中的子字符串并打印出是/否答案。这两个字符串都由用户输入 我把字符串的偏移量放入bx寄存器,子字符串的偏移量放入bp寄存器。使用di和si寄存器中的索引号,我想比较字符串的字符。我的两个索引寄存器都设置为2,它应该是字符串的第一个字符 mov dl,[bx+di] mov al,[bp+si] cmp dl,al jz AnswerYes jmp AnswerNo 我用它来比较每个字符串中的第一个字符 当我在两个字符串中都加上“a”时,程序应该跳

所以,我对阿塞姆比是个新手。我的任务是检查字符串中的子字符串并打印出是/否答案。这两个字符串都由用户输入

我把字符串的偏移量放入bx寄存器,子字符串的偏移量放入bp寄存器。使用di和si寄存器中的索引号,我想比较字符串的字符。我的两个索引寄存器都设置为2,它应该是字符串的第一个字符

mov dl,[bx+di]
mov al,[bp+si]
cmp dl,al
jz AnswerYes
jmp AnswerNo
我用它来比较每个字符串中的第一个字符

当我在两个字符串中都加上“a”时,程序应该跳转到AnswerYes并打印出“yes”。当我打印[bx+di]和[bp+si]时,它会打印出它们的“a”,这意味着它们是相同的,但程序总是跳转到AnswerNo

如果我这样做:

cmp dl,'a'
cmp al,'a'
它打印我们的“是”,意思是它们是一样的

当我这样做时:

cmp dl,'a'
cmp al,'a'
它打印出“不”,即使它们是一样的

我怀疑问题出在我使用bp寄存器上,因为我以前从未使用过它。我总是在我的程序中只使用一个字符串,我总是使用bx寄存器


提前感谢您的帮助。

将字符串地址加载到DS:SI和ES:DI中,如果使用C字符串,请在CX中输入一个长度,使其为FFFFh,否则将长度字节扩展为零或将已知长度放入其中


然后用CLD清除方向标志,并使用REPE CMPSB进行比较。结果是ZF中的零/等于标志。

我相信您的假设是正确的。使用BP意味着使用基于堆栈的缓冲区。您可以使用CX而不是BP来测试这一点。使用CX而不是BP会导致“非法索引节点”错误,因此我无法使用[CX+si]。有没有像[bx+di]这样的寄存器组合可以用于字符串和索引号的偏移量?非法索引节点-这是准确的错误吗?嗯,自从我编写16位汇编程序以来已经有几十年了,所以那个平台上的精确约束只不过是一个模糊的记忆。我想很多人都会这样。这就是你需要这本书的原因——或者你可能想尝试和谷歌搜索一些x86样本。嗯,我刚刚意识到,为什么要费心用寄存器来存储我的字符串?我可以使用[offset Substring+si]。。我将尝试一下。您可以在《英特尔软件开发人员手册》第2卷第2.1.5节中找到有效地址的有效寄存器/偏移量组合列表。您不应该对任何字符串使用FFFFh。对于以零结尾的C字符串,您需要首先找到两个字符串的字符串长度,然后决定在长度不同时如何操作。当然,较短的字符串获胜,但由于C字符串终止符为NUL,因此这将解决问题。没有一个C字符串可以大于64 KiB,因此FFFFh在这种情况和操作环境下使用是完全合适的。假设在使用64 KiB之前字符串不相等,结果将始终为非零ZF clear。repne scasb遇到零字节时停止。Repe CMPSB在这种情况下不会停止,所以如果前缀匹配,则总是扫描匹配的部分并发生在不相等的尾随数据上。字符串的最大大小为65535 +NUL字节,所以它们总是小于64 Kib…请考虑比较何时停止。repe cmpsb遇到零字节时不会停止。因此,如果字符串foo以0结尾,然后是bar,而另一个字符串foo以0结尾,然后是qux,那么即使C字符串都是相同的,您也会收到NZ结果。