学习PIC微控制器汇编语言的最佳资源是什么?

7
我将开始进行一个项目,需要我对PIC微控制器的汇编语言有相当的了解。我非常熟悉C/C++,所以我知道如何编写代码,并且我已经完成了许多PIC的项目,所以我了解其体系结构,但是我所有的编程都是用'C'完成的。
是否有一本好书或网站可以很好地解释所有汇编指令的含义,并说明如何执行相对简单的任务(闪烁LED等),适用于PIc微控制器?
编辑:这篇文章的主要目的是请求学习汇编的资源,而不是讨论在PIC中使用C和汇编的优缺点,或者PIC是否是一个“好”的微控制器。 我正在使用PIC18微控制器,如果有区别,请告诉我。
5个回答

5

有多种不同指令集的PIC架构。例如,Microchip与Atmel AVR相比缺乏架构一致性。因此,您需要指定您正在使用的是哪种类型的PIC,例如:PIC12、16、24、32等。

首先,我建议您避免使用PIC汇编语言,因为您在PIC12上学到的知识可能并不适用于PIC24。其次,作为软件开发人员,如果有可能,我会尽量避免使用PIC——尽管我承认还有其他考虑因素,而且您可能没有选择。

你可以选择不使用汇编语言。虽然低端PIC可能不太适合于C代码生成,但这是编译器编写者的问题;在开发时间方面,使用C仍然更具成本效益。另一方面,对于高产量产品,如果您可以通过使用汇编语言将代码适配到较小的部件中,那么这可能是一个因素。在测试C解决方案之前就决定需要汇编语言通常是“过早的优化”。即使C实现未能满足大小或时间限制,您也可以将其称为原型,然后重新编码以满足限制。这样做可能仍然比从头开始编写汇编代码并同时应对设计和指令集要快。告诉老板你会在C中进行原型设计,当它达到要求时,没有人想浪费金钱重新编写不可移植、难以维护的汇编代码。

最后回答您的问题,假设您需要快速高效地完成工作,请尽可能使用Microchip的示例和应用笔记,并熟悉制造商指令集参考中的指令集。低端部件的指令集不是很大。对于日常工作,我喜欢使用“指令集参考卡”作为辅助记忆 - 它总结了每个指令的所有重要细节,通常在几页内 - 双面打印并覆膜! ;). 这里有一个PIC16示例


我完全同意。我曾经用汇编语言进行PIC编程,其实学习指令集并不难。然而,在如此低的层次上编程并不是一件愉快的事情——C要好得多。除非有强制使用汇编语言的商业理由,否则我会选择C(并远离PIC)。 - Craig McQueen
1
对于较小的旧图片,汇编比C更快、更容易,并且结果更好。新的pic32是从mips派生而来,因此完全不同。学习pic汇编可能意味着需要掌握两到三个不同的指令集,所以我完全同意您需要指定您所讨论的PIC。 - old_timer
即使你在使用C语言编程,了解底层的汇编语言也会对你理解编译器如何处理你所输入的内容有很大帮助。 - Crashworks
@dwelch:同意,低端PIC不是很好的C平台,编译器受到严格限制。当“其他考虑因素”(如单位成本)占主导地位时,您会使用这些选项。此外,关于名称PIC,它已经成为营销工具而不是架构——PIC32与以前的设备没有任何关系。我不确定PIC32在与ARM争夺32位市场方面有多大机会取得成功。@Crashworks:在嵌入式系统中尤其如此,但能够阅读汇编语言并不需要您能够编写它。 - Clifford

2
可能我回复有些晚了,但是你可以从这个实验室课程中受益,这是一个主要用于通过应用程序学习PIC汇编的实验室课程。请查看以下链接:http://embedded-ju.ucoz.com/。在实验选项卡中,包括以下内容:
- 实验0 - (MPLAB介绍) - 实验1 - (PIC汇编指令集简介) - 实验2 - (更多指令集和模块化编程技巧) - 实验3 - (基本系统分析与设计) 3.1 硬件指南 - 实验4 - (LCD-HD44780) - 实验5 - (键盘) - 实验6 - (使用HI-TECH C编译器在MPLAB中编程) 6.1 ICD2指南 - 实验7 - (定时器(Timer0和Timer2)) - 实验8 - (USART) - 实验9 - (软件PWM和A/D)
此实验室课程基于PIC 16系列,尤其是16F84A、16F877A和16F917,示例都有详细的注释,并且实验也都有完整的解释。

