计算机组成原理与汇编语言(一)
文章目录
第一章 计算机系统漫游
计算机系统层次
计算机的定义
通常所说的计算机,其全称是电子式数字计算机,它是一种能存储程序,能自动连续的对各种数字化信息进行算术、逻辑运算的快速工具。
- 冯.诺依曼
计算机硬件由
存储器
、运算器
、控制器
、输入设备
和输出设备
5大部件组成 •运算器:运算设备,加减乘除,与或非
•控制器:控制中心
用
二进制
代码表示指令和数据计算机采用
存储程序
的工作方式
指令
和数据
以同等地位存放于存储器内,并可按地址
寻访指令在存储器内按
顺序存放
计算机的工作过程
- 编制程序
- 输入设备:输入机器代码
- 机器代码存入存储器
- 处理器获取机器代码中的一条指令
- 控制器分析/解码指令
- 运算器执行指令要求的运算
- 处理器获取机器代码中的下一条指令
- 控制器分析/解码指令
- 运算器执行指令要求的运算
- 存储器中的数据送到输出设备
- 输出设备:输出数据
-
Hello程序的生命周期
•1.1 程序创建:程序员创建hello.c,及其数字化表示
输入源程序(以高级编程语言形式输入), 计算机内存储的源程序(以机器码形式存储)
•1.2 程序翻译:hello.c被翻译成机器可执行程序
源程序:人可以读懂的程序
可执行程序:系统可以读懂的程序
源文件->可执行文件(机器代码文件):通过编译器实现
•1.4 程序运行:硬件系统对程序的处理过程
处理器
主存
I/O设备
总线
•1.5 程序提速:高速缓存
•1.6 程序存储:存储器层次结构
寄存器—高速缓存—主存—硬盘
•1.7 硬件管理:操作系统
第二章 信息的表示和处理
- 用十六进制方便表示二进制
信息的存储
信息存储
大多数计算机使用8位的块,或者字节(byte),作为最小的可寻址的存储器单位,而不是存储器中访问单独的位(bit)。
比特是英文 binary digit的缩写。比特是表示信息的最小单位,是二进制数的一位包含的信息或2个选项中特别指定1个的需要信息量。一般来说,n比特的信息量可以表现出2的n次方种选择。
机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器(virtual memory).存储器的每个字节都由一个唯一的数字来标识,称为虚拟地址空间(virtual address space).
- 十六进制表示法:
- 一个字节由8位组成。在二进制表示法中,它的值域为:000000002 ~ 111111112 ;如果用十进制整数表示值域为010 ~ 25510 。
- 由于二进制和十进制表示位模式比较麻烦。因此用十六进制(hexadecimal)数来表示位模式,十六进制简写(hex)表示符号"0~9"和"A ~ F "来表示16个数.一个字节的值域为0016 ~ FF16 .
- 字 : 每台计算机都有一个字长(word size),指明整数和指针数据的标称大小(nominal size)
- 数据大小
- 寻址
非数的数字化表示
- 表示字符串
- 表示代码
-
字
1个字 = n个字节 (n=1,2,4,8)
-
字长:
整数的标称大小 int
指针的标称大小 char*
参与一次整数运算的二进制数位数
-
数据大小(不同类型的数据存储空间大小不同)
char 1字节
int 4字节
int 4字节*
float 4字节
double 8字节
-
寻址
一个数据:多个连续字节,地址算最低地址
-
表示字符串
用ASCLL码表示,一个字符用一个字节
-
表示代码
- 不同指令不同编码
- add:0000
- sub:0001
- 相同指令add不同机器可能不同编码
- 机器一:0000
- 机器二:0010
- 不同指令不同编码
整数表示
整数的数据类型
无符号整数
- n位 2 n 2^n 2n个数; 二值编码:0000…0~1111…1; 取值范围:0~ 2 n − 1 2^{n-1} 2n−1
-
例如:4位->16个数
二值编码:0000 ~ 1111
取值范围:0~15
- 8位->256个数
二值编码:0000 0000~1111 1111
取值范围:0~255
带符号整数–补码(two’s-complement)
通过补码来表示负数值,将字的最高有效位解释为负权(negative weight),最高有效位也称为符号位,符号位被设置为1时,表示值为负,而当设置为0时,值为非负.
-
n位 2 n 2^n 2n个数;二值编码:0000…0~1111…1;取值范围: − 2 n − 1 -2^{n-1} −2n−1 ~ 2 n − 1 2^{n-1} 2n−1
-
例如:4位 -> 16个数
二值编码:0000~1111
取值范围: -8 ~ +7
8位 -> 256个数
二值编码:00000000~11111111
取值范围: -128 ~ +127
典型数值编码
以8位为例
TMax(带符号) | TMin(带符号) | -1 | 0 | UMax(无符号) | UMin(无符号) |
---|---|---|---|---|---|
+127 | -128 | -1 | 0 | 255 | 0 |
01111111 | 10000000 | 11111111 | 00000000 | 11111111 | 00000000 |
以4位为例
TMax(带符号) | TMin(带符号) | -1 | 0 | UMax(无符号) | UMin(无符号) |
---|---|---|---|---|---|
+7 | -8 | -1 | 0 | 15 | 0 |
0111 | 1000 | 1111 | 0000 | 1111 | 0000 |
负整数与补码的转换方法:
- 整数 -> 补码: 把"-"用1表示,对后面的数从前到后逐位取反,直到最后一个"1"不再取反,直接写下,后面若有"0"直接写下
- 整数 <- 补码:把补码的第一个"1"变为"-",对于后面的数逐位取反,直到最后一个"1"不再取反,直接写下,后面若有"0"直接写下.
跟取反加一
原理的一样
注:求补码只能用于带符号数的负数,无符号数没有补码
例如:
-1的补码为15 -001->1111
-2的补码为14 -010->1110
-3的补码为13 -011->1101
无符号数与带符号数的转换
- 注意C语言中的强制类型转换
- 若运算中既有带符号数也有无符号数,则转为无符号数运算
- 在比较大小的时候,如果其中一个运算数是无符号的,那么在比较之前,另一个运算数会转换为无符号数。
整数的处理
一个算术运算溢出,是指完整的整数结果不能放到数据类型的字长限制中去。
1.无符号数加法
例如:
2位十进制数加法(计算机内部不会以十进制进行加法运算) | 4位二进制数加法 |
---|---|
20+38 =58 | 0101 + 0010 = 0111 |
46+82 = 128 (溢出) | 1101 + 0100 = 10001 (溢出) |
溢出判断:是否有进位产生 | 溢出判断:是否有进位产生 |
- 无符号数溢出判断:是否有进位产生
2.有符号整数加法
4位二进制数加法 | 转换到十进制的加法 |
---|---|
0101 + 0010 = 0111 | 5 + 2 = 7 |
1101 + 0100 = 10001 (无溢出) | -3 + 4 = 1 |
0110 + 0100 = 1010 (溢出) [正溢] | 6 + 4 = -6 |
1000 + 1100 = 10100(溢出) [负溢] | -8 + -4 = +4 |
- 有符号数溢出判断
正溢: 正 + 正 = 负
负溢: 负 + 负 = 正
溢出判别
- 例:设定点整数字长8位,补码表示(最高位为符号位),表示范围为-128~127,运算结果超出此范围就发生溢出。
- 另一种方法:采用变形补码判断(双符号位) —— 正号:00,负号:11
- 用Sn+1、Sn分别表示结果最高符号位和第2符号位
- 溢出=Sn+1 ⊕ S (⊕:异或)
补充:
例子:
补码加减运算
-
补码加法运算
- [X+Y]补 = [X]补 +[Y]补
-
补码减法运算
- [X-Y]补 = [X]补 + [-Y]补
-
补码运算规则:
- 参加运算的操作数用补码表示
- 符号位参加运算
- 若指令码为加,则两数直接相加:
- 若操作码为减,则将减数连同符号位一起取反加1后再与被减数相加
- [-Y]补 = 对[Y]补 取反加一
- 运算结果用补码表示
整数补充知识:加法器与ALU
一位加法:
1.加法器:
2.ALU
:
3.乘以常数
-
乘的优化计算 (计算机中加法比乘法运算快)
-
乘->移位+加法+减法+位级运算
-
例如:•x∗2n → x≪n
-
x∗14=x∗(8+4+2)=x≪3+x≪2+x≪1
-
x ∗ 5 =x ∗ (4+1)
-
未完待续。。。。。。。。