c语言高级编程

C高级编程

责任编辑:admin   更新日期:2005-8-6

深入了解C语言(函数的参数传递和函数使用参数的方法)

tangl_99(原作)

关键字 C语言,汇编,代码生成,编译器

C语言生成的代码在执行效率上比其它高级语言都高.现在让我们来看看C语言生成的代码具体是什么样子的.当你看完本文对于C语言的了解一定会更深一步了.

本文通过一个个实际案例程序来讲解C语言.

研究案例一

工具: Turboc C v2.0,Debug,MASM v5.0,NASM

实例C程序:

/* example1.c */

char ch;

int e_main()

{

e_putchar(ch);

}

目标内容:C语言调用函数的方法与细节

我们使用的C编译器是16位的Turboc C v2.0,它生成的是16位的代码,比较简单,方便我们来研究.同时我们也需要用到DOS下的DEBUG来进行反汇编.由于我们很多案例中的程序并不是完整的C程序,所以Turboc下的Tlink并不能为我们生成目标程序,所以我将使用MASM中的link.exe,同时里面的http://doc.xuehai.net也可以为我们把exe文件转换成bin文件.

这个程序没有main函数,我们用e_main来代替main函数.这样我们能避开C语言对main函数进行一系列处理的代码.同样,我们也用e_putchar()来代替我们平常使用的putchar().这里"e"的意思就是"example".

没有了main函数,我们的C程序就没有了入口,所以在开始编译这段C代码之前,我还得写几行简单的汇编代码,通过它来作为我们程序的入口.

; C程序的入口 start.asm

[BITS 16]

[global start]

[extern _e_main]

start:

call _e_main

按照C语言的习惯,所以C总的名词都要自动在前面加一个"_"下划线.所以,我们在C中的e_main函数,如果要在汇编中调用,就变成了_e_main函数.这段汇编代码只有一句:call _e_main,就是调用我们在C中的e_main函数

这段代码我将用nasm来进行编译.生成start.obj

nasmw -f obj -o start.obj start.asm

下面我们用Turboc C来编译这段C代码:

TCC -mt -oexample1.obj -c example1.c

link start.obj example1.obj,example1.exe,,,

exe2bin example1.exe

这样,我们就得到了这段C代码编译出来的机器代码文件(example1.bin)了.

下面我们用DEBUG这个老DOS的工具来对example1.bin进行反汇编.

DEBUG

-n example1.bin

-l 0

-u 0

xxxx:0000 CALL 0003

xxxx:0003 MOV AX,000B

xxxx:0006 PUSH AX

xxxx:0007 CALL 0020

xxxx:000A POP CX

这里看到蓝色的代码就是我们整个C程序的所生成的代码了.

最开始的第一句CALL 0003是我们用nasm编译的start.asm所生成的代码.

我们主要目标是研究蓝色的C语言的代码,第一句start.a

sm所生成的代码太简单,就是调用e_main函数.而我们的e_main函数就是蓝色代码部分.

从C源程序中我们看到,我们在e_main做的就是一件事情:调用e_putchar(ch);其中ch是传给出e_putchar的参数.

MOV AX,000B

000B就是我们

