《深入理解计算机系统》(二)程序结构与执行

602 阅读3分钟

如何理解控制

C语言中的某些结构,比如条件语句、循环语句和分支语句,要求有条件的执行,通过jump指令指定控制应该被传递到程序的某个其他部分。

什么是条件码寄存器

条件码寄存器用来执行条件分支指令

什么是“过程”

过程是软件设计中的一种抽象,它提供了一种封装代码的方式,有一组指定的参数和一个可选的返回值实现了某种功能,比如有函数、方法、子例程、处理函数等

什么是运行时栈

程序可以用栈来管理它的过程所需要的存储空间,栈和程序寄存器存放着传递控制和数据、分配内存所需要的信息。

如何转移控制

通过把返回地址压入栈,能够让函数在稍后返回到程序中正确的点。

如何实现数据传送

函数的参数和返回值都是通过寄存器来传递实现的

什么是栈上的局部存储

有些局部数据必须存放到内存中,比如:

  • 寄存器不足以存放所有的本地数据
  • 使用地址运算符“&”,因此必须能够为它产生一个地址
  • 某些局部变量是数组或结构,因此必须能够通过数据或结构引用被访问到

寄存器中的局部存储空间如何保证原值不变

寄存器是唯一被函数过程共享的资源,为了保证寄存器的原值不变,要么不去改变它,要么就把原值压入栈中,改变寄存器中的值,然后在返回前从栈中弹出旧值。

递归过程如何实现

递归调用本身其实与其他函数是一样的,栈规则提供了一种机制,每次函数调用都有他自己私有的状态信息(保存的返回位置和被调用者保存寄存器的值)存储空间。

如何理解数组的分配和访问

在C语言中,通过产生指向数组元素的指针,并对这些指针进行计算,指针其实就是内存地址

在机器级程序中如何将控制和数据结合起来

首先需要理解C语言中的指针

如何理解指针

  • 每个指针都对应一种类型,这个类型表明该指针指向的是哪一类对象 比如: int *ip int **cpp ip是一个指向int类型对象的指针,cpp指针指向的对象本身是一个指向char类型对象的指针
  • 每个指针都有一个值。这个值是某个指定类型的对象的地址,NULL(0)值表示该指针没有指向任何地方
  • 指针用“&”运算符创建
  • “*”操作符用于间接引用指针,间接引用使用内存引用来实现的,要么是存储到一个指定的地址,要么是从指定的地址读取
  • 一个数组的名字可以像一个指针变量来引用,但是不能修改,比如数组引用a[3]等价于间接引用*(a+3)
  • 将指针从一种类型转换为另一种类型,只改变它的类型,而不能改变它的值
  • 指针也可以指向函数,这提供了一个很强大的存储和向代码传递引用的功能,这些引用可以被程序的某个其他部分调用。比如,定义一个函数
int fun(int x, int *p);

然后声明一个指针fp,将它赋值为这个函数,代码如下

int (*fp)(int, int *);
fp = fun;

然后用这个指针来调用这个函数:

int y = 1;
int result = fp(3, &y);

函数指针的值是该函数机器代码表示中第一条指令的地址。