我是一名DSP,嵌入式软件程序员,希望提高我的汇编语言编程技巧。在我职业生涯的7年里,我一直在使用C,Matlab编程,只需要一点汇编语言编码。 (ARM组装,DSP处理器组件)。
现在我希望通过大量的方法提高我的汇编语言编码技能(它可以是任何汇编语言,无关紧要),并将其提升到“专家级”。我知道编程更多就是它的方法,但我在这里问的是:
人们在汇编语言(任何)编码方面的经验,这是他们多年来用汇编语言编写的。
学习新汇编语言时要记住的准则
汇编语言中高效,正确编码的具体提示和技巧
如何有效地将给定的C代码转换为最佳汇编代码
如何清楚地理解给定的汇编代码
如何跟踪其中包含操作数的寄存器,堆栈指针,程序计数器,如何更深入地理解底层架构及其为程序员提供的资源等。
基本上我想从那些做过详尽和密集的汇编语言编程的人那里获得一些“真实生活”的提示。
谢谢。-AD
答案 0 :(得分:19)
答案 1 :(得分:6)
一个好的起点是Jeff Duntemann的书, Assembly Language Step-by-Step 。这本书是关于Linux下的x86编程。我记得,本书的前一版本涵盖了Windows下的编程。这是一本初学者的书,从头开始:位,字节,二进制算术等。如果你愿意,你可以跳过那部分,但至少可以略过它。这可能是一个好主意。
我认为学习ASM编码的最佳方法是1)学习硬件的基础知识然后2)研究其他人的代码。我上面提到的这本书是值得的。您可能也对The Art of Assembly Language Programming感兴趣。
在我的时间里,我做了很多汇编语言编程,尽管在过去15年左右的时间并不多。正如一位评论者指出的那样,当我考虑到与高级语言相比增加的开发和维护时间时,很小的尺寸和性能增益很难证明。
那就是说,我不会劝阻你在ASM中提高效率。熟悉处理器在该级别的工作方式也只能提高您的HLL编程技能。
答案 2 :(得分:1)
这是一个相当广泛的问题,但我可能会为你准备一些花絮。我已经编码(按照出现的顺序)BAL(IBM 360 Assembly),8080A / 8085,8086 / 8088/80186,触及68000(但实际上并不多),以及80960汇编语言,加上一点Sparc(虽然这是在大学的一个班级,所以我不记得细节)。我的长处总是嵌入式系统,虽然在我晚年我实际上在做网站和摔跤JavaScript怪异。我确实喜欢我多年的汇编语言,现在对我们这些老人来说没有工作......
我有一些提示给你。首先,你必须学习芯片寄存器;每个用于什么,是通用,浮点数学等的特殊目的。二,标志;哪个测试触发哪个标志,并在此时找到设置AND清除这些标志的指令。他们通常很容易,比如CLC('清除随身携带' - 8086/88/186)。找出芯片是大端还是小端,即从左到右的位从高到低,反之亦然。
比特操纵命令也很重要,例如OR,XOR,转移进位标志等
然后是记忆的写作;你的芯片汇编语言如何执行此操作?你能直接写入记忆吗?非常依赖于您的硬件设置。用于将立即值写入寄存器的命令?因为基本上你正在进行数据移动:寄存器和内存之间。内存寻址是平坦的(希望)还是分段的(aiiiiigh!)。
如果您有计时问题,就像您需要编写代码以免浪费任何问题一样,您将需要设置一个测试框架。记录开始时间,记录结束时间以及介于两者之间的代码。我学习汇编语言的全部理由是因为当你想要快速的时候,你在大会上写道。
首先,在完成大写之前,先编写简短的测试版本。弄清楚如何确定结果是否完成(并非所有东西都有LED点亮,尽管它们使生活更轻松)。我用过分析仪;嵌入式系统并不总是直观的。首先采取一些小步骤。
如果您有编译器,请查看为您的特定芯片生成的汇编代码。尝试使用小C函数添加2个数字,然后查看生成的代码。这样做你会学到很多东西。不要让Assembler指令压倒你
我在这里闲聊,我想你明白了。从小处开始,测试,学习芯片,确保工程师为您提供写入位置,写入内容。它一直在......
无论如何,祝你好运。我学到了,因为我们必须这样做,而且我非常喜欢它。我变得非常擅长优化(我很喜欢Michael Abrash的汇编语言之禅),但是英特尔芯片的编译器已经得到了非常高度的优化,因此通常不需要汇编语言程序员。请享用!
答案 3 :(得分:0)
最好的方法是编译C内容并查看输出并搜索您不知道的指令的文档。经验将伴随着时间......