微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 从哪里来,到哪里去——全面阐述汇编与C的关系

从哪里来,到哪里去——全面阐述汇编与C的关系

时间:10-02 整理:3721RD 点击:
全面阐述汇编与C的关系(1)
      有网友问我,周工——你懂几种汇编?八十年代初期,我熟练掌握了X86的汇编,后来由于长时间不用,当然也就生疏了。如果遇到对C语言理解不透的问题,我则更多地结合80C51的反汇编来分析,所以最精通的还是80C51的汇编。有了这样的基础,从理论上来讲,拿到任何一种微处理器的手册,我都能够使用汇编完成所需要的工作。
     如果你希望成为高手或专家,仅仅熟练“使用”(即不等于彻底掌握和精通)C是远远不够的。只有两方面结合起来,才能做到知其然知其所以然,结论不言自明。很多人都说自己“精通”这个“精通”那个,“精通”二字不是张口就可以说出来的。
     其实,不要小瞧80C51单片机而高看32位ARM,如果你真的“精通”了80C51单片机,那是一件不得了的事情,无论学什么都是小儿科。很多人以为自己会编程,做了几个项目就自以为自己“精通”了,而事实上大多数开发人员仅仅是一个熟练工而已,离精通还相差十万八千里,就开始夜郎自大了。
    挑战:无论是基于前后台还是操作系统的软件设计,都可以无障碍地被所有的项目复用,从而跨越前后台与基于操作系统编程的鸿沟。我们中间有几个人能够做到将前后台的代码一字不改用于操作系统应用程序之中呢?
     其实从事嵌入式软件开发的几乎都是聪明的高素质人才,但是,我们成功了吗?有多少人真正完成了我们新年时定下的设计计划呢?虽然软件的价值是无穷的,看起来任何人都会写代码,但我从创办企业以来,深深地体会到在现实的生活中,只有真正的专家,才可能通过各种各样的方法设计出高质量、不超过预算、能按时提交的软件。我们看了很多书,我们写了很多代码,但实际上有多少人从中得到了帮助呢?如何改变我们的工作,最重要的方法是改变我们的做事方式。
      以下是我的读书笔记,也可以算是我对“精通”的一点理解吧!一旦你掌握了开启智慧大门的钥匙,一切的问题都不是问题,什么ARM,Linux、WinCE都不在话下,因为万变不离其宗。
     关于函数调用
      我们知道,函数调用是C语言最基本的操作之一。C语言的函数可以没有参数,也可以有一个或多个参数。 最简单的C语言函数调用就是无参数函数调用,其应用示例详见程序清单1.1,经过SDCC51编译后,其相应的汇编代码详见程序清单1.2。  
程序清单1.1 无参数函数调用的C语言代码(call1.c)
1   extern void func2(void);
2  
3   void func1 (void)
4  {
5        while (1) {
6              func2();
7        }
8  }
程序清单1.2  无参数函数调用的汇编代码(call1.asm)
99    _func1:
110  00102$:
113  LCALL  _func2
116  SJMP    00102$
   
    由此可见,无参数函数调用(参考程序清单1.1(6))对应的汇编代码非常简单,仅有一条LCALL指令(程序清单1.2(113))。
    当然,还有单字节、双字节、三字节与四字节函数以及两个参数与三个参数的函数调用的情况,在此也就不再一一列出来了。
    关于函数返回
    C语言的函数可以没有返回值,也可以有一个返回值。限于80C51体系结构,SDCC51的汇编语言对有符号变量和无符号变量不加区分。因此变量类型仅限于变量的尺寸,函数返回只有无返回值,返回单字节变量、返回双字节变量、返回三字节变量和返回四字节变量5种情况。   
       1.无返回值   
    无返回值的函数参考代码详见程序清单1.3,与之对应的汇编语言详见程序清单1.4。
程序清单1.3  无返回值C语言代码(ret1.c)
1    void func2 (void)
2   {
3   }
程序清单1.4  无返回值汇编语言代码(ret1.asm)
99    _func2:
112  RET
   
   通过程序清单1.3和程序清单1.4可以看出,无返回值的函数返回代码非常简单,仅一条RET指令而已(程序清单1.4(112))。
       2.单字节返回值   
    单字节返回值的函数参考代码见程序清单1.5,其对应的汇编语言见程序清单1.6。.
程序清单1.5  单字节返回值C语言代码(ret2.c)
1   unsigned char func2 (void)
2  {
3       return 1;
4   }
程序清单1.6  单字节返回值汇编语言代码(ret2.asm)
99    _func2:
110  MOV   DPL, #0x01
113  RET
   
    通过程序清单1.5和程序清单1.6可以看出,函数的返回值是保存在特殊寄存器DPL(程序清单1.6(110))中的,函数通过RET指令返回(程序清单1.6 (113))。
    ......
    函数的返回值通过特殊寄存器传递,根据参数大小依次使用特殊寄存器DPL、DPTR、DPTR+B、DPTR+B+A。
    当然,还有很多,在此也就不一一“作秀”了,因为这毕竟是“小儿科”,希望起到抛砖引玉的作用。
    昨夜因为辛苦,吃了晚饭八点钟就上床睡觉了,因此今天起得早,闲来无事加之很久不上网了,于是写下几句话寄语新一代富有上进心的年轻人。

消灭0回复.

真正的高人!

上一篇:毕业作品
下一篇:基于STm32的mpu6050

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top