当前位置: 首页 > news >正文

通过搭建一个精简的C语言开发环境了解一个C程序的执行过程

一、如何搭建一个精简的C语言开发环境

准备:下载TC2.0,并解压,比如说“d:\tc2.0\tc”目录

1、在C盘建立一个目录minic

c:\ md minic

2、从解压的目录中将以下文件拷贝到c:\minic中

    其中TC.EXE是在d:\tc2.0\tc目录下,而COS.OBJ、EMU.LIB、MATHS.LIB、GRAPHICS.LIB、CS.LIB是在D:\tc2.0\tc\lib目录中的。

3、软件配置

  选择菜单项“Options”中的“Directories”选项,对TC的工作路径进行设置,将所有的路径都设置为“c:\minic”。然后用“Save options”选项保存设置。

  生成的配置文件

二、从中我们能学到什么

    尝试去搭建一个最简的C语言开发环境,并不是说就让我们去用这个环境(我不建议)。毕竟功能齐备的集成开发环境能让我们的学习更有效率。但是,做这样的工作的意义还是有的,我认为有以下两点。

(1)认识到C语言开发环境的必备部分

(2)尝试了解我们应用程序的构成和执行过程(从库文件来看)

(3)了解C语言开发环境的输入输出目录(从“步骤3、软件配置”中来看)

  对于意义(1),从步骤2中很容易明白。对于意义(3),它让我们知道c程序的头文件目录、库文件目录以及工程文件输出目录都是可以设置的。但是,这在VC6.0这样现代化的集成开发环境中却不曾发现。

  意义(2)是做这个工作最重要的部分,到底我们的C程序是如何和库文件(.obj、.lib)结合生成可执行程序呢?又是如何执行程序呢?

1、程序连接过程

  首先,编译器将我们写的C程序编译成.obj文件。然后,连接器将这个.obj文件和系统库文件(.obj)连接到一起生成一个可执行程序。不管是连接哪一个程序,COS.OBJ、EMU.LIB、MATHS.LIB、GRAPHICS.LIB、CS.LIB这些库是必须的。

2、程序的执行过程

①c0s.obj里的程序先运行,进行相关的初始化。如申请资源,设置ds,ss等相关寄存器

②c0s.obj里的程序调用main函数,从此用户程序开始运行

③用户程序运行结束从main程序返回到c0s.obj的程序中

④c0s.obj的程序接着运行,进行相关的资源释放,环境恢复的工作

⑤c0s.obj的程序调用DOS的int 21h例程的4ch号中断功能,程序返回

附:

  c0s调用main函数的地址:  011ah

  main函数的连接地址:  01fah

 

参考资料:王爽汇编语言综合研究-不用main函数编程

     《汇编语言》322页 “研究实验4 不用main函数编程”

 

相关文章:

  • 【javascript基础】系列
  • 产品需求文档的写作(一) – 写前准备(信息结构图)
  • 【Nodejs开发】第1章 述与环境搭建
  • 在管理实际中,心态很重要,当你以欣赏的态度去看一件事,你便会看到许多优点,以批评的态度,你便会看到无数缺点。...
  • linux上未分区硬盘的格式化实践
  • 烂泥:【解决】windows live write报连接到日志时出错
  • 数据库持久连接理解
  • 怎么知道自己系统是32位,还是64位?
  • iOS ARC基本原理
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • 如何从一个XtraBackup完整备份中恢复一个InnoDB表
  • hadoop技术在传统银行业务中的应用
  • Entity Framework 简单查询
  • Metaspace 之二--PermGen vs. Metaspace 运行时比较
  • Codrops 教程:实现内容倾斜的 3D 幻灯片效果
  • [译] 怎样写一个基础的编译器
  • 08.Android之View事件问题
  • centos安装java运行环境jdk+tomcat
  • C学习-枚举(九)
  • EventListener原理
  • Javascript弹出层-初探
  • Laravel Mix运行时关于es2015报错解决方案
  • php面试题 汇集2
  • Redis 懒删除(lazy free)简史
  • tab.js分享及浏览器兼容性问题汇总
  • unity如何实现一个固定宽度的orthagraphic相机
  • 动态规划入门(以爬楼梯为例)
  • 给第三方使用接口的 URL 签名实现
  • 每天10道Java面试题,跟我走,offer有!
  • 如何使用 JavaScript 解析 URL
  • 使用 @font-face
  • 思否第一天
  • 仓管云——企业云erp功能有哪些?
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​Linux·i2c驱动架构​
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • $jQuery 重写Alert样式方法
  • (16)Reactor的测试——响应式Spring的道法术器
  • (3)选择元素——(17)练习(Exercises)
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (篇九)MySQL常用内置函数
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (十八)SpringBoot之发送QQ邮件
  • (十一)手动添加用户和文件的特殊权限
  • (十一)图像的罗伯特梯度锐化
  • (四) 虚拟摄像头vivi体验
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .md即markdown文件的基本常用编写语法
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布