南京大学

计算机系统基础(一):程序的表示、转换与链接

图片
课程概述

   本课程是“计算机系统基础”系列课程中的第一门,主要介绍高级语言程序中的数据类型及其运算、语句和过程调用等是如何在计算机系统中实现的。主要包含三个主题:(1)表示。不同数据类型(如带符号整数、无符号整数、浮点数、数组、结构等)数据在寄存器或存储器中的表示和存储;指令的格式、编码及其在存储器中的存储;存储地址(指针)的表示。(2)转换。高级语言程序中的过程(函数调用)、循环、选择等语句与机器级代码之间的对应关系。(3)链接。多个可重定位目标文件如何链接生成可执行目标文件并加载到系统中。

通过本课程的学习,使学习者能从程序员角度认识计算机系统,能够建立高级语言程序、ISAOS、编译器、链接器等之间的相互关联,对指令在硬件上的执行过程和指令的底层硬件执行机制有一定的认识和理解,从而增强在程序调试、性能提升、程序移植和健壮性等方面的能力,并为后续的计算机组成与设计操作系统编译原理计算机体系结构等课程打下坚实基础。

学完本课程后,学习者将对以下问题有比较深刻的认识,并能解决相关实际问题。

  • 程序中处理的数据在机器中如何表示和运算?

  • 程序中各类控制语句对应的机器级代码结构是怎样的?

  • 多个程序模块是如何链接起来形成可执行目标文件的?

  • 机器级代码及构成机器级代码的指令是如何在机器上执行的?

 

证书要求


         1.最终成绩由小测验成绩和期末考试成绩两部分组成。

2. 课程共12周,每周对应一次小测验,每次小测验由10道单选题构成,每题0.5分,共60分。

3. 期末考试40分。

总成绩60分及以上合格,85分及以上优秀。

电子版的课程结业证书免费。纸质版认证证书收费:100/ 

预备知识

高级语言程序设计(最好有C语言程序设计的基础)

 

授课大纲

本课程学时共12周。

1 计算机系统概述

首先,通过介绍C语言程序的具体实例,来说明高级语言程序的执行结果与编程语言之外的计算机系统其他方面有关,从而使学生明白为何要学习计算机系统基础课程;然后,介绍计算机系统基本组成与基本功能、程序开发和执行过程、计算机系统层次结构等概述性内容;最后,简要说明本课程的主要学习内容。

2 数据的表示和存储

首先,介绍进位计数制和编码的基本概念;然后,介绍定点数的编码表示,在此基础上介绍带符号整数和无符号整数的表示;接着,介绍浮点数的编码表示,主要包括IEEE 754单精度和双精度浮点格式标准;随后介绍逻辑值、西文字符和汉字等非数值数据的编码表示;最后,介绍数据的宽度和存储。

3 运算电路基础

首先,介绍布尔代数和数字逻辑电路的基础性内容;然后,介绍C语言中的按位运算以及逻辑运算;接着,介绍高级语言中的整数加减运算及其对应的底层实现电路。

4 乘除运算及浮点数运算

基于运算电路基础,介绍高级语言中的整数乘除运算与底层实现之间的关系;然后介绍浮点数的运算,特别是浮点运算中的精度问题。

5 IA-32指令系统概述

首先,介绍高级语言程序与机器级代码之间的关系,以及机器级代码与指令集体系结构(ISA)的关系;然后,介绍IA-32指令系统的概述性内容,包括寄存器组织、寻址方式和指令格式等。

6 IA-32指令类型

主要介绍IA-32指令系统中常用的几类指令,包括传送、定点算术运算、按位运算、控制转移、x87浮点运算指令,最后简要介绍了MMXSSE指令集。

7 C语言语句的机器级表示

主要介绍C语言程序中各类语句被转换为机器级代码后的机器级表示,包括过程(函数)调用的机器级表示、选择和循环语句的机器级表示。

8 复杂数据类型的机器级表示

主要介绍C语言程序中数组和指针类型的分配和访问、结构和联合数据类型的分配和访问、数据的对齐存放。最后介绍越界访问和缓冲区溢出攻击。

9 x86-64指令系统

首先,介绍了x86-64指令系统的概述性内容;然后,介绍了与IA-32指令不同的几种x86-64基本指令;最后,介绍了x86-64中过程(函数)调用的具体的实现。

10 链接概述与目标文件格式

首先,介绍了在生成可执行文件的过程中所涉及到的概述性内容;然后,介绍了目标文件格式的基本内容;最后,分别介绍ELF文件格式中的可重定位文件格式(链接视图)和可执行文件格式(执行视图)。

11 符号及符号解析

主要内容包括符号的概念、符号表的结构、静态库和静态链接、符号解析。

12 重定位和动态链接

主要内容包括符号的重定位、可执行文件的加载、共享库和动态链接以及位置无关代码(PIC)。


参考资料

1.袁春风. 计算机系统基础 [M]. 北京:机械工业出版社,2014 (前4章)

2.Randal E. Bryant, David R. O'Hallaron. 深入理解计算机系统(原书第2版)[M]. 龚奕利,雷迎春译北京:机械工业出版社,2011

 

常见问题

1.学习这门课程时,最重要的学习方法是什么?

首先,不要死记硬背,关键是要不断将所学内容关联起来,以真正理解所学内容。

其次,要多动手实践。不明白的地方就编写一个程序,通过打印结果或利用gdb等调试工具查看机器级代码来分析。

此外,多提问和多参与讨论。真理越辩越明,在与他人的讨论过程中,往往会忽然开朗,有时,一个问题自己冥思苦想几天都想不明白,但实际上课程讨论区早就有人讨论过了,或者在讨论区一提问,马上就有人帮你解决了。

 

2.该课程属于硬件课程还是软件课程?

该课程涉及到其他很多课程,包括硬件课程和软件课程。它与高级语言程序设计、组成原理、汇编、编译、链接和操作系统等课程的内容有关。虽然涉及到很多其他课程的内容,但是,我们在本课程中只会讲解这些课程内容之间的关联,而不会讲解这些课程的细节内容,例如,本课程不会讲解如何实现编译器和如何实现操作系统。

 

3.该课程是计算机系统基础(一),其后续课程的主要内容是什么?

该课程主要介绍可执行目标文件的生成。后续课程为计算机系统基础(二)----程序的执行、异常和I/O处理,主要介绍可执行目标文件的加载和执行,包括执行指令的CPU的基本结构、存储器组织、指令执行过程中异常和中断请求的响应和处理,以及程序中的I/O操作的底层实现。