一、基本概念
- 现代计算机的三大应用形式:桌面系统、服务器和嵌入式计算机。
- 处理器的性能指标:字长、时钟频率、集成度:
- 字长:表明处理器每个时间单位可以处理的二进制数据位数。
- 时钟频率:表明处理器的处理速度,反映了处理器的基本时间单位。
- 集成度:表明处理器的生产工艺水平,通常用芯片上集成的晶体管数量来表达。
- 摩尔定律:每隔18个月集成电路性能将提高一倍,而其价格将降一半。
- 存储器是存放程序和数据的部件。高性能的微机的存储系统由处理其内部的寄存器(Register)、高速缓冲存储器(Cache)、主板上的主存储器和以外设形式出现的辅助存储器构成。
- 计算机采用的三级存储结构是高速缓冲存储器,主存储器,辅助存储器。
- 处理器引脚(处理器总线):数据总线、地址总线、控制总线
- 数据总线:处理器与存储器或外设交换信息的通道,其个数(条数)就是一次能够传送数据的二进制位数,通常等于处理器字长。
- 地址总线:用于指定存储器或外设的具体单元,其个数反应处理器能够访问的主存储器容量或外设范围。
- 控制总线:用于控制处理器数据传送等操作。
- 微型计算机系统包括硬件和软件两大部分。
- 处理器的主要功能是从主存储器读取指令(简称取指),翻译指令代码的功能(简称译码),然后执行指令所规定的的操作(简称执行)。
- 低端处理器一般由算术逻辑单元、寄存器和指令处理单元等几部分组成。
- 算术逻辑单元(ALU):计算机的运算器,负责处理器所能进行的各种运算,主要就是算数运算与逻辑运算。
- 寄存器:处理器内部的需要高速存储单元,用于暂时存放程序执行过程中的代码和数据。
- 指令处理单元:指处理器的控制单元,控制指令的执行和信息的传输。
- 存储模型:
- 平展存储模型:存储器为连续的地址空间,称为线性空间地址。IA-32支持的线性地址空间为 0 ~ 232-1(4GB容量)。
- 段式存储模型:由一组独立的地址空间组成的独立的地址空间称为段,将代码、数据和堆栈存放在分开的段中,程序利用逻辑地址寻址段中的每个字节单元。IA-32处理器支持 16384 (214) 个各种大小和类型的段,每个段可以达到 4GB 容量。
- 实地址存储模型:段式存储模型的特例,线性地址空间最大为 1 MB容量,由最大为 64 KB 的单多个段组成。
- 工作方式:
- 保护方式:可使用 32 条地址总线,寻址 4GB 物理存储器。 处理器工作在保护方式时,可以使用平展或者段式存储模型;冲击力器工作在虚拟8086方式时,只能使用实地址存储模型。
- 保护方式下的虚拟8086方式:是CPU工作于多任务状态下的某一个任务所对应的方式,每个任务的最大寻址空间为 4GB,采用分段方式,每个段最大 4GB,段基址:偏移量(16 位 : 32 位)。但能识别和运行所有 16 位实地址方式的程序。
- 实地址方式:只能寻址 1MB 物理存储器,每个段最大不超过 64KB,但可以使用 32 位操作数和 32 位寻址方式。通电或者复位后,IA-32处理器处于实地址方式。
- 系统管理方式:为操作系统和核心程序提供节能管理和系统安全管理机制。
- 逻辑地址:处理器通过地址总线引脚发送物理地址访问存储器,但进行程序设计时采用逻辑地址,逻辑地址由段基地址和偏移地址组成。
- 段基地址:确定段在主存中的起始地址。其必须是16的倍数。
- 偏移地址:以段基地址为起点,段内的位置都可以用距离该起点的位移量表示,称为偏移地址。其大小不得超过 64 KB。
- 地址转换:
- 保护方式:
- 平展存储模型:段基地址为0,偏移地址等于线性地址
- 段式存储模型:段基地址和偏移地址都为32位,段基地址加上偏移地址等于线性地址。
- 实地址方式:每个段不超过 64 (216)KB,段内偏移地址可以用16位数据表示,将逻辑地址左移 4 位,加上偏移地址即得到20位物理地址。
- 保护方式:
- 指令预取:在8086处理器中,指令的读取发生在 BIU(总线接口单元),而其执行发生在 EU(执行单元),而这两个单元相互独立,分别完成各自的操作,所以可以并行执行。则在 EU 对一个指令进行译码执行时,BIU 可以同时对后续的指令进行读取。
- 指令由操作码和操作数两部分组成。
- 操作码:指令执行的操作(如加、减、传送等)编码称为操作码。
- 操作数:指表示参与操作的对象,可以是一个具体的常量,也可以是保存在寄存器中的数据,还可以是一个保存在存储器中的变量。
- 16位存储器寻址(偏移地址):
- 基址寄存器为:BX 或 BP
- 变址寄存器为:SI 或 DI
- 位移量:8 位或 16 位
- 32位存储器寻址(偏移地址):
- 基址寄存器:EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP
- 变址寄存器:EAX、EBX、ECX、EDX、ESI、EDI、EBP
- 比例:1、2、4、8
- 位移量:8 位或者 32 位
- 数据寻址方式:
- 立即数寻址方式:源操作数直接用常量形式表达,如
mov eax, 33221100h
。
2-寄存器寻址方式:指令的操作数存放在处理器的寄存器中,如mov ebx, eax
。 - 存储器寻址方式:寻址主存中的操作数就称为存储器寻址方式。
- 直接寻址:有效地址只有位移量部分,且直接包含在指令代码中,如:
mov eax, str
- 寄存器间接寻址:有效地址存放在寄存器中,如:
mov edx, [eax]
,mov [esi], ecx
- 寄存器相对寻址:有效地址为寄存器与位移量之和,如:
mov esi, [ebx + 4]
- 变址寻址:使用变址寄存器寻址操作数,如:
mov edi, [ebx + esi]
- 带比例的变址寻址:使用变址寄存器内容乘以相应比例的存储器寻址方式,如:
mov eax, [ebx * 4]
- 直接寻址:有效地址只有位移量部分,且直接包含在指令代码中,如:
- 立即数寻址方式:源操作数直接用常量形式表达,如
- 计算机与外设的数据传送方式:
- 程序查询方式:就是由用户进程直接控制内存或CPU和外围设备之间的信息传送。这种方式控制者都是用户进程。
- 中断传送方式:被用来控制外围设备和内存与CPU之间的数据传送。这种方式要求CPU与设备(或控制器)之间有相应的中断请求线,而且在设备控制器的控制状态寄存器的相应的中断允许位。
- 直接内存方式(DMA):基本思想是在外围设备和内存之间开辟直接的数据交换通道。
- 通道方式:与DMA方式相类似,也是一种以内存为中心,实现设备和内存直接交换数据的控制方式。
- 几类处理器的区别:
- 8086:芯片内外数据总线 16,地址线 20,最大支持主存 1 MB,指令队列 6 字节。14个 16 位的寄存器。
- 8088:芯片内数据总线 16, 芯片外数据总线 8,地址总线 20,最大支持 1 MB 主存。
- 32位cpu:数据和地址总线都为 32,支持 4 GB 物理寻址。指令队列 16 字节。34个寄存器。
二、常用寄存器分类
2.1 通用寄存器
- 一般指处理器最常使用的整数通用寄存器,可用于保存整数数据和地址。
EAX(32位),AX(16位),AH、AL(高、低8位):累加器
EBX(32位),BX(16位),BH、BL(高、低8位):基址寄存器
ECX(32位),CX(16位),CH、CL(高、低8位):计数器
EDX(32位),DX(16位),DH、DL(高、低8位):数据寄存器
ESI(32位),SI(16位):源变址寄存器
EDI(32位),DI(16位):目的变址寄存器
EBP(32位),BP(16位):基址指针寄存器
ESP(32位),SP(16位):堆栈指针寄存器
2.2 标志寄存器
-
EFLAGS(32位),FLAGS(16位):标志寄存器
-
标志寄存器EFLAGS中常用的几个标志位(加粗的为控制标志位,其余为状态标志位)如下:
11 | 10 | 9 | 8 | 7 | 6 | 4 | 2 | 0 |
---|---|---|---|---|---|---|---|---|
OF | DF | IF | TF | SF | ZF | AF | PF | CF |
是否溢出(有符号) | 地址方向变化,为1则地址增大,0地址减小 | 是否允许中段操作 | 是否进入单步调试 | 最高位符号是否为1 | 运算结果是否为0 | 加减运算时,最低半字节有无进位或借位 | 最低字节内的八位二进制数中1的个数,个数为偶数为1,否则为0 | 是否有进位或借位(无符号) |
2.3 专用寄存器
- ESIP(32位),IP(16位):指令指针寄存器,表示将要执行的指令在主存中的位置,该位置用存储器地址表示。
- 段寄存器,如下:
CS(16位)(80x86):代码段寄存器
SS(16位)(80x86):堆栈段寄存器
DS(16位)(80x86):数据段寄存器
ES(16位)(80x86):附加段寄存器(数据)
FS(16位)(IA-32新增):数据段寄存器
GS(16位)(IA-32新增):数据段寄存器
三、处理器基本结构
四、指令和操作符
操作符 | 功能 | 使用形式 |
---|---|---|
dup | 复制操作符 | 重复次数 dup(重复内容/参数) |
[] | 将起来的表达式作为存储器地址指针 | [reg] |
$ | 返回当前偏移地址 | $ |
offset | 返回变量名所在段的偏移地址 | offset 变量名 |
seg | 返回段基地址(实地址存储模型) | seg 变量名 |
ptr | 将变量名按照置顶的类型使用(相当类型转换) | 类型名 ptr 变量名 |
type | 返回一个字量数值,表明变量名的类型 | type 变量名 |
lengthof | 返回一个字量的数据项数(即元素个数) | lengthof 变量名 |
sizeof | 返回整个变量占用的字节数 | sizeof 变量名 |
对于编写指令语句的几点注意事项:
- 双操作数指令(除特别说明)的目的操作数和源操作数必须类型一致。
- 要求类型一致的两个操作数之一必须有明确的类型,否则需用
ptr
指明。 - 双操作数指令(出特别说明)不允许两个操作数都是存储单元。
- 能对专用寄存器进行操作的指令有限、功能不强,使用时需注意。
指令 | 功能 | 使用形式 | 备注 |
---|---|---|---|
org | 从指定的偏移地址处开始安排数据或程序 | org 参数 | |
通用数据传送 | |||
mov | 把一个字节、字或双字的操作数从源位置传送到目的位置 | mov 参数,参数 | |
xchg | 交换源操作数和目的操作数的内容 | xchg 参数,参数 | |
堆栈操作 | |||
push | 将数据压入堆栈,先esp减小到新位置,再将数据压入 | push 寄存器/存储器/立即数 | |
pop | 将堆栈顶部数据出栈,先将栈顶数据弹出到寄存器或存储器,再将esp增大 | pop 寄存器/存储器 | |
pusha/pushad | 将全部16/32位通用寄存器压入堆栈 | pusha/pushad | |
popa/popad | 堆栈顶部数据出栈到全部16/32位通用寄存器 | popa/popad | |
其他传送 | |||
xlat | 用于将一种代码转为另一种代码(al <-- [ebx + al]) | xlat | |
clc/stc/cmc | 更改进位标志 cf = 0/1/取反 | clc/stc/cmc | |
cld/std | 更改方向标志 df = 0/1,串操作后地址增大、减小 | cld/std | |
cli/sti | 更改中段标志 if = 0/1,禁止、允许可屏蔽中段 | cli/sti | |
lea | 获取存储器操作数的地址 | lea reg16/reg32,mem | |
算术运算 | 不可同时为存储单元 | ||
add | 加法指令 dest = dest + src | add r/m, i/r/m | 影响全部状态标志位 |
adc | 带进位加法指令 dest = dest + src + cf | adc r/m, i/r/m | 影响全部状态标志位 |
inc | 增量指令,对操作数加1,reg/mem = reg/mem + 1 | inc reg/mem | 影响除 cf 外的其它状态标志位 |
sub | 减法指令 dest = dest - src | sub r/m, i/r/m | 影响全部状态标志位 |
sbb | 带借位减法指令 dest = dest - src - cf | sub r/m, i/r/m | 影响全部状态标志位 |
dec | 减量指令 reg/mem = reg/mem - 1 | dec reg/mem | 影响除 cf 外的其它状态标志位 |
neg | 求补指令,对操作数执行求补运算 reg/mem=0 - reg/mem | neg reg/mem | 影响全部状态标志位 |
cmp | 比较指令,使目的操作数减去源操作数,差值不返回操作数dest - src | cmp r/m, i/r/m | 影响全部状态标志位 |
mul | 无符号乘法指令 ax = al * r8/m8, dx.ax = ax * r16/m16, edx.eax = eax*r32/m32 | mul src | |
imul(单) | 有符号乘法指令 ax = al * r8/m8, dx.ax = ax * r16/m16, edx.eax = eax*r32/m32 | imul src | |
imul(双) | 有符号双操作数乘法指令 r16 = r16 * r16/m16/i8/i16, r32 = r32 * r32/m32/i8/i32 | imul dest, src | |
imul(三) | 有符号三操作数乘法指令 r16 = r16/m16 * i8/i16, r32 = r32 /m32 * i8/i32 | imul dest, src, imm | |
div | 无符号数除法 | div src | |
idiv | 有符号数除法 | idiv src | |
movzx | 零位扩展,最前面补0 | movzx r16, r8/m8 movzx r32, r8/m8/r16/m16 | |
movsx | 符号扩展,最前面根据符号位进行填补 | movsx r16, r8/m8 movsx r32, r8/m8/r16/m16 | |
位运算 | |||
and | 逻辑与运算 | and r/m, i/r/m | cf = of = 0,影响sf, zf, pf标志位 |
or | 逻辑或运算 | or r/m, i/r/m | cf = of = 0,影响sf, zf, pf标志位 |
not | 逻辑非运算 | not reg/mem | 不影响标志位 |
xor | 逻辑异或运算 | xor r/m, i/r/m | cf = of = 0,影响sf, zf, pf标志位 |
test | 测试指令,按位逻辑与,不返回逻辑与结果,用于设置逻辑与后的标志位 | test r/m, i/r/m | cf = of = 0,影响sf, zf, pf标志位 |
shl | 逻辑(无符号)左移,低位补0,高位进cf | shl reg/mem, i8/cl | 影响cf,of,sf,zf,pf;若一位移动,则of由前后最高位是否发生改变来确定 |
shr | 逻辑(无符号)右移,高位补0,低位进cf | shr reg/mem, i8/cl | 影响cf,of,sf,zf,pf;若一位移动,则of由前后最高位是否发生改变来确定 |
sal | 算数(有符号)左移,低位补0,高位进cf,同shl, | sal reg/mem, i8/cl | 影响cf,of,sf,zf,pf;若一位移动,则of由前后最高位是否发生改变来确定 |
sar | 算数(有符号)右移,高位不变,低位进cf | sar reg/mem, i8/cl | 影响cf,of,sf,zf,pf;若一位移动,则of由前后最高位是否发生改变来确定 |
rol/ror | 不带进位循环左/右移 | sar reg/mem, i8/cl | 影响cf,of,sf,zf,pf;若一位移动,则of由前后最高位是否发生改变来确定 |
rcl/rcr | 带进位循环左/右移,cf也当做一位参与运算 | sar reg/mem, i8/cl | 影响cf,of,sf,zf,pf;若一位移动,则of由前后最高位是否发生改变来确定 |
无条件转移 | |||
jmp | 使程序转到指定的目标地址处继续执行 | jmp label, jmp r32/r16, jmp m48/m32/m16 | |
条件转移 | jcc label | ||
jz/je | 等于0/相等 | zf=1 | |
jnz/jne | 不等于0/不相等 | zf=0 | |
js | 符号为负 | sf=1 | |
jns | 符号为正 | sf=0 | |
jp/jpe | 低字节中 1 的个数为偶数 | pf=1 | |
jnp/jpo | 低字节中 1 的个数为奇数 | pf=0 | |
jo | 溢出 | of=1 | |
jno | 无溢出 | of=0 | |
jc/jb/jnae | 进位/低于/不高于等于 | cf=1 | |
jnc/jnb/jae | 无进位/不低于/高于等于 | cf=0 | |
jbe/jna | 低于等于/不高于 | cf=1或zf=1 | |
jnbe/ja | 不低于等于/高于 | cf=0且zf=0 | |
jl/jnge | 小于/不大于等于 | sf!=of | |
jnl/jge | 不小于/大于等于 | sf=of | |
jle/jng | 小于等于/不大于 | sf!=of或zf=1 | |
jnle/jg | 不小于等于/大于 | sf=of且zf=0 |
标题: | 微机原理考点总结 |
---|---|
链接: | https://www.fightingok.cn/detail/96 |
更新: | 2022-09-18 22:38:25 |
版权: | 本文采用 CC BY-NC-SA 3.0 CN 协议进行许可 |