如何理解控制
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);
函数指针的值是该函数机器代码表示中第一条指令的地址。