计算机工作原理
冯诺依曼计算机体系结构:输入设备、输出设备、存储器、运算器和控制器。
8086
共 20 根地址线,16根数据线。地址线 20 根代表可寻址的空间为 1MB,数据线为 16 根代表处理器字长为 16位。
地址线和数据线
- AD0 — AD7 低 8 位地址和低 8 位数据信号分时复用,传递地址信号位单向,传送数据信号时为双向。
- A16 — A19 高 4 位地址信号,与状态信号分时复用。
- A8 — A15 8 位地址信号。
控制信号和状态信号
内部寄存器
含 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,一般位于子程序的最后