Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/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
String 汇编程序Intelx86:比较if I';字符串末尾的m不是';行不通_String_Assembly_X86_Intel - Fatal编程技术网

String 汇编程序Intelx86:比较if I';字符串末尾的m不是';行不通

String 汇编程序Intelx86:比较if I';字符串末尾的m不是';行不通,string,assembly,x86,intel,String,Assembly,X86,Intel,我在为Intelx86(32位,在Windows中编写)编写汇编程序时,必须对接收到的字符串进行加密。我用两个字符的块进行加密,如果这两个字符相同,我需要将它们添加到结果字符串中,而不必更改它们。要遍历字符串,我使用EBX,如下所示: cmp byte[userstring + ebx], 0 je EmptyBlock 出于某种原因,它在只有两个字符时工作,但当字符串有4个字符时(所有字符都完全相同,例如“AAAA”)它停止工作。它进入一个无止境的循环,EBX不停地增加2。我跳过什么了吗?我

我在为Intelx86(32位,在Windows中编写)编写汇编程序时,必须对接收到的字符串进行加密。我用两个字符的块进行加密,如果这两个字符相同,我需要将它们添加到结果字符串中,而不必更改它们。要遍历字符串,我使用EBX,如下所示:

cmp byte[userstring + ebx], 0
je EmptyBlock

出于某种原因,它在只有两个字符时工作,但当字符串有4个字符时(所有字符都完全相同,例如“AAAA”)它停止工作。它进入一个无止境的循环,EBX不停地增加2。我跳过什么了吗?我做了错误的比较吗?对不起,我是汇编程序新手。

您确定您的字符串真的以0结尾吗?使用调试器检查内存(并在单步执行时检查寄存器)。是的,
cmp byte[…],0
/
je
是一种有效的方法,可以在内存中的字节为零的情况下进行分支,因此这不是问题所在,您的问题缺少一个。我如何知道使用_get接收的内容是否以-0结尾?此外,当它是一个空字符串或2个字符时,它也可以工作。但它的作用仅限于此。同样的问题还有另一种情况,如果一个块只有一个字符(即如果有“ABC”或“ABCDE”,“C”和“E”作为这些字符),我必须做另一种情况。它适用于1和3,但在5或更多时间内停止工作。我不知道为什么它突然停止工作。幸运的是,我决定使用EDX对字符串中的所有字符进行计数,得到长度,并与之进行比较。通过查看内存中的字节,在预期的字符数之后找到一个
0
字节。如果在此代码运行之前用其他内容重写了缓冲区的结尾,那么它可能仍然不存在。ISO C
获取
总是附加一个
'\0'
字节;它不检查长度,甚至没有缓冲区大小的参数,所以它的行为总是相同的;它无法确定缓冲区没有空间容纳
0
。如果Windows
\u gets
相同,则字符串始终以0结尾。的精确副本(可能应该对此进行编辑)您说它将EBX连续增加2?为什么是2?字符长度仅为1字节。为什么不显示更多的代码呢?两条指令(没有数据)实际上不足以说明循环中发生了什么。