本文档是一份关于“计算机系统导论”的期末考试试卷,主要涵盖计算机系统的基础知识,包括汇编语言、浮点数表示、X86指令系统、链接器工作原理、程序内存布局、信号处理以及异常处理等方面。下面将对这些知识点进行详细解析。
1. **汇编指令与栈操作**:
- `movl %esp, %ebp`:这条指令将栈指针ESP的内容复制到基指针EBP,通常在函数入口用于保存旧的栈帧指针。
- `pushl %ebp`:将EBP压入栈,这是函数调用时保存返回地址之前的常见操作。
- `call printf`:调用printf函数,会将返回地址压栈并跳转到printf的地址。
- `subl $20, %esp`:从ESP减去20,为局部变量分配空间,ESP向下移动,栈顶指针下降。
2. **浮点数表示**:
- 单精度浮点数27.5的存储表示,需要了解浮点数的IEEE 754标准。27.5的二进制表示是10.011010001100110011001100110011...,其中阶码8位,尾数23位。转换成十六进制后是0x41dc0000。
3. **X86寻址方式**:
- `movl $34, (%eax)`:将立即数34写入EAX寄存器所指向的内存位置,正确。
- `movl (%eax), %eax`:从EAX寄存器指向的内存位置读取数据到EAX,正确。
- `movl $23, 10(%edx, %eax)`:将立即数23写入由EDX和EAX相加后的偏移10处的内存,正确。
- `movl (%eax), 8(%ebx)`:尝试从EAX指向的内存读取数据并存入EBX加上8的内存位置,这种写法是错误的,因为源操作数不能是内存,应该是寄存器。
4. **静态库链接**:
- 静态库链接时,链接器只拷贝用到的目标模块,不会全部拷贝。
- 静态库的位置在命令行中可以随意放置,不影响链接。
- 如果库之间有依赖关系,它们的顺序可能会影响链接结果。
- 每个库在命令行出现一次即可,即使有相互调用,也不需要重复。
5. **程序内存布局**:
- `.bss`段:存放未初始化的全局变量和静态变量。
- `.data`段:存放已初始化的全局变量和静态变量。
- `.rodata`段:存放只读数据,如字符串常量。
- `.text`段:存放程序的机器指令。字符串"You ran into a problem!\n"属于只读数据,因此在`.rodata`段。
6. **信号处理**:
- 当一个进程阻塞了SIGCHLD和SIGUSR1,然后收到这两个信号及另一个SIGCHLD,取消阻塞后只会处理一次SIGCHLD和一次SIGUSR1。因为SIGCHLD是可重入信号,而SIGUSR1是普通信号。
7. **异常处理**:
- 异常是控制流的改变,涉及硬件和操作系统。
- 异常可以是同步的(如除零错误)或异步的(如外部中断)。
- 异常不一定意味着不可恢复的错误,也可以是程序的正常流程,比如页面错误的处理。
8. **信号处理**:
- SIGTSTP信号可以被捕获和忽略,但不能默认忽略。
- 当进程收到SIGSTOP或SIGTSTP时,会暂停,直到收到SIGCONT才继续运行。
- 系统调用可以被信号中断,例如在系统调用期间收到信号,系统调用可能会被中断并返回一个特定的错误值。
- 子进程可以向父进程发送信号,也可以向兄弟进程发送信号。
这份试卷全面考察了计算机系统的基础知识,包括低级编程、内存管理、链接过程、进程通信和异常处理等多个方面。掌握这些知识点对于理解计算机系统的运作至关重要。