源程序的编程理解是怎样的

简介: 从编译程序(或抽象)的视角理解源程序

分层抽象与编译:

1 指令集是CPU的抽象
指令系统是计算机硬件的语言系统,也叫机器语言,指机器所具有的全部指令的集合,它是软件和硬件的主要界面,反映了计算机所拥有的基本功能。

通常先有指令集,CPU设计师根据指令集设计CPU,也就是说,CPU是指令集的具体实现。

各计算机公司设计生产的计算机,其指令的数量与功能、指令格式、寻址方式、数据格式都有差别,即使是一些常用的基本指令,如算术逻辑运算指令、转移指令等也是各不相同的。因此,尽管各种型号计算机的高级语言基本相同,但将高级语言程序(例如 Fortran 语言程序)编译成机器语言后,其差别也是很大的。

2 机器语句是指令集的描述
一条指令就是机器语言的一个语句,它是一组有意义的二进制代码,指令的基本格式如:操作码字段+地址码字段,其中操作码指明了指令的操作性质及功能,地址码则给出了操作数或操作数的地址。

① 数据处理指令:包括算术运算指令、逻辑运算指令、移位指令、比较指令等。

② 数据传送指令:包括寄存器之间、寄存器与主存储器之间的传送指令等。

③ 程序控制指令:包括条件转移指令、无条件转移指令、转子程序指令等。

④ 输入-输出指令:包括各种外围设备的读、写指令等。有的计算机将输入-输出指令包含在数据传送指令类中。

⑤ 状态管理指令:包括诸如实现置存储保护、中断处理等功能的管理指令。

3 汇编语言是机器语言的符号表示
汇编指令是汇编语言中使用的一些操作符和助记符,还包括一些伪指令(如assume,end),汇编指令同机器指令一一对应。每一种CPU都有自己的汇编指令集。

5: int g = 0;
00401028 mov dword ptr [ebp-4],0
6: g++;
0040102F mov eax,dword ptr [ebp-4]
00401032 add eax,1
00401035 mov dword ptr [ebp-4],eax
7: g = g+2;
00401038 mov ecx,dword ptr [ebp-4]
0040103B add ecx,2
0040103E mov dword ptr [ebp-4],ecx
4 汇编指令是一种原子操作
原子指不可分割的粒子,计算机中的原子操作指不可中断的操作,或者一条指令或者一组指令。是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch(切换到另一个线程)。

一般而言一条汇编指令是原子操作。而汇编指令都具有“读取--->修改--->写回”的特性,一般指cpu读取寄存器或内存,进行修改,然后写回寄存器或内存。

有些汇编指令实际上是伪指令,可能对应多条真实的二进制指令,或者只是另外一个指令的语法糖。

5 高级语言语句通过编译分解出汇编指令
5.1 操作符及表达式是某种操作的抽象

10: int c=a+b;
0040104F mov edx,dword ptr [ebp-8]
00401052 add edx,dword ptr [ebp-0Ch]
00401055 mov dword ptr [ebp-10h],edx
5.2 流程控制结构语句、goto语句、跳转指令

汇编语言有一系列跳转指令,在高级语言中,一系列跳转指令可以通过goto语句来实现。直接结构化编程概念的提出,流程约束到一个入口,一个出口,也就是结构化控制结构。

11: if(a<0)
0040DB48 cmp dword ptr [ebp-8],0
0040DB4C jge main+58h (0040db58)
12: a= -a;
0040DB4E mov eax,dword ptr [ebp-8]
0040DB51 neg eax
0040DB53 mov dword ptr [ebp-8],eax
13: else
0040DB56 jmp main+61h (0040db61)
14: a+=2;
0040DB58 mov ecx,dword ptr [ebp-8]
5.3 函数是某种功能的抽象

int gcd(int x, int y)
{
int t;
while(y > 0)
{
t = x % y;
x = y;
y = t;
}
return x;
}
5.4 类与对象是某类数据及相关操作(描述为功能,抽象为函数)的抽象

template
struct LinkNode { //链表结点的定义
T data; //数据域
LinkNode link; //链指针域
LinkNode(LinkNode
ptr = nullptr) { link = ptr; } //仅初始化指针成员的构造函数
LinkNode(const T& item, LinkNode* ptr = nullptr) //初始化数据与指针成员的构造函数
{
data = item;
link = ptr;
}
};
//代码效果参考:http://www.zidongmutanji.com/bxxx/581360.html

