我尝试编写简单的应用程序,每当发生任何错误时,都会尝试调试并了解导致错误的原因。
如标题所述,学习汇编语言如何帮助我调试C程序? 此外,汇编语言的所有主题都是必需的。
PS:我对掌握汇编语言并不感兴趣,但考虑学习相同内容以更好地理解这个过程。
PPS:链接到主题会很棒。
谢谢!
答案 0 :(得分:3)
老实说,它不会。也就是说,学习汇编对于帮助您专门调试C代码几乎没有帮助(除了少数特殊情况,例如微控制器/嵌入式系统项目)。如果您已经知道汇编,它可以提供帮助,但即便如此,根据我使用C和汇编以及一些非常强大的调试器的经验,我认为以这种方式调试代码效率很低。
那就是说,我绝对会鼓励任何人探索组装并尽可能多地学习它,甚至编写一些汇编代码。它将提供有关程序如何在更低级别工作的其他重要见解。而且,在某些情况下,它甚至可以很有趣。
至于调试,Linux的gdb和Windows的visual studio debugger等工具应该是调试C代码时的第一道防线。我很少专门打开我的汇编文件,试图追踪我的C代码中的错误。我经常出于好奇而打开它。
如果您有兴趣了解一般的装配,那么有很多材料只是谷歌的简短搜索,以及关于这个主题的各种好书。我在学校使用的一本书(仍在使用)是Computer Systems: A Programmer's Perspective,它没有涵盖太多的装配,但会从程序员的角度教你低级计算。它将解释我们作为程序员如何编写低级计算代码,我认为这是您问题的核心。
简而言之:我鼓励任何人探索汇编,但在尝试通过查看汇编来调试C代码之前,我建议使用其他工具进行调试。
答案 1 :(得分:1)
掌握有关知识可以帮助您取消学习计划中的内容。特别是缓冲区可能难以追踪,在最坏的情况下,应用程序在某些地方完全无关,你不知道它是如何到达那里的。如果编译器有错误并且你不知道为什么你的编码没有做它应该做的事情,它也会有所帮助。
一种简单的方法是编写一个小而简单的C程序,让编译器为您生成汇编文件。然后,您可以查看生成的实际代码,而无需了解段设置和声明数据的所有丑陋细节。
例如:
main()
{
int a = 3,
int b = 5;
int c = 0;
c = a+b;
printf("%d\n", c);
}
一个简单的程序,你确切知道它应该做什么。查看生成的代码可以让您了解它是如何工作的,并且您可以继续使用更复杂的东西,即使用指针等。
所涉及的指示并不复杂,如果没有深入的装配知识,可以很容易地理解。
答案 2 :(得分:0)
我不确定你到底想要什么。但是下面的链接可能对你有用
答案 3 :(得分:0)
我同意汇编程序的知识可以帮助您调试c程序。我建议你做两件事。随意混合和混合: - )
首先:获取有关x86(IA-32)汇编语言的介绍性书籍。有几本好书可供选择:
“Linux中汇编语言编程指南”
“x86处理器的汇编语言”
购买或在您的图书馆(libgen / bookfi)查看。我阅读了“Linux中汇编语言编程指南”,这是一个好的开始。我很想回顾一下“x86处理器的汇编语言”。是的,这些都是相当大的书籍,但它们也有很长的介绍,你可以(想)跳过,你不必阅读书籍到最后只是为了介绍汇编程序。
SECOND:编写简单的c程序并使用gcc -S将它们编译为汇编程序,并使用gdb逐步完成它们并尝试理解它们的作用。如果您无法弄清楚指令将会执行哪些指令,那么您将找到大量可以帮助您的教程和注释代码。
如果你不像你希望的那样快速地理解一切,不要气馁。现在,你得到了汇编程序的介绍,是时候加强了(游戏/板块/其他)。试着例如跟随(即在大脑/机器中运行和调试代码)这些帖子:
http://www.phrack.org/issues.html?issue=49&id=14#article 这是Aleph One公认的“粉碎堆栈的乐趣和利润”。你会发现这个网站上发布了很多关于这篇文章的遗物;-)但要注意:如果你想在家里试试这个,请使用gcc -fno-stack-protector。
https://blogs.oracle.com/ksplice/entry/hello_from_a_libc_free 这不是一篇关于汇编语言的文章,但它对你的问题是正确的。它使用汇编程序和其他工具的理解来创建(调试)一段代码,它非常详细,它将为您提供有关调试有用的技能的进一步提示。
现在您将看到,不仅汇编器的知识是有用的,而且对堆栈和堆栈机制(以及调试工具,d!哦)的深入理解是成为一个好的调试器所必需的。
我希望这能找到你。和往常一样 - 负责任地破解。