高级编程中C语言属于,c语言高级编程相关推荐

  1. 解析少儿编程中的运用的科技语言

    少儿编程作为一种科技语言是没有国界的,适用于全世界.而在科技发展的今天,编程应用于各个领域.很多国家都意识到编程学习的重要性,因此,采取了各种措施来推广编程教育,如英国将编程列入中小学必修课程中,美国 ...

  2. c语言编程中如何对其,C语言内存对齐详解(3)

    在minix的stdarg.h文件中,定义了如下一个宏: /* Amount of space required in an argument list for an arg of type TYPE ...

  3. C语言编程中 a什么意思,c语言中的是什么意思

    c语言中的&&是什么意思 发布时间:2020-06-17 09:42:10 来源:亿速云 阅读:3076 作者:Leah c语言中的&&是什么意思?针对这个问题,这篇文 ...

  4. c语言编程中野指针错误,C语言(野指针错误)

    realloc引起的coredump 记录一次接口程序在运行过程中产生的崩溃问题,通过调试 core文件,定位到是程序在调用realloc 时候出现了问题 问题程序代码 #include #inclu ...

  5. c语言编程中怎么打汉字,c语言编程中,怎么打汉字啊??我是新手啊~~

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 N久以有写的,图形模式下显示中文的程序,需要ucdos下ASC16,HZK16两个字库文件的支持. 里面的 printdot 函数为自己写的打点函数,非C ...

  6. 编程中生日蜡烛问题c语言,C语言题目。生日攻击。会的麻烦下。。谢谢。

    满意答案 q126elua 2013.07.01 采纳率:48%    等级:12 已帮助:8506人 //此程序在硬件上调试通过 //本程序的单片机晶振采用11.0592M #include sbi ...

  7. 编程中python怎么读-对Python新手编程过程中如何规避一些常见问题的建议

    这篇文章收集了我在Python新手开发者写的代码中所见到的不规范但偶尔又很微妙的问题.本文的目的是为了帮助那些新手开发者渡过写出丑陋的Python代码的阶段.为了照顾目标读者,本文做了一些简化(例如: ...

  8. 在python面向对象编程中、属性分为_Python-面向对象编程(1.概述)

    1.在 Python 中,面向对象编程主要有两个主题,就是类和类实例 a.类和对象是相互关联的,类是实例的定义,实例是类的具像化. b.类分为新式类和经典类 新式类:(注 base 是继承的父类,ob ...

  9. python编程中条件句_简单讲解Python编程中namedtuple类的用法

    Python的Collections模块提供了不少好用的数据容器类型,其中一个精品当属namedtuple. namedtuple能够用来创建类似于元祖的数据类型,除了能够用索引来访问数据,能够迭代, ...

  10. 编程中的蛇形填空问题_在线编程问题当中的蛇形矩阵问题

    源代码如下: #include#includeusing namespace std;int a[100][100];int jlcf[100][100];//bool jc[10000];int s ...

最新文章

  1. Mesos各种存储处理方式
  2. Python学习之==数组(一)
  3. 通过ObjectMapper将实体转成字符串 ,将 用json存的的list 回转list
  4. C语言学习之试编程从键盘输入2*3的二维数组,将该数组行列交换输出。
  5. jar/war/ear文件的区别
  6. SQL中使用正则表达式
  7. net idautomationhc39m条形码字体生成条形码
  8. ARM7开发软件安装步骤
  9. 【FXCG】什么是风险?
  10. 1、关于douyin 小红书等平台 人均985 211的想法
  11. 做游戏与web的区别 - 服务器篇【1】
  12. 微信小程序开发—引用公共js里的方法
  13. php checkmobile,如何在php中檢查請求是來自移動設備還是計算機
  14. 学Android必须懂的
  15. 【分享】订阅用友U8集简云连接器同步费用审批数据至用友U8系统
  16. Oracle-表的创建与管理
  17. 云计算赛项--2020年赛题基础部分[任务3]
  18. Beats:使用 Elastic Stack 记录 Python 应用日志
  19. Sicily 2500---看风景
  20. AutoJs学习-文字转语音QQ发送

热门文章

  1. NRF52832-QFAA、NRF52840-QIAA性能区别-蓝牙智能手环穿戴
  2. 没有对公账户怎么开通认证微信公众号?
  3. oracle am时间,oracle里to_date()如何转换am、pm时间
  4. Mac系统切换SMB账号密码
  5. 计算机检测不到双显示器,win10系统双屏幕检测不到第二屏幕怎么办 解决双屏幕不显示的方法步骤...
  6. 学会感恩,学会分享,开始总结自己的职场经验
  7. 微信抢抢票服务器,已有多人被坑!抢票“加速包”慎用!
  8. Ubuntu 笔记本合上盖子时,不进入休眠
  9. 旷视科技 CVPR部分文章
  10. 国药集团获得美国默沙东公司新冠口服药“莫诺拉韦”经销权和独家进口权 | 美通社头条...