一、 学习过程

从C语言的角度提出一些问题,这些问题再从汇编的角度考虑,还真的很有意思。

(1) 我们用高级语言编程时,一般不可能不用到变量,但是一定要用到变量吗?还有这些变量从汇编的角度是怎么实现的呢?毕竟寄存器和内存空间是不可能存储一个变化的值的,要改变寄存器和内存空间的值,只有重新赋值。但是原来老师讲过,变量的声明是给变量名开辟一个固定大小的内存空间,所以声明变量时一定要给定变量类型。如果不用变量的话,可以给每次要用到的参数重新赋值,但这样就不能用循环等结构,会造成代码重复冗长。

(2) C语言规定程序一定要从main函数开始运行,汇编规定程序要从end后面的标号(一般是start)开始运行,那么这两者有什么联系呢?是main函数在编译时会变成start代码段吗?如果汇编里end后面没有标号,程序会从顶部从上到下开始执行,那么如果C语言里面没有main函数,程序会由上到下执行吗?汇编里的start标号可以用其他标号代替,C语言里可不可以用其他函数代替main函数呢?

(3) Printf函数可以接受不定量的参数,开始我觉得这没什么,但后来想了一下。我们自己定义的函数只能接受固定数量的参数,printf函数的这个功能是怎么实现的呢?看了下函数原型,又查了下资料,printf使用了一种比较少见的语法叫“可变长参数”。但是我看了下资料介绍的实现可变长参数的宏VA_list如下:“(1)首先在函数里定义一个VA_LIST类型的变量,这个变量是指向参数的指针;(2)然后用VA_START宏初始化刚定义的VA_LIST变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数;(3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型,如果函数有多个可变参数的,依次调用VA_ARG获取各个参数;(4)最后用VA_END宏结束可变参数的获取。”但是如果要自己写一个printf()函数的话,我觉得对于我还是相当有难度的。

二、 解决的问题

(1) C语言程序一定要用到变量吗?答:可以不用变量,但是用变量写程序更加简洁方便。

(2) C语言程序怎么实现变量的功能的?答:声明变量开辟内存空间再接受赋值。

(3) printf函数的接收参数数量不定的功能是怎么实现的呢?答:使用可变长参数的语法。

三、 未解决的问题

(1) C语言编译时函数是怎么转化函数代码段地址的?

(2) 如果C语言里面没有main函数,程序会由上到下执行吗?

(3) C语言里可不可以用其他函数代替main函数呢?

四、 学习感想

我们往往为自己一贯的思想和别人的看法所束缚,这样其实是很可悲的,而且更可悲的是我们平时没有想法也没有动力去搞清楚这些东西。只是简单的会用就觉得这东西也就那样了。但是其实简单的东西也不简单。Printf函数有那么多人用,有多少注意到它与别的函数的不同呢?特别是在写程序时,往往就是自己觉得最不可能出错的地方错了,结果把代码翻来覆去看了多少遍也找不出bug来。我们平时在学习时,一定要注意细节,在编程时,思维一定要缜密,这样才能减少错误,增加自己的效率。

从汇编来看c语言的更多相关文章

  1. 从汇编来看c语言之指针

    一.基础研究 将下面的程序编译连接,用debug加载: 首先执行第一条语句: 发现p=(unsigned char *)0x1000;在这里是把1000赋给一个偏移地址为01af.大小为两字节的内存空 ...

  2. 从汇编来看c语言之变量

    1.基础研究 对如图程序进行编译连接,再用debug加载. 我们在偏移地址1fa处查看main函数的内容: 执行到1fd处,发现n的偏移地址为01a6,段地址存储在ds寄存器里,为07c4. 再查看函 ...

  3. 从linux0.11中起动部分代码看汇编调用c语言函数

    上一篇分析了c语言的函数调用栈情况,知道了c语言的函数调用机制后,我们来看一下,linux0.11中起动部分的代码是如何从汇编跳入c语言函数的.在LINUX 0.11中的head.s文件中会看到如下一 ...

  4. [汇编与C语言关系]2. main函数与启动例程

    为什么汇编程序的入口是_start,而C程序的入口是main函数呢?以下就来解释这个问题 在<x86汇编程序基础(AT&T语法)>一文中我们汇编和链接的步骤是: $ as hell ...

  5. keil or c51 汇编调用c语言函数 容易忽视的问题

    最近,在用keil 写一个小程序时,想实践一下从汇编调用 C语言函数,我们都知道C语言调用汇编函数讨论得较多,但反过来,从汇编中调用C语言的函数未见深入分析:在开始的时候,还是忽视了一个问题,就是对现 ...

  6. C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质

    事情的经过是这种,博主在用C写一个简单的业务时使用递归,因为粗心而忘了写return.结果发现返回的结果依旧是正确的.经过半小时的反汇编调试.证明了我的猜想,如今在博客里分享.也是对C语言编译原理的一 ...

  7. 汇编、c语言、c++的一些想法。

    学习C++的过程中一直有懂一点和迷糊的情绪伴随. 这几天在学习C++的变量定义.变量声明.数据类型等等.很多时候,跟我想的内容不一样.经常是,只知道这个东西是这样子的.却不知道,这个东西能在程序中有什 ...

  8. 汇编与C语言混合 实现的从小到大的冒泡排序

    汇编实现的从小到大的冒泡排序 主函数由C语言实现,sort函数用汇编语言写 #include <stdio.h>  int buffer[256];      //数据缓冲区  int   ...

  9. C语言的本质(32)——C语言与汇编之C语言内联汇编

    用C写程序比直接用汇编写程序更简洁,可读性更好,但效率可能不如汇编程序,因为C程序毕竟要经由编译器生成汇编代码,尽管现代编译器的优化已经做得很好了,但还是不如手写的汇编代码.另外,有些平台相关的指令必 ...

随机推荐

  1. Xamarin.Forms-webservices访问

    虽然xamarin.android/ios 均支持右键添加web引用方式引用webservices,但是xamarin.forms不支持此方式,而如果android/ios各做一套采用抽象方式实现则工 ...

  2. rsyslog Properties 属性:

    rsyslog Properties 属性: 数据项 在rsyslog 是被称为 "properties". 它们可以有不同的源, 最重要的是 那些来自接收的消息,但是还有其他. ...

  3. JavaScript IDE 大盘点,让选择不再难

      文章来源:http://gcdn.gcpowertools.com.cn/showtopic-24110-1-3.html 阅读本文之前,分享大家一张图片,看图会发现JavaScript开发需求最 ...

  4. 算法导论(第三版)Problems2(归并插入排序、数列逆序计算)

    讨论内容不说明,仅提供相应的程序. 2.1:归并插入排序θ(nlgn) void mergeInsertionSort(int a[], int l, int r, int k) { int m; & ...

  5. JAVA面向对象总结

    面向对象概述       面向对象是当前计算机界关心的重点,它是90年代软件开发方法的主流.面向对象的概念和应用已超越程序设计和软件开发,如数据库系统.交互式界面.应用结构.应用平台.分布式系统.网络 ...

  6. 深入理解linux网络技术内幕读书笔记(六)--PCI层与网络接口卡

    Table of Contents 1 本章涉及的数据结构 1.1 pci_device_id结构 1.2 pci_dev结构 1.3 pci_driver结构 2 PCI NIC设备驱动程序的注册 ...

  7. ID3算法(决策树)

    一,预备知识: 信息量: 单个类别的信息熵: 条件信息量: 单个类别的条件熵: 信息增益: 信息熵: 条件熵:(表示分类的类,表示属性V的取值,m为属性V的取值个数,n为分类的个数) 二.算法流程: ...

  8. SQL - 配置SQLServer 使其可以远程访问

    环境: SQL Server2008 R2 SQL Server Management Studio 今天测试部署项目的时候,发现不能远程访问SQL Server.具体情形就是在Management ...

  9. (原)Mac下Apache添加限制IP线程模块:mod_limitipconn.so

    1.下载:http://dominia.org/djao/limit/mod_limitipconn-0.24.tar.bz2 解压到一个目录:我的是~/Download/mod_limitipcon ...

  10. 文件上传插件Uploadify在Struts2中的应用,完整详细实例

    —>最近由于项目需要使用到一个上传插件,在网上发现uploadify挺不错,所以决定使用它,但是官网文档和例子是php的,而项目是SSI框架的,所以自己对uploadify在struts2中的使 ...