2

这是我用来学习一些汇编(为了PIC)的资料,不过,那些未来想要学习的人需要注意:我在教程中发现了一些错误和拼写错误。话虽如此,我仍然觉得这是一个好资源,可以“感受”汇编。学习更多汇编的另一个好资源是Nigel Gardner的《Intro to PIC C》。这是一本关于“C语言”的书,但列出了一些循环如何在汇编中完成,所以也是一个很好的资源。 - Seidleroni
1
链接中的网站已经宕机了! - svarog
它仍然无法使用。这个答案已经失去了任何有意义的价值。 - Robert Columbia
检查 Wayback Machine。例如:https://web.archive.org/web/20100615000000*/http://www.mstracey.btinternet.co.uk/pictutorial/picmain.htm - Piovezan

0

@RobertColumbia:看起来所有的内容现在都可以在Piclist.com上找到了。这个编辑修复了它吗? - David Cary

0

我相信编写反汇编程序。从一个非常简单的一两行程序开始,将一个寄存器加载到一个常量中(可能需要阅读教程或其他资料来学习这一步骤)。然后进行汇编。将二进制代码以你能够编写程序读取的格式保存下来(例如intel hex或elf格式)。

编写一个程序来读取二进制文件并提取程序,然后将这些字节编写成反汇编程序(即使供应商已经有了反汇编程序,你仍然应该编写自己的)。

现在开始迭代这个过程,逐个学习新指令或使用指令的新方法。为每个指令或选项编写反汇编代码。尝试编写汇编代码来操作指令中的每个位。

当你完成指令集时,你将比大多数每天使用它的人更加了解指令集,你将知道如何为每个操作码的每个选项编写汇编程序,你还可以了解为什么某些指令只能从其位置访问N个字节,而其他指令可以访问任何内容,或者某些指令只能使用N位立即数,而其他指令可以使用任何值。就是这样。

我已经使用这个过程很多次,并学习了许多指令集,但结果可能因人而异。在前几次之后,上述过程可能只需要一个下午就能完成。

编辑:

这里的目标是教育,而不是下一个伟大的sourceforge项目。输出可以难看或不完整,因为你是唯一一个会阅读它的人。

注意:对于可变长度指令集的通用反汇编器可能有些困难,你不想线性地反汇编二进制文件,而是要跟踪所有执行路径。我建议避免使用它。即使在可变长度指令集上,对于执行相对线性的简单程序进行组装和反汇编也不难。通过反汇编和检查C编译器(或其他高级语言)的输出,您可以学到关于指令集的很多知识。如果编译器没有汇编器输出选项或没有反汇编器,您可能无法利用它(除非它是固定长度指令集)。

还要注意的是,一旦您学会了某个处理器的汇编语言,第二个就会更容易,以此类推。从一个处理器到另一个处理器需要学习的东西通常是跳跃的大小、立即数、间接寻址规则等与查看操作码直接相关的所有内容。您可以在不查看操作码的情况下学习它,但必须依赖文档或汇编程序错误消息的高质量。


4
你是认真的吗?听起来好像OP必须完成工作,那么谁会支付他采取你建议的方法所需的费用? - Clifford
在下午完成这件事听起来...很快。 - Craig McQueen
是的,非常认真。编程就是编程,它只是语法的问题,通过阅读而不是实践来学习语法是昂贵且缓慢的。试图编写、运行和调试程序仅仅为了学习一条指令是缓慢且昂贵的,这是一个非常便宜、快速和可靠的解决方案。如果你能找到一种在几个小时内无需任何设备(除了一台廉价的计算机和免费的编译器)就能彻底掌握ISA的方法,那就去做吧。(好吧,还需要PDF阅读器和汇编器) - old_timer
你可以通过这种方式来很好地掌握它,但在商业项目中,学习“足够好”的成本更为有效。专业开发人员需要精通技术,但同时也必须明白他们的工作是为了创造财富,而不是成为古怪技术的专家。在一个相当大的项目中,您将在保持生产力的同时学习和提高熟练程度。如果您是把这个作为爱好进行,那么就做自己喜欢的事情吧。我毫不怀疑许多爱好者比许多专业人士更擅长汇编程序设计- 因为他们的动机不同。 - Clifford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接