2011-06-28 102 views
2

代码:http://paste.pocoo.org/show/422081/(链接404缺失)。GCC +内联汇编 - notl上意外的段错误

好吧,所以我试图不通用块的内存,并决定我做了愚蠢的铸造diddling,并认为我会下降到行内大会(我认为它实际上提高了可读性)。我设法将此段错误缩小为一个特定的功能。它在粘贴的第22行。

然而,它总是segfaults。正如你所看到的,str是作为argv [1]传递的。

我可以做手工的东西做argv [1](例如argv[1][0] = 'q'),所以我不完全知道为什么,不是不工作,特别是考虑到此前在nots它成功运行not8not2。有没有什么新奇的事情我不知道?这里有什么问题?

此外,一般的代码审查会很好;我相当陌生C.

+0

在什么电脑上运行?你使用eax作为指针,但是如果你有64位计算机/系统,你必须使用rax(也许not8和not2只是意外不要segfault)。 – flolo

+0

你的not13函数遗漏了字符串的一个字节(字节12),如果这是无意的,你可能想要修复这个问题 – Necrolis

+0

@flolo我认为这样做!现在我将让它突然离开,看看我的算法是否有效;)。 @Necrolis Eep!好眼睛。 –

回答

2

你的问题是password变量。您只分配一个元素,然后在for循环中执行password++。所以你第二次做这个循环时,你在无处的土地上。

该代码表明您使用的太复杂的概念比您目前掌握的要复杂得多。

  • 不要做内联汇编当你 还不知道如何处理 指针。
  • 不要投下malloc的回报。
  • unsigned char一般是 正确的类型检查对象的个人 字节。
+0

哦,织补。我忘了改变这个密码的增量,而这只是一个普通的长时间。谢谢:\(我应该在调试器中完成整个过程)。关于施放malloc的返回值,是不是返回void *?手册页这样说。你为什么不去施放它?我会交换到unsigned char,谢谢。 –

+0

@corey:在C语言中,你可以给任何指针类型赋一个'void *'而不用强制转换。但是在这种情况下演员阵容并不是有害的(编译器应该忽略它)。 – Necrolis

+0

@Corey,在C中,你可以给任何其他数据指针类型分配一个'void *'。这是为此而做的。如果你投了'malloc',你可能隐藏了你可能忘记了正确的包含文件的事实,因此'malloc'的返回类型默认为'int'。 –