是否有一本好书或网站可以很好地解释所有汇编指令的含义,并说明如何执行相对简单的任务(闪烁LED等),适用于PIc微控制器?
编辑:这篇文章的主要目的是请求学习汇编的资源,而不是讨论在PIC中使用C和汇编的优缺点,或者PIC是否是一个“好”的微控制器。 我正在使用PIC18微控制器,如果有区别,请告诉我。
有多种不同指令集的PIC架构。例如,Microchip与Atmel AVR相比缺乏架构一致性。因此,您需要指定您正在使用的是哪种类型的PIC,例如:PIC12、16、24、32等。
首先,我建议您避免使用PIC汇编语言,因为您在PIC12上学到的知识可能并不适用于PIC24。其次,作为软件开发人员,如果有可能,我会尽量避免使用PIC——尽管我承认还有其他考虑因素,而且您可能没有选择。
你可以选择不使用汇编语言。虽然低端PIC可能不太适合于C代码生成,但这是编译器编写者的问题;在开发时间方面,使用C仍然更具成本效益。另一方面,对于高产量产品,如果您可以通过使用汇编语言将代码适配到较小的部件中,那么这可能是一个因素。在测试C解决方案之前就决定需要汇编语言通常是“过早的优化”。即使C实现未能满足大小或时间限制,您也可以将其称为原型,然后重新编码以满足限制。这样做可能仍然比从头开始编写汇编代码并同时应对设计和指令集要快。告诉老板你会在C中进行原型设计,当它达到要求时,没有人想浪费金钱重新编写不可移植、难以维护的汇编代码。最后回答您的问题,假设您需要快速高效地完成工作,请尽可能使用Microchip的示例和应用笔记,并熟悉制造商指令集参考中的指令集。低端部件的指令集不是很大。对于日常工作,我喜欢使用“指令集参考卡”作为辅助记忆 - 它总结了每个指令的所有重要细节,通常在几页内 - 双面打印并覆膜! ;). 这里有一个PIC16示例
PICList(PIC邮件列表):http://piclist.com/。
具体而言,
我相信编写反汇编程序。从一个非常简单的一两行程序开始,将一个寄存器加载到一个常量中(可能需要阅读教程或其他资料来学习这一步骤)。然后进行汇编。将二进制代码以你能够编写程序读取的格式保存下来(例如intel hex或elf格式)。
编写一个程序来读取二进制文件并提取程序,然后将这些字节编写成反汇编程序(即使供应商已经有了反汇编程序,你仍然应该编写自己的)。
现在开始迭代这个过程,逐个学习新指令或使用指令的新方法。为每个指令或选项编写反汇编代码。尝试编写汇编代码来操作指令中的每个位。
当你完成指令集时,你将比大多数每天使用它的人更加了解指令集,你将知道如何为每个操作码的每个选项编写汇编程序,你还可以了解为什么某些指令只能从其位置访问N个字节,而其他指令可以访问任何内容,或者某些指令只能使用N位立即数,而其他指令可以使用任何值。就是这样。
我已经使用这个过程很多次,并学习了许多指令集,但结果可能因人而异。在前几次之后,上述过程可能只需要一个下午就能完成。
编辑:
这里的目标是教育,而不是下一个伟大的sourceforge项目。输出可以难看或不完整,因为你是唯一一个会阅读它的人。
注意:对于可变长度指令集的通用反汇编器可能有些困难,你不想线性地反汇编二进制文件,而是要跟踪所有执行路径。我建议避免使用它。即使在可变长度指令集上,对于执行相对线性的简单程序进行组装和反汇编也不难。通过反汇编和检查C编译器(或其他高级语言)的输出,您可以学到关于指令集的很多知识。如果编译器没有汇编器输出选项或没有反汇编器,您可能无法利用它(除非它是固定长度指令集)。
还要注意的是,一旦您学会了某个处理器的汇编语言,第二个就会更容易,以此类推。从一个处理器到另一个处理器需要学习的东西通常是跳跃的大小、立即数、间接寻址规则等与查看操作码直接相关的所有内容。您可以在不查看操作码的情况下学习它,但必须依赖文档或汇编程序错误消息的高质量。