计算机系统基础
ICS 中的基本运算和概念
计算机系统概述
计算机的发展
- 1946年,第1台通用电子计算机 ENIAC诞⽣生
- 由电子真空管组成
- 电子管计算机
- 晶体管
- SSI, MSI, LSI, VLSI, ULSI
冯.诺依曼计算机结构
- 计算机由运算器, 控制器, 存储器, 输入设备, 输出设备组成
- 指令和数据用二进制表示, 形式上没有差别, 通过CPU访问阶段进行区别
- 指令和数据存储在存储器中, 按地址访问
- 指令由 操作码和地址码组成, 操作码指定操作性质, 地址码指定操作数地址
- 采用 “存储程序” 方式进行工作
计算机系统抽象层的转换
高级语言虚拟机 - 汇编语言虚拟机 - 操作系统虚拟机 - 机器语言机器
程序开发与执行过程
从一个程序的编写到完成程序的执行整个过程简述如下:
- 通过本文编辑软件编写源程序文件(如hello.c)
- 然后使用语言处理工具,对源程序文件进行预处理、编译、汇编和链接,最终生成可执行目标文件。
- 通过双击程序图标或在命令行中输入命令等方式,启动可执行目标文件执行。
- 每一个可执行文件的执行都采用"存储程序”工作方式。一旦程序被启动就会装入主存,CPU从主存储器中取出指令,并对指令译码,根据译码结果控制数据的运算、传送或存储,每条指令执行完后,CPU能自动控制执行下一条指令或跳转到某一条指令处执行,当可执行文件中包含的所有指令都执行结束,则程序执行结束。
性能参数
- 时钟周期 = 时钟频率的倒数
- CPI
- MIPS 峰值MIPS 平均每秒执行多少百万条整数运算指令
- MFLOPS 百万次浮点运算 GFLOPS TFLOPS
- 执行时间
数据的机器级表示与处理
整数
加减运算
-
原码 -> 变成绝对值的运算
-
补码 ->
加法直接相加, 减法中, 被减数取反加 1 再相加
C中的整数
类型转换: 带符号数 -> 无符号数
常用数据:
在 ISO C90 下, 2147483648 为 **unsigned int
**型
溢出判断
对于补码而言, 在进行加法时, 如果两个数的最高位不同, 不会发生溢出.
否则, 如果
- 运算结果的最高位与加数的最高位不同
- 最高位进位与次高位进位的异或为 1
则发生了溢出.
比较判断
关系 | 无符号数 | 有符号数 |
---|---|---|
等于 | ||
大于 | ||
小于 | ||
大于等于 | ||
小于等于 |
- 无符号数情况
- 等于: 相减后结果为零
- 大于: 没有借位且相减后不为0
- 小于: 有借位且相减后不为0
- 大于等于: 没有借位或相减后结果为0
- 小于等于: 有借位或相减后结果为0
- 带符号整数情况
- 等于: 相减后结果为零
- 大于: 相减后结果不为0,并且,不溢出时为正,溢出时为负。
- 小于: 相减后结果不为0,并且,不溢出时为负,溢出时为正。
- 大于等于: 相减后结果为0,或者,不溢出时为正,溢出时为负。
- 小于等于: 相减后结果为0,或者,不溢出时为负,溢出时为正。
浮点数
IEEE 754 标准
单精度
1 | S EEEE EEEE MMM MMMM MMMM MMMM MMMM MMMM |
- 1 位符号位
- 8 位阶码 (移码)
- 23 位尾数 (原码)
- 阶码的偏置常数为 127
- 尾数最高位默认为 1
程序的转换及机器级表示
ISA
ISA 定义了机器语言级虚拟机的属性和功能特性
- 可执行的指令的集合
- 指令可以接受的操作数的类型
- 操作数所能存放的寄存器组的结构
- 操作数所能存放的存储空间的大小和编址方式
- 操作数在存储空间存放时按照大端方式还是小端方式存放
- 指令获取操作数的方式,即寻址方式;
- 指令执行过程的控制方式,包括程序计数器、条件码定义等。
生成机器代码
这个转换过程分为以下4个步骤。
- 预处理。例如,在C语言源程序中有一些以#开头的语句,可以在预处理阶段对这些语句进行处理,在源程序中插入所有用
#include
命令指定的文件和用#define
声明指定的宏。 - 编译。将预处理后的源程序文件编译生成相应的汇编语言程序。
- 汇编。由汇编程序将汇编语言源程序文件转换为可重定位的机器语言目标代码文件。
- 链接。由链接器将多个可重定位的机器语言目标文件以及库例程(如
printf()
库函数)链接起来,生成最终的可执行文件。
ADD 程序示例
1 | // test.c |
1 | add: |
1 | # test.o: file format elf32-i386 |
对于test.o
文件
- 目标代码从相对地址
0
开始 - 机器指令的长度不同, 即为变长指令字结构
可执行文件中:
1 | 08048403 <add>: |
IA32 指令
数据类型与寄存器
x87 浮点寄存器中含有专用的状态寄存器, 8个浮点寄存器
mov 传送指令
算术运算指令
乘法运算
- 1个操作数 SRC : 另一个操作数隐含在 AL / AX / EAX 中, 结果存放在 AX / DX-AX / EDX-EAX
- 2个操作数 DST, SRC : DST * SRC -> DST
- 3个操作数 REG, SRC, IMM : SRC * IMM -> REG
除法运算
- 1个操作数 SRC : 另一个操作数隐含在 AL / AX / EAX 中
- 被除数的位数为除数的2倍
- 16 / 8 : 商: AL 余数: AH
- 32 / 16 : 商: AX 余数: DX
- 64 / 32 : 商: EAX 余数: EDX
移位运算
- 逻辑: SHL SHR
- 算术: SAL SAR
- 循环: ROL ROR RCL RCR
控制转移指令
C语言程序的机器级表示
过程调用的执行步骤
假定过程P调用过程Q, 则P称为调用者, Q称为被调用者。
- P将入口参数(实参)放到Q能访问到的地方。
- P将返回地址存到特定的地方,然后将控制转移到Q。(CALL)
- Q保存P的现场,并为自己的非静态局部变量分配空间。
- 执行Q的过程体(函数体)。
- Q恢复P的现场,并释放局部变量所占空间。
- Q取出返回地址,将控制转移到P。(RET)
寄存器使用约定
- 寄存器
EAX
、ECX
、EDX
是调用者保存寄存器 - 寄存器
EBX
、ESI
、EDI
是被调用者保存寄存器
栈与栈帧
C语句的汇编形式
if 选择语句
1 | // if |
汇编格式
1 | c=cond_expr; |
1 | c=cond_expr; |
switch
do - while
1 | do |
1 | loop: |
while
1 | while (cond_expr) |
1 | c = cond_expr; |
for
1 | for (begin_expr; cond_expr; update_expr) |
1 | begin_expr ; |
数据对齐
Windows : 按其长度对齐
IA32 :
- short : 2
- int float double char* : 4
- double : 80位, 分配12字节(96位)