template
class List {
public:
List() { first = new LinkNode; } //构造函数
List(const T& x) { first = new LinkNode(x); } //构造函数
List(List& L); //拷贝构造函数
~List() { makeEmpty(); } //析构函数
void makeEmpty(); //将链表置为空表
int Length()const; //计算链表的长度
LinkNode getHead()const { return first; } //返回附加头结点地址
LinkNode
Search(T x); //搜索含数据x的元素
LinkNode Locate(int i)const; //搜索第i个元素的地址
bool getData(int i, T& x)const; //取出第i个元素的地址
void setData(int i, T& x); //用x修改第i个元素的值
bool Insert(int i, T& x); //在第i个元素后插入x
bool Remove(int i, T& x); //删除第i个元素,x返回该元素的值
bool IsEmpty()const //判表空否?空则返回true
{
return first->link == nullptr ? true : false;
}
bool IsFull()const { return false; } //判表满否?不满则返回false
void Sort(); //排序
void input(); //输入
void output(); //输出
List& operator=(List& L); //重载运算符=
void inputFront(T endTag); //前插法建立单链表
void inputRear(T endTag); //后插法建立单链表
protected:
LinkNode
first; //链表的头指针
};

相关文章
|
Kubernetes 网络协议 容器
kubernates(K8s) 踩坑日记(一)init初始化报错 dial tcp [::1]:10248: connect: connection refused
kubernates(K8s) 踩坑日记(一)init初始化报错 dial tcp [::1]:10248: connect: connection refused
2842 0
kubernates(K8s) 踩坑日记(一)init初始化报错 dial tcp [::1]:10248: connect: connection refused
|
Kubernetes Cloud Native 应用服务中间件
云原生|kubernetes|kubernetes集群使用私有镜像仓库拉取镜像(harbor或者官方的registry私有镜像仓库)
云原生|kubernetes|kubernetes集群使用私有镜像仓库拉取镜像(harbor或者官方的registry私有镜像仓库)
1913 0
|
11月前
|
缓存 监控 Linux
Linux性能分析利器:全面掌握perf工具
【10月更文挑战第18天】 在Linux系统中,性能分析是确保软件运行效率的关键步骤。`perf`工具,作为Linux内核自带的性能分析工具,为开发者提供了强大的性能监控和分析能力。本文将全面介绍`perf`工具的使用,帮助你成为性能优化的高手。
607 1
|
11月前
|
Ubuntu 安全 Linux
基于Ubuntu24.04原内核6.8.0升级到6.9.0
通过上述步骤,我们在Ubuntu 24.04系统上成功地将内核从6.8.0升级到了6.9.0。升级内核有助于提高系统的安全性和性能,但也可能带来兼容性问题。因此,在升级前备份重要数据,并确保新内核支持所需的所有硬件和软件。通过合理的验证和测试,可以确保系统在新内核上稳定运行。
987 6
|
SQL Java 数据库连接
深入理解SQL中的LEFT JOIN操作
深入理解SQL中的LEFT JOIN操作
|
边缘计算 人工智能 安全
如何在 VM 虚拟机中安装 OpenEuler 操作系统保姆级教程(附链接)
如何在 VM 虚拟机中安装 OpenEuler 操作系统保姆级教程(附链接)
|
Linux 芯片 Windows
嵌入式Linux系列第3篇:uboot编译下载
嵌入式Linux系列第3篇:uboot编译下载
|
MySQL 关系型数据库 Shell
|
算法 搜索推荐
信息流短视频时长多目标优化
背景       信息流短视频排序目前使用的是基于CTR预估Wide&Deep排序模型。在此基础上继续一系列优化,通过引入相关性信号、体感信号、多场景的样本融合、高层排序模型取得了不错收益。       信息流短视频模型优化可分为两部分优化: 感知相关性优化——点击模型以优化(CTR/CLICK为
8135 0
|
前端开发
不受限时间段的日期范围选择器DatePicker
不受限时间段的日期范围选择器DatePicker封装记录全过程。
426 1
不受限时间段的日期范围选择器DatePicker