单片机编程中C语言和汇编的差异

发布者:快乐旅途最新更新时间:2012-11-15 来源: 21IC 关键字:单片机编程  C语言  汇编 手机看文章 扫描二维码
随时随地手机看文章

    最近对比了下C语言和汇编两种语言在单片机领域的差异。汇编作为低级语言,是仅次于机器语言和硬件联系最紧密的语言;而C语言,严格的说也只能算是半个高级语言,相对于其他高级语言来说。这两者比较直观的差异是:汇编语言的实时性非常好,但可读性差,可移植性不强;相反,C语言的可读性强,可移植性高,但实时性比较差。

    利用C语言编写单片机程序,不用考虑程序的初始化地址,不用考虑ACC,PSW以及工作寄存器的保护,不用考虑溢出进位CY。而汇编这些都需要考虑到。

    今天在编写温度计程序的时候遇到了这个问题,因为以前是用汇编写的,现在翻译成C,在处理负数转换的时候遇到了问题。因为如果温度计转换芯片读出来的是负数,他是以反码的形式表示的,需要对其取反加一。这样就不得不考虑加一后可能溢出的情况。在汇编里这种情况处理起来很简单,低位字节的加法用ADD指令,高位字节用ADDC,这样,如果低位有溢出,CY会置一,高字节ADDC在计算时会将进位CY计算在内。但在C里面就不是这回事了。低字节有溢出,不会影响高字节的加法,这样计算的结果是错误的。请教了下高手,解决方法可以嵌入汇编,也可以直接使用ACC和CY,即每次高位的加法前要先判断CY的值,为1则多加1,为0则正常加法。因为在引用的reg51.h的头文件里包含了这些寄存器和标志位的定义。

    这里有一个典型的例子:http://www.51hei.com/mcu/710.html  大家可以从中悟出汇编和c的区别在实际应用中好好把握就行了

    当然c语言的简单与方便这是汇编不能比的,我个人觉得把单片机c语言和汇编语言结合来编成是最好的。在需要很精确的地方就嵌套一个汇编的子程序,其他就用c语言。


  这些只是本人在平时的实践中作出的小小总结,还请高手给出意见。如有不对,还请批评指出。共同切磋共同进步!

关键字:单片机编程  C语言  汇编 引用地址:单片机编程中C语言和汇编的差异

上一篇:按键与数码管汇编例程
下一篇:简易红外电脑遥控器

推荐阅读最新更新时间:2024-03-16 13:13

