💻 计算机组成原理(PART A) - Floral-Sunsunrise
USTC-elbitsiserri
·
2025-12-30
·
via Floral-Sunsunrise
计算机组成原理,按重点写的,并不一定全面奥
综合总结Ⅱ
处理器的串行工作模式:取指令-读操作数-执行-写操作数,这四个步骤构成一次指令运行,但在指令执行期间,总线BUS是空闲的,因此会造成系统资源的严重浪费,8086采取的是并行模式
8086处理器的工作模式特点为:指令流水线工作模式,是指令的并行操作,也成为指令的重叠执行模式
总线接口部件BIU扶着涉及外部总线的操作,包括读取指令、读操作数、写操作数、地址转换与总线控制
BIU中下辖的指令队列一次性可以读取六个字节的指令代码,采取先进先出FIFO的原则
8086的地址线为20为,最大寻址空间为1MB,而内部寄存器是16位的,最大寻址范围为64KB
为了有效利用空间,采用分段存储的模式————将1MB空间的存储器分成若干段(segment),每一段最大的空间就是64KB。分段时,每个段落的起始地址均为16的整数倍,在十六进制下段起始单元的地址即为XXXX0H,而段的段地址即为起始单元的物理地址除以16
判断两个段空间之间是否重叠的方法是:将两个段空间的物理地址进行相减运算,并判读所得差的数值是否小于FFFFH(64kb)
执行部件EU内的4个通用寄存器还有如下的名字:累加器AX、基址寄存器BX、计数器CX、数据寄存器DX
执行部件EU内的4个地址指针与变址寄存器还有如下名字:堆栈指针寄存器SP、基址指针寄存器BP、源变址寄存器SI、目的变址寄存器DI,SI、DI与存储器间接寻址有关
综合总结Ⅰ
不想看主要内容的可以速览本节噢
数制与码制(不讲啦)
计算机结构
- 计算机性能指标
- 存储器指标
- 存储器的主要指标就是总容量,总容量(bit)=存储单元总数(MAR)×存储字长(MDR),比如32位的MAR与8位的MDR构成的主存容量即$2^{32}\times 8 bit=4GB$
- CPU性能指标
- 主频与时钟周期
- 比如英特尔® 酷睿™ i9-12900E 的5GHz 16核处理器的主频就是5GHz,
主频是CPU内数字脉冲信号的震荡频率,两次脉冲信号开始时间的时间差称为CPU时钟周期,主频决定CPU的执行速度
CPI是执行一条指令所需要的时钟周期数,显然CPI越小指令执行越快,执行一条执行的最终耗时是这么计算的:耗时=CPI×CPU时钟周期
IPS表示每秒能够执行的指令数,IPS=主频/CPI
FLOPS表示每秒能够执行浮点运算的次数
- 系统整体性能指标
数据通路带宽指数据总线一次能并行传送的二进制信息位数
吞吐量表示系统在单位时间内处理请求的数量
响应时间指计算机从用户发送请求开始到系统做出相应并得到结果所需的时间
- 本小节核心
- 汇编指令
- 状态寄存器PSW
- PSW(Program Status Word),程序状态字寄存器,即标志寄存器,是一个16位的寄存器,有条件码标志和控制标志构成
- 指令
- jz与jnz
- jz(jump if zero),即ZF标志位为1时跳转,jnz就是前者的反
- test与cmp
- test普遍用于测试寄存器是否为空,结果为零则将ZF置(逻辑与)1
- cmp指令用于对操作数之间的运算比较,相当于减法,但
不存储结果,这一点与sub不同!通过查阅ZF和SF标志位的状态就能得到比较的结果
- 标志转移
- 直接标志转移
- JC(jump if carry) 有进位跳转,即CF=1;JNC即为前者反,下同不再赘述
- JZ(jump if zero) 零跳转,即ZF=1;JNZ
- JE(jump if equal) 零跳转,即ZF=1;JNE
- JS(jump if sign) 负号跳转,即SF=1;JNS
- JO(jump if overflow) 溢出跳转,即OF=1;JNO
- JP(jump if parity) 偶数个1跳转,即PF=1;JNP
- 间接标志转移(无符号条件转移)
- 先由cmp指令比较后在进行后续判断
- JA/JNBE CF=0&ZF=0 指高于才跳转
- JAE/JNB CF=0||ZF=1 指不低于就跳转
- JB/JNAE CF=1&ZF=0 指低于才跳转
- JBE/JNA CF=1||ZF=1 指不高于就转移
- 间接标志转移(有符号条件转移)
- 先由cmp指令比较后在进行后续判断
- JG/JNLE SF==OF&ZF=0 指大于才跳转
- JGE/JNL SF==OF||ZF=1 指不小于就跳转
- JL/JNGE SF!=OF&ZF=0 指小于才跳转
- JLE/JNG SF!=OF||ZF=1 指不大于就转移
- 循环控制指令
- LOOP CX->CX+1,CX!=0时跳转
- LOOPZ/LOOPE CX->CX+1,CX!=0&ZF=1
- LOOPNZ/LOOPNE CX->CX+1,CX!=0&ZF=0
- JCXZ CX=0跳转
- 循环控制指令对CX寄存器的修改不影响状态标志位ZF
微型计算机概述
- 微型计算机的信息传送是通过总线进行的,大部分的微型计算机有三种总线:
地址总线Address_Bus、数据总线Data_Bus、控制总线Control_Bus
- 地址总线:通常为32位,编码从$A_{0}-A_{31}$,因此其可寻址的内存单元为$2^{32}=4GB$,I/O接口也是同股票地址总线寻址的,它可以寻址64K个外部接口,为
单向总线
- 数据总线:通常为32位,编码从$D_{0}-D_{31}$,数据在CPU与存储器、I/O接口与CPU之间的传送是双向的,因此数据总线为
双向总线
- 控制总线:负责传送各种控制信号,信号的传送当然可以是双向的啦
微处理器结构
- 8086微处理器的内部结构整体上由
执行部件EU和总线接口部件BIU构成。
- BIU内部有四个16位
段地址寄存器:代码段寄存器CS、数据段寄存器DS、堆栈段寄存器SS、附加段寄存器ES,还有一个16位指令指针寄存器IP、一个6字节指令队列缓冲器和20位地址加法器与总线控制电路。
- EU内包含一个16位
算术逻辑单元ALU,8个16位的通用寄存器,一个16位状态标志寄存器F,一个数据暂存寄存器和执行部件的控制电路
- BIU的功能是根据执行部件EU的请求,负责完成CPU与存储器或者I/O设备之间的数据传送。
- EU的功能是从BIU的指令队列中取出指令代码,经过
指令译码器译码后执行指令内容。
- 8086CPU可供编程使用的有14个16位寄存器,按用途分为
通用寄存器、段寄存器和控制寄存器。
- 通用寄存器包括四个16位数据寄存器AX、BX、CX、DX和四个16位指针与变址寄存器即
堆栈指针寄存器SP、基址指针寄存器BP以及源变址寄存器SI和目的变址寄存器DI。
- 数据寄存器用于存放16位数据,其中每一个数据寄存器有可以根据需要将高8位和低8位分成两个独立的8位寄存器来使用
XH,HL(High,Low,X=A,B,C,D),用于存放8位数据,他们据可以独立寻址,独立使用。
偏移地址是某存储单元相对其所在段起始位置的偏移字节数,简称偏移量,它是一个16位的地址,根据指令的不同,他可以来自于CPU中不同的16位寄存器。
- 堆栈指针寄存器SP用于储存栈顶的偏移地址。
- 基址指针寄存器BP用于在访问内存时存放内存单元的偏移地址。
- 变址寄存器用于指令中对存储器操作数的寻址,特别在串操作指令中,用SI存放源操作数的偏移地址,用DI存放目的操作数的偏移地址
操作数是运算符作用于的实体,是表达式中的一个组成部分,它规定指令中进行数字运算的量值。表达式是操作数和操作符的组合。操作数在C语言中包括常量、标识符、字符串、函数调用、下标表达式、成员选择符和复杂表达式,在汇编语言中也是重要的一部分,通过将操作数与操作符相结合的方式或者通过将操作符放在括号内的方式形成。
- 寄存器AX、BX、CX、DX、SI、DI的隐含用法如下:
- AX:在字乘/字除指令中作为累加器,在字I/O操作时作为数据寄存器
- BX:间接寻址时,作为地址寄存器和基址寄存器,在XLAT指令种用作基址寄存器
- CX:串操作或循环操作时用作循环次数计数器
- DX:字乘/字除指令中用作辅助寄存器,I/O指令间接寻址时用作端口地址寄存器
- SI:间接寻址时,用作地址寄存器和变址寄存器;串操作时用作源变址寄存器
- DI:间接寻址时,用作地址寄存器和变址寄存器;串操作时作为目的变址寄存器
- 控制寄存器包含指令指针寄存器IP和标志寄存器F。
- IP是一个16位的寄存器,存放EU要执行的下一条指令的偏移地址,用以控制程序中指令的执行顺序,实现对代码段指令的跟踪。
- F是一个16位寄存器,共有9个标志,其中6个用作状态标志,3个用作控制标志。
- 状态标志用来反映EU执行算术逻辑运算后的结果特征,包括:
进位标志CF、奇偶标志PF、辅助(半)进位标志AF、零标志ZF、符号标志SF、溢出标志OF。
- CF:加法运算时最高位出现进位或减法运算时最低位出现借位,则CF=1
- PF:当运算结果的低8位中1的个数位偶数时,PF=1
- AF:做加法时低四位有向高四位进位或减法时低四位向高四位借位时,AF=1
- ZF:当运算结果为零时,ZF=1
- SF:当运算结果的最高位1时,SF=1
- OF:出现算术溢出时,OF=1
- 加法运算:若两个加数的最高位为0,而和的最高位为1,则产生上溢出;若两个加数的最高位为1,而和的最高位为0,则产生下溢出;两个加数的最高位不相同时,不可能产生溢出。
- 减法运算:若被减数的最高位为0,减数的最高位为1,而差的最高位为1,则产生上溢出;若被减数的最高位为1,减数的最高位为0,而差的最高位为0,则产生下溢出;被减数及减数的最高位相同时,不可能产生溢出。
- 控制标志用来控制CPU的工作方式或工作状态,包括:
中断允许标志IF、陷阱标志TF和方向标志DF
- IF:当IF=1时,处理器可以响应可屏蔽中断
- TF:当TF=1时,处理器可以进入单步工作方式,常用于程序调试
- DF:当DF=1时,串操作指令的地址修改为自动减量方向
- 段寄存器 用来存放每个逻辑段的起始地址,前面我们已知道总共有四类段寄存器:CS、DS、SS、ES,这些段寄存器的内容与有效的地址偏移量一起可以确定内存的物理地址
- CS代码段寄存器负责划定并控制程序区,用于存放指令代码
- DS和ES负责控制数据,数据段和附加段用来存放操作数
- SS负责控制堆栈区,用于存放返回地址,保存寄存器内容和传递参数
- 堆栈是
先进后出FILO原则的存储区域,堆栈的大小最大为64KB,堆栈由堆栈段寄存器SS和堆栈指针寄存器SP来寻址,SS给出堆栈段的段基址,SP指向当前栈顶,给出段基址到栈顶的偏移量。栈底为堆栈空间的高地址单元,栈顶为低地址单元。
- 当数据进栈时,栈顶向低地址方向浮动,高位字节存入高地址单元,低位字节存入低地址单元
- 当数据出栈时,栈顶向高地址方向浮动,低位字节弹到目的操作数的低位,高位字节弹到目的操作数的高位
- 存储器是按字节进行组织的,两个相邻的字节被称为一个
字存放的信息若是以字节(8位)为单位,则将在存储器中按顺序排列存放;若存放的数据为一个字(16位)时,则将每一个字的低字节(低8位)存放在低地址中,高字节(高8位)存放在高地址中,并以低地址作为该字的地址
- 段基地址和段偏移量组成
逻辑地址,其格式为段(基)地址:偏移地址
物理地址=段基地址*16+偏移地址,一个物理地址的逻辑地址是不唯一的,物理地址是20位的
- 需要说明的是,每种段寄存器有其对应匹配的地址指针与变址寄存器
指令系统
指令是指挥计算机完成某种操作的命令,从计算机组成的层次结构来说,计算机指令有机器指令、伪指令和宏指令之分
- 指令的格式为:Label(操作符)+DST(OPD)(目的操作数)+SRC(OPS)(源操作数)
- 指令中操作数字段指出的是操作数的存放位置:
- 跟随在指令操作码之后的操作数称为
立即数
- 存放在CPU内部寄存器中的操作数称为
寄存器操作数
- 存放在内存存储器中的操作数称为
存储器操作数
- 指令中给出的是逻辑地址,我们把偏移地址又称为
有效地址EA,EA的不同构成方式又产生了不同的寻址方式
- 根据操作数的位置信息找到操作数的过程称为寻址,寻找方式自然就是寻址方式
- 寻址方式有如下几种
立即寻址:该方式中,指令操作码和操作数都在存储器代码段中
- 汇编格式:n,立即数,是用8位或16位二进制补码表示的有符号数
- ```汇编
MOV AX 251 %将十进制数251送入寄存器AX
MOV AX ‘5’ %将字符’5’的ASCII码送入寄存器AX
MOV AX 028H %将8位立即数送入AX
MOV AX 1345H %将16位立即数送入AX | + 立即数寻址方式主要用于给寄存器或存储单元赋值 + `寄存器寻址`:该方式中,操作数在指令指明的寄存器中 + 汇编格式:R,表示寄存器名称 + ```汇编 MOV AX,CX %将16位寄存器CX的内容送入AX MOV DL,BL %将8位寄存器BL的内容送入DL
|
存储器寻址:这是一个统称,该方式中,操作码放在内存储器中,这种方式下辖多种寻址方式
直接寻址:汇编格式:段寄存器名+变量的地址表达式
- ```汇编
%假设TABLE是在数据段定义的一个字节数组的首地址标号,其偏移地址为1000H,下面的表示是等价的
MOV AL,TABLE %地址表达式
MOV AL,[TABLE] %[地址表达式]
MOV AL,[1000H] %[数字表达式] | + `直接寻址的默认段寄存器是DS` + 直接寻址一般适用于处理单个变量 + `寄存器间接寻址`:存储单元的有效地址EA放置在基址寄存器BX,BP或变址寄存器SI、DI中 + 汇编格式:[R],寄存器的内容位操作数的偏移地址EA + ```汇编 [基址寄存器名或变址寄存器名] MOV AX,[BX] %物理地址=DS*16+BX MOV AL,[BP] %物理地址=SS*16+BP MOV AX,CS:[DI] %物理地址=CS*16+DI
|
- 如果指令中的寄存器是BX、SI、DI,则操作数默认在数据段中,因此DS寄存器的值即为段地址
- 如果指令中的寄存器是BP,则操作数默认咱堆栈段中,取SS寄存器的值作为操作数的段地址
寄存器相对寻址:汇编格式:X[R],X是8位或16位二进制补码表示的有符号数,位位移量,其EA偏移地址的计算为[R]+X
- ```汇编
位移量[基址寄存器或变址寄存器名]
[位移量+基址寄存器或变址寄存器]
MOV AX,20H[SI] %物理地址=DS16+SI+20H
MOV CL,[BP+2000H] %物理地址=SS16+BP+2000H | + `基址变址寻址`:汇编格式:[基址寄存器]+[变址寄存器] + ```汇编 [基址寄存器][变址寄存器] [基址寄存器+变址寄存器] MOV AX,[BX][SI] %物理地址=DS*16+BX+SI MOV AX,[BX+SI] %物理地址=DS*16+BX+SI MOV CL,CS: [BX+DI] %物理地址=CS*16+BX+DI
|
段跨越前缀:汇编格式:段寄存器名:操作数地址
- ```汇编
MOV AL,ES: TABLE %段寄存名:地址表达式
MOV AL,ES: [TABLE] %段寄存名:[地址表达式]
MOV AL,ES 1000H %段寄存名:数字表达式
MOV AL,ES [1000H] %段寄存名:[数字表达式]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| --- + 8086的指令系统按功能分为6类: + 数据传送指令 + 算术运算指令 + 逻辑运算和移位指令 + 串操作指令 + 程序控制指令 + 处理器控制指令 --- + `数据传送指令`的功能是将数据、地址或立即数传送到寄存器或存储单元中。这类指令又包括`通用数据传送指令`、`堆栈操作指令`、`地址传送指令`、`标志寄存器传送指令`、`数据交换指令`和`换码指令`。 + 通用数据传送指令:因为MOV用的最多,所以只讲MOV + 汇编格式:MOV DST SRC + 说明: + 指令中两个操作数不能同为存储器操作数 + CS不能作为目标操作数 + 段寄存器之间不能互相传送 + 立即数不能直接送入段寄存器 + MOV指令不影响标志位 + ```汇编 MOV AL,12H %立即数传给通用寄存器 MOV WORD PTR[BP],34H %立即数传给存储器 MOV CL,BH %通用存储器之间相互传送 MOV [SI],DH %通用寄存器与存储器的互传 MOV DS,AX %段寄存器与通用寄存器互传 MOV ES,[SI] %段寄存器与存储器之间互传
|
- 堆栈操作指令
- PUSH进栈 POP出栈
- PUSH,POP不能用于立即寻址,POP不能用于CS寄存器
- PUSH操作栈顶向低地址移动,POP操作栈顶向高地址移动
- 指令不影响标志位
- 地址传送指令
- 有效地址传送指令LEA
- LEA将源操作数的有效地址(偏移量)送入指定寄存器中,使一个通用寄存器成为指针
- ```汇编
LEA REG SRC %REG是一个16为通用寄存器,不能是段寄存器
LEA BX,[2345] %指令将2345单元的偏移量送入BX,BX=2345 | + 取地址指针指令LDS(LES) + 一个内存单元的地址指针由其偏移量和段地址组成,是个4字节单元 + LDS指令将源操作数指定的`4个连续字节`的前两个字节作为偏移量送入REG,将后两个字节作为段地址传送到DS,类似地,LES将后者送入到ES段寄存器中 + ```汇编 LDS REG SRC %将指令送寄存器和DS指令 LDS BX,[1230H] %该指令将地址为1230H和1231H的内存单元的16位数据作为偏移量送入BX寄存器,将1232H和1233H的数据作为段值送入DS寄存器
|
- 数据交换指令XCHG
- 数据交换指令将源操作数与目标操作数交换,可以在寄存器间、寄存器与存储器间进行
| XCHG DST SRC %DST,SRC不允许是段寄存器、立即数或IP寄存器
|
- 算术运算指令
- ADD:不带进位的加法,将最高位进位舍去
- ADC:带进位的加法,在ADD的基础上把进位标志位CF加进去
- INC:自增指令,DST+1->DST
- SUB:不带借位的减法
- SBB:带借位的减法,在SUB基础上减去借位标志位CF
- DEC:自减指令,DST-1->DST
- NEG:取相反数指令
- CMP:比较指令
- MUL:无符号乘法指令
- DIV:无符号除法指令
- IMUL:带符号乘法指令
- IDIV:带符号除法指令
- 逻辑运算指令
- AND 逻辑与
- OR 逻辑或
- XOR 逻辑异或
- TEST 逻辑测试,相当于逻辑与,但不将结果送回目的而是影响标志位
- NOT 逻辑非
- 移位指令
- 移位指令(shift)
- SAL 算术左移
- SAR 算术右移
- SHL 逻辑左移
- SHR 逻辑右移
- 循环移位指令(Recursion)
- ROL 循环左移
- ROR 循环右移
- RCL 带进位循环左移
- RCR 带进位循环右移
汇编语言
- 概论
- 汇编程序结构
- 一个完整的汇编程序由堆栈段、数据段、代码段构成,每个段都以
SEGMENT起始并以END结束,在这之间由一条条语句构成语句序列
- 8086汇编语言语句分为三种
指令语句:与机器指令对应
伪指令语句:又称管理语句,在汇编过程中起作用
宏指令语句
- 汇编语言基本语法
- 常量
- 数值常量
- 字符串常量:由包含在
单引号之中的若干个字符组成
- 符号常量:可由”=”或”EQU”定义,例如X EQU 3(或X = 3),这样X就是一个符号常量,但如果是用”EQU”定义的符号常量再一个程序中不能被再次定义(理解为const x = value)
- 变量
- 变量在DS、ES或SS中定义,可用LABEL或EQU伪操作定义,变量常以操作数字段出现,有段、偏移及类型三种属性
- 段属性定义变量的段起始地址,必须存放在段寄存器中
- 偏移属性给定偏移地址
- 类型属性定义变量的字节数类型:
- BYTE(DB,1字节长)
- WORD(DW,2字节长)
- DWORD(DD,4字节长)
- FWORD(DF,6字节长)
- QWORD(DQ,8字节长)
- TWORD(DT,10字节长)
- 标号
- 标号在代码段中定义,可由LABEL或EQU伪操作定义,常在转移指令或CALL指令的操作数字段出现,也拥有上述三种属性
- 段属性(略)
- 偏移属性(略)
- 类型属性
- 段内引用称为NEAR,对16位段指针长度为2个字节,对32位段指针长度为4字节
- 段外引用称为FAR,对16位段指针长度为4字节(段地址2字节+偏移地址2字节),对32位段指针长度为6字节(段地址2字节+偏移地址4字节)
- 运算符
- 算术运算符
- +, -, *, /, MOD
- 可用于数值和地址表达式
- 逻辑运算符
- AND, OR, XOR, NOT
- 只能用于数值表达式
- 关系运算符
- EQ(相等)、LT(小于)、LE(不大于)、GT(大于)、GE(不小于)、NE(不等)
- 取值运算符
- SEG:返回变量和标号的地址段
- OFFSET:返回变量和标号在段内的偏移量
- TYPE:返回变量和标号的数据类型
- LENGTH:返回变量所包含的数据个数
- SIZE:返回为一个变量分配的内存大小,SIZE=LENGTH*TYPE
- 合成运算符
- 也称为
修改属性运算符,包括PTR和THIS
- PTR
- ```汇编
TYPE PTR EPR % 类型 PTR 表达式
e.g
NUM DB 1,2,3,4 % 变量NUM是字节类型
MOV AX,NUM % Illegal! 字节类型不能传入AX
MOV AX WORD PTR NUM % Legal 将NUM修改为字类型传入AX
也可以这么干
DNUM EQU WORD PTR NUM
MOV AX DNUM %新定义的DNUM是没有新分配内存,指向NUM并拥有相同的段属性和偏移属性 | + THIS + ```汇编 新符号名 EQU THIS TYPE 原符号名 TYPE PARA % 原符号名 类型 参数 e.g DNUM EQU THIS WORD NUM DB 1,2,3,4
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。