Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
嵌入式系统中汇编语言到C语言的转换_C_Assembly_Embedded - Fatal编程技术网

嵌入式系统中汇编语言到C语言的转换

嵌入式系统中汇编语言到C语言的转换,c,assembly,embedded,C,Assembly,Embedded,我需要一些建议来了解如何用C语言为微控制器开发程序。我已经在汇编中为微控制器atmega开发了程序。我可以说我有一些经验,因为我开发了一些传感器、马达伺服器、SD卡等的驱动程序 现在我正在尝试用C语言为微控制器开发程序。我有一些C语言的经验,但只在基于linux的计算机(PC)上。当我试图用C语言为一个特殊的微控制器开发一些程序时,我感到困惑。我不知道,当我编写代码时应该遵循哪种方法。当我在汇编中编写代码时,我总是阅读Micron控制器的数据表。我负责所有寄存器,以便正确使用它们。但是,当我在C

我需要一些建议来了解如何用C语言为微控制器开发程序。我已经在汇编中为微控制器atmega开发了程序。我可以说我有一些经验,因为我开发了一些传感器、马达伺服器、SD卡等的驱动程序

现在我正在尝试用C语言为微控制器开发程序。我有一些C语言的经验,但只在基于linux的计算机(PC)上。当我试图用C语言为一个特殊的微控制器开发一些程序时,我感到困惑。我不知道,当我编写代码时应该遵循哪种方法。当我在汇编中编写代码时,我总是阅读Micron控制器的数据表。我负责所有寄存器,以便正确使用它们。但是,当我在C中使用函数时,我使用它们时并不知道该函数使用了哪些寄存器

第一个问题Q1

我需要了解我可能在程序中使用的函数的内容吗

第二个问题Q2

当我开始用c语言为微控制器编写程序时。我应该做的第一步是什么

(1) 我应该从阅读数据表开始吗

(2) 我应该首先寻找集成在微控制器库中的方法,然后开始编写我的程序。当我需要更准确的信息时,我可以查看数据表


我不想像对待assemby那样浪费时间。我认为第二种方法比第一种更好。嵌入式软件专业人士有什么建议吗?

当你用C语言编写微控制器时,你可以不再担心诸如CPU寄存器分配和堆栈管理之类的“小事”,而是花时间开发你需要提供的功能。当然,这是以将一些控制权委托给编译器为代价的。然而,这通常是一个很好的折衷方案,因为寄存器和堆栈跟踪可以由计算机来完成,以实现与手动操作更高或同等的效率。计算机还消除了人工管理寄存器分配时可能引入的愚蠢但难以发现的错误


然而,这并不意味着您可以忘记微控制器的数据表:诸如管理ISR和I/O引脚之类的事情仍然是您的责任。最好检查编译器为您的ISR生成的代码,以确保没有意外,甚至可以在汇编中对您的ISR进行编码。

您可以为编译器保留正常的寄存器分配。当然,在某些情况下,您必须将变量或函数放在ROM中的固定位置,您可以使用链接器脚本来实现这一点。此外,对于内存较小的微控制器,可能会出现许多问题,如堆栈溢出或碎片整理,我认为调试器可以在这一步中帮助您


你不能离开数据表,我用c语言为AVR开发,总是看数据表。如果您想自己创建驱动程序库而不包括其他库,您将经常使用它。

您需要花时间理解C。了解易失性,内存障碍,为什么为空和不为0,为什么要避免强制转换,内存中的结构是如何压缩的,以及它们的小端和大端、压缩或不压缩的差异,可能还有函数调用期间堆栈的外观、浮点参数在体系结构中的传递方式、函数中静态变量的工作方式、何时在声明中使用const以及许多编译器标志的作用等等。从标志
-Wall
开始

如果编译器为您分配寄存器,那么您所能做的就是信任它。或者不信任它。(对不起,我看不出你的问题)你不知何故不愿意在不了解所有底层硬件的情况下用C为电脑编程。为什么微控制器应该有所不同?就CPU寄存器而言,它们是由编译器管理的,正如joop所说,你不必担心它们,除非你也在编写与C接口的汇编语言代码。在这种情况下,你需要学习目标的调用约定。就设备寄存器而言,您通常认为您调用的函数知道它们在用它们做什么。他们应该记录可能对设备状态产生的任何副作用。即使是@x86,当查看生成的程序集时,我也常常对寄存器的选择感到惊讶。但这一切似乎都起了作用。(IMHO x86越来越倾向于RISC:专用寄存器越来越少,通用寄存器越来越多。)但一旦你忘记了AL、BX、CX、AX:DX、ES:DI和DS:DI等,你就会习惯它。@joop:Universal registers不是RISC功能-请参阅32000、680x0等。Oto Transputer是RISC,只有三个寄存器。x86在应用程序级别上绝不会接近RISC。实际上,第一部分也应该在一定程度上加以限制。作为旁注,编译器的文档与微控制器数据表一样重要。这是一个文档,它将告诉您编译器是否偏离了标准C语言以及偏离程度。例如,8位pic没有堆栈,但编译器仍然允许函数调用(尽管不可重入)。文档还将告诉您如何访问重要的端口和寄存器(甚至有一个功能)。@EugeneSh。假设您信任您的编译器,我发现不再担心纯机械的事情是可以的,在汇编代码中编写代码时,我必须记住这些事情。当我从微控制器汇编转换到C时(大约20年前发生在我身上),我曾经在运行代码时仔细检查反汇编,但随着我越来越信任我的编译器,我最终转换到源代码级调试,反汇编很少。@dasblinkenlight这不完全是我所说的。你还需要知道你的记忆力