c语言复习+MDK中寄存器地址名称映射
C语言复习: 一、位操作:6种操作运算符 二、define宏定义关键词 define是C语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供方便。 常见的格式: define标识符字符串 “标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。 例如: #define SYSCLK FREQ 72MHz 72000000 //定义标识符SYSCLK FREQ72MHz的值为72000000 三、ifdef条件编译 单片机程序开发过程中,经常会遇到一种情况,当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。条件编译命令最常见的形式为: #ifdef标识符 程序段1 #e
[单片机]
<font color='red'>c语言</font>复习+MDK中寄存器地址名称映射
AMPIRE12864液晶C语言代码
#include iom16v.h #include macros.h #define uchar unsigned char #define uint unsigned int #define RS_H() PORTD|=BIT(4); #define RS_L() PORTD&=~BIT(4); #define RW_H() PORTD|=BIT(5); #define RW_L() PORTD&=~BIT(5); #define E_H() PORTD|=BIT(6); #define E_L() PORTD&=~BIT(6); #define CS1_L() PORTA&=~BIT(6);//左屏 #
[单片机]
AMPIRE12864液晶<font color='red'>C语言</font>代码
51单片机C语言学习笔记1:MCS-51系统结构
51单片机管脚图 51单片机系统结构 传统的51单片机是DIP40(双列直插40管脚)的,也有PLCC44的,多用于板子要求紧凑的场合。如果想占地较少,可以用2051,管脚只有20。当然增强型51芯片封装多样,有TQFP48等等小体积的,兼容51指令集,并且在传统51的功能上有了很多的提高,如AD、USB等等,这也是51单片机还能胜任现在多种应用的原因。还是让我们看看传统51单片机的系统结构。 ●8位bit CPU。 ●片内时钟振荡器。 ●4KB(4K字节)程序存储器ROM。 ●片内有128B(128字节)数据存储器RAM。 ●可
[单片机]
GNU ARM汇编的.balignl对齐实验
在u-boot的start.s源文件中出现 .balignl 16 0xdeadbeef 语句,这条语句是实现地址对齐的。 .balignl与. align类似,完整的laign语句格式为:.align {alignment} {,fill} {,max} alignment用于指定对齐方式,可能的取值为2的次幂,缺省为4。fill是填充内容,缺省用0填充。max是填充字节数最大值,如果填充字节数超过max, 不进行对齐。 下面分4种情况进行对比: 1.正常情况 .word 0x12345678 .global _end_vect _end_vect: .balignl 16,0xdeadbeef 此时.balignl位于
[单片机]
GNU ARM<font color='red'>汇编</font>的.balignl对齐实验
ARM GNU 汇编伪指令简介
一.什么是汇编伪指令 汇编指令语句 每一条指令语句在源程序汇编时都要产生可供计算机执行的指令代码(即目标代码),所以这种语句又叫可执行语句。每一条指令语句表示计算机具有的一个基本能力,如数据传送,两数相加或相减,移位等,而这种能力是在目标程序(指令代码的有序集合)运行时完成的,是依赖于汁算机内的中央处理器(CPU)、存储器、I/O接口等硬件设备来实现的。 汇编伪指令语句 伪指令语句是用于指示汇编程序如何汇编源程序,所以这种语句又叫命令语句。例如源程序中的伪指令语句告诉汇编程序:该源程序如何分段,有哪些逻辑段在程序段中哪些是当前段,它们分别由哪个段寄存器指向;定义了哪些数据,存储单元是如何分配的等等。伪指令语句除定义的具体数
[单片机]
汇编语言学习笔记——————第一个程序
一个汇编语言从写出到最终执行的简要过程 大体分为以下三步: 第二步执行的操作是使用汇编语言编译程序对源程序文件中的源程序进行编译,产生目标文件;再用链接程序对目标文件进行连接,生成可在操作系统中直接运行的可执行文件。 第三步中,操作系统依照可执行文件中的描述信息,将可执行文件中的机器码和数据加载到内存,设置CS:IP指向第一条要执行的指令,然后由CPU执行程序。 下图是从汇编程序从写出到执行的详细步骤。 编写源程序 assume cs:code code segment start:mov ax,2000h mov ds,ax mov al,ds: ;在汇编源程序中,如果用指令访问一个内存单元,
[单片机]
<font color='red'>汇编</font>语言学习笔记——————第一个程序
704H减44H等于660H,用51的汇编语言怎么写?
这个题目用51单片机的汇编语言来做,实际上是进行两个字节的BCD码的减法。 列出竖式如下: 07 04H - 00 44H -------------- 06 60H 由于51单片机的特点,BCD码的减法,必须要用加法进行,方能进行“十进制调整”。 为此,事先要求出“减数的补数”。 程序如下: BCD2BY_J: MOV A, #9AH CLR C SUBB A, #44H ;求出44H的补数 ADD A, #04H DA A MOV R3, A ;04H - 44H - R3 MOV A, #9AH CPL C ;进位处理的好 SUBB A
[单片机]
MCS-51单片机汇编中的“指针”
111条单片机指令中让我想起高级语言中的指针的功能。 数据传送类指令中的 指针 1)MOV A,@Ri 2)MOV direct,@Ri 3)MOV @Ri,A MOV @Ri,direct MOV @Ri,#data8 4)MOVX A,@Ri MOV A,@DPTR 5)MOVX @Ri,A 6)MOVX @DPTR,A @:指向的意思。
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved