分层抽象与编译:
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; //链表的头指针
};