echo

任生命穿梭 时间的角落

0%

微机原理

计算机工作原理

冯诺依曼计算机体系结构:输入设备、输出设备、存储器、运算器和控制器。

8086

共 20 根地址线,16根数据线。地址线 20 根代表可寻址的空间为 1MB,数据线为 16 根代表处理器字长为 16位。

地址线和数据线

  • AD0 — AD7 低 8 位地址和低 8 位数据信号分时复用,传递地址信号位单向,传送数据信号时为双向。
  • A16 — A19 高 4 位地址信号,与状态信号分时复用。
  • A8 — A15 8 位地址信号。

控制信号和状态信号

image-20200509141827458

内部寄存器

含 14 个 16 位寄存器,按功能可分为三类:8 个通用寄存器、4 个段寄存器和 2 个控制寄存器。

通用寄存器
  • 数据寄存器:AX、BX、CX、DX。

  • 地址指针寄存器:SP、BP。

  • 变址寄存器:SI、DI。

AX:累加器。所有 I/O 指令都通过 AX 与接口传送信息,中间运算结果也多放于 AX 中。

BX:基址寄存器。在间接寻址中用于存放基地址。

CX:计数寄存器。用于在循环或串操作指令中存放计数值。

DX:数据寄存器。在间接寻址的 I/O 指令中存放 I/O 端口地址,在 32 位乘除法运算时,存放高 16 位数。

SP:堆栈指针寄存器,其内容为栈顶的偏移地址。

BP:基址指针寄存器,常用于在访问内存时存放内存单元的偏移地址。

BX 用于数据段,BP 用于堆栈段。

SI:源变址寄存器

DI:目标变址寄存器

控制寄存器
  • CF 进位标志位;
  • PF 奇偶标志位;
  • AF 辅助进位位;
  • ZF 零标志位,当运算结果为零时置 1 ;
  • SF 符号标志位,运算结果最高位为 1 时,SF = 1;
  • OF 溢出标志位。
段寄存器
  • CS 代码段寄存器,存放代码段的段基地址。
  • DS 数据段寄存器,存放数据段的段基地址。
  • ES 附加段寄存器,存放数据段的段基地址。
  • SS 堆栈段寄存器,存放堆栈段的段基地址。

寻址方式

立即寻址

例如 MOV AX,1200H。仅适合于源操作数。

寄存器寻址

例如 MOV AX,BX。参加操作的操作数在 CPU 的通用寄存器中。

直接寻址

例如 MOV AX,[1200H]。指令中直接给出操作数的偏移地址。

寄存器间接寻址

例如 MOV AX,[BX]。参加操作的操作数放在内存中,其偏移地址为指令中寄存器的内容。

存放偏移地址的寄存器称为间址寄存器,它们分别是 BX,BP,SI,DI。

操作数的段地址取决于选择哪一个间址寄存器。当选择 BX,SI,DI 时默认在数据段。当选择 BP 时默认在堆栈段。

寄存器相对寻址

例如 MOV AX,[BX+DATA]。操作数的偏移地址为寄存器的内容加上一个位移量。

基址寄存器为 BX 时默认在数据段;基址寄存器为 BP 时,默认在堆栈段。

基址变址寻址

例如 MOV AX,[BP+DI+DATA]。操作数的偏移地址为基址寄存器内容+变址寄存器内容+位移量。操作数的段地址由选择的基址寄存器决定。

8086 指令系统

从功能上包括六大类:

数据传送、算术运算、逻辑运算和移位、串操作、程序控制和处理器控制。

数据传送指令

包括通用数据传送、输入输出、地址传送和标志位操作。

通用数据传送

该类指令的执行对标志位不产生影响。

mov 指令

MOV dest, src

两操作数 字长必须相同,两操作数不允许同时为存储器操作数、不允许同时为段寄存器,在源操作数是立即数时,目标操作数不能是段寄存器。

入栈/出栈指令

PUSH oprd

POP oprd

oprd 为 16 位寄存器或存储器两单元,不能为立即数。

交换指令

XCHG REG, MEM/REG

两个操作数必须有一个是寄存器操作数,不允许使用段寄存器。

查表指令

XLAT

用 BX 的内容代表表格首地址,AL 内容为表内位移量,BX+AL得到要查找元素的偏移地址。将 BX+AL 所指单元的内容送 AL。

输入输出指令

输入指令:IN acc,PORT

输出指令:OUT PORT,acc

根据端口地址码的长度,指令有两种不同的端口地址表现形式。

  • 直接寻址。端口地址为 8 位时,指令中直接给出 8 位端口地址,寻址 256 个端口。
  • 间接寻址。端口地址为 16 位时,指令中的端口地址必须由 DX 指定;可寻址 64K 个端口。
地址传送指令

取偏移地址指令 LEA。计算 MEM 相对于 REG 的偏移地址。

LEA REG, MEM

将变量的 16 位偏移地址取出送目标寄存器。源操作数必须是一个存储器操作数,目标操作数通常是间址寄存器。

算术运算指令

算术运算指令的执行大多对状态标志位会产生影响。

加法指令

普通加法指令

ADD oprd1,oprd2

oprd1 = oprd1 + oprd2

带进位的加法指令

ADC oprd1,oprd2

oprd1 = oprd1+oprd2+CF

自增指令

INC oprd

oprd += 1

减法指令

普通减法指令

SUB oprd1, oprd2

oprd1 = oprd1 - oprd2

考虑借位的减法指令

SBB oprd1, oprd2

oprd1 = oprd1 - oprd2 - CF

自减指令

DEC oprd

oprd -= 1

取反指令

NEG oprd

oprd = 0-oprd

比较指令

CMP oprd1, oprd2

oprd1 - oprd2

影响标志位 如果 oprd1 > oprd2 则 CF = 0

乘法指令

无符号乘法指令 MUL

MUL oprd

oprd 为字节数 AX = AL * oprd

oprd 为 16 位数 DX AX = AX * oprd

除法指令

DIV oprd

若 oprd 是字节数 执行 AL / oprd。结果 AL 为商, AH 为余数

若 oprd 是双字节数执行 DX AX / oprd。结果 AX 为商,DX 为余数。

逻辑运算和移位指令

逻辑运算

AND oprd1, oprd2

OR oprd1, oprd2

NOT oprd 操作数按位取反再送回原地址,操作数不能为立即数,指令的执行对标志位无影响。

XOR oprd1, oprd2 两操作数异或,结果送目标地址

TEST oprd1, oprd2 将执行 “与” 操作,但运算的结果不送回目标地址。

移位指令

逻辑左移 SHL 、逻辑右移 SHR:将移动的位补 0 ,移除的位到 CF。

算术左移SAL、算术右移SAR:符号位不动,移动的位补 0 ,移除的位到 CF 。

不带进位循环左移ROL、不带进位循环右移ROR:将移除的位同时加到 CF 和被移动的位。

带进位循环左移 RCL、带进位循环右移 RCR:CF 参与循环移位,向左循环移位则 CF 在最左边(向右循环则 CF 在最右边)。

程序控制指令

转移指令

无条件转移指令 JMP oprd 。oprd 是 16 位偏移地址。

条件转移指令

JC/JNC、JZ/JNZ、JO/JNO、JP/JPE分别判断 CF、ZF、OF、PF 是否为 1 /为 0 。

循环控制指令

LOOP 循环次数由 CX 决定。用法 LOOP Label

过程调用和返回

调用 CALL PROC

返回 RET,一般位于子程序的最后