- 二进制B 八进制O 十进制D 十六进制 H
- 8086CPU分为执行部件EU和总线接口部件BIU
标志寄存器(状态处理字)PSW
AX累加器 BX基址寄存器 CX计数寄存器 DX数据寄存器
指针寄存器(IP):堆栈指针寄存器SP 基数指针寄存器BP(存放基地址)
堆栈段寄存器SS
变址寄存器:源变址寄存器SI 目的变址寄存器DI
PSW是16位的寄存器,只用了9位:
状态标志6个:
OF溢出标志位,SF符号标志位,ZF零标志位,AF半进位标志位
PF奇偶标志位,CF进/借位标志位
控制标志3个:
DF:方向标志位
IF:中断标志位
TF:单步标志位(陷阱标志位)
3.指针寄存器IP 代码段寄存器CS 数据段寄存器DS 附加段寄存器ES
4.指令周期是cpu取出指令并执行这条指令的总时间。
总线周期是cpu通过总线与内存或I/O端口之间,进行一个字节的数据交换所用的时间。
时钟周期:基本定时脉冲的两个沿之间的时间间隔,是微机系统工作的最小时间单元。其值等于系统时钟频率的倒数,时钟周期又称为T状态
一个指令周期由几个机器周期组成,一个总线周期一般由四个时钟组成。
一个基本的读写周期包含4个是时钟状态T1-T4
若存储器或I/O端口来不及接受数据,就在T3和T4之间插入等待时钟TW
CPU在每个总线周期的T3状态开始对READY信号采样,如果检测到该信号为低电平(未准备好),就插入一个等待周期Tw,在Tw状态中继续对该信号采样,如仍为低电平,则继续插入Tw,Tw状态可以插入多个,直到REDAY信号为高电平时, 才进入T4状态
- 内存中的唯一地址是物理地址
物理地址=基/段地址(绝对地址)*16+偏移地址(相对/有效地址)
- 操作数存放地址:
- 指令中,此时操作时就是立即操作数
- CPU的内部寄存器中
- 内存的数据区中
- 立即数寻址(操作数在指令中给出)
立即数寻址只能用于源操作数,不能用于目的操作数,且两个操作数的长度要相等。
立即数是8位时,存放在低地址单元,16位时,高到高,低到低
MOV AL,10H
8.寄存器寻址
操作数放在CPU内部的寄存器中,可以是8位或16位寄存器,注意源操作数和目的操作数的位数应一致。可以同时在源操作数和目的操作数使用。
MOV AX,BX
9.直接寻址
操作数存放在内存中,在指令中直接给出存放操作数的偏移地址(有效地址EA),如果不加说明,默认的段基址是数据DS(3000H)。
传送内存中其他段的数据,在相应的偏移地址前加段超越符“ :”
MOV AX, SS:[0020H]
将堆栈段偏移地址为0020H的地址中的内容传送到AX中去
10.寄存器间接寻址
操作数存放在内存中,但其偏移地址存放寄存器中。在指令中只给出这个寄存器。
作为间址的寄存器只能有4个:SI,DI, BP,BX 操作数有效地址EA=【寄存器】
用BP寻址,段基址默认为堆栈段SS,其余3个的段基址默认为数据段DS,同时指令允许段超越。
物理地址=16*DS(SS)+SI/DI/BX(BP)
MOV AX,[SI]
11.寄存器相对寻址(变址寻址)
作为变址的寄存器只能有4个:BX, SI, DI, BP
偏移地址EA=寄存器内容+指令中给定的偏移量(DISP)
12.基址变址寻址
EA=基址寄存器内容+变址寄存器内容
EA=(BX)/(BP)+(SI)/(DI)
BX SI DI,默认的段基址为DS;BP,默认的段基址为SS。
允许段超越前缀,变址寄存器和基址寄存器要同时存在
13.相对基址变址寻址
EA=基址寄存器内容+变址寄存器内容+偏移量
EA=(BX)/(BP)+(SI)/(DI)+DISP8/16
总结:寄存器寻址和立即寻址不需要物理地址,除了立即寻址之外,源操作数都在寄存器中。
14.通用数据传送指令
MOV指令:将操作数从源地址送入目的地址
CS,IP不能作为目的操作数
立即数不能直接传送给段寄存器 立即数不能作为目的操作数
内存单元间不能直接传送 MOV [SI], [2000H]
两个段寄存器间不能直接传送
堆栈操作指令:
SS是段基址,表示堆栈开始的地方
SP的栈指针,时钟指向栈顶
进栈指令: PUSH SRC
执行操作: SP<--SP - 2
(SP+1, SP )<--SRC
出栈指令: POP DST
执行操作: DST<--(SP+1, SP)
SP<--SP+ 2
堆栈操作必须以字为单位。(立即数不能做操作数)
CS不能作为出栈对象
XCHG交换指令:将源操作数和目的操作数内容进行交换,字和字节都可以
XCHG OPRD1, OPRD2
OPRD1 <-->OPRD2
字和字节不能交换
立即数和段寄存器不能作为操作数,CS和IP不能交换
15.累加器专用传送指令(只与AX,AL有关)
输入指令:
长:IN AL,PORT(字节)
IN AX,PORT(字)
短:IN AL,DX(字节)
IN AX,DX(字)
输出指令:
长:OUT PORT,AL(字节)
OUT PORT,AX(字)
短:OUT DX,AL(字节)
OUT DX,AX(字)
当外口地址大于8位(0FFH即255)时,用DX作间址
XLAT查表指令:
XLAT OPR
AL <---[BX + AL]
地址传送指令:
LEA有效地址送寄存器
LEA REG, SRC
执行操作: REG<---SRC的EA
LEA SI, [2728H] ; SI<---2728H
等价于MOV SI,2728H
REG不能是段寄存器
LDS指针送寄存器和DS
LDS REG, SRC
执行操作:REG<---(SRC) DS<---(SRC+2)
将源操作数中的低字送入16位寄存器,高字送入DS
LES指针送寄存器和ES
LDS REG, SRC
执行操作:REG<---(SRC) ES<---(SRC+2)
将源操作数中的低字送入16位寄存器,高字送入ES
标志寄存器传送指令:
LAHF指令:标志寄存器PSW中的低8位--->AH中
SHAF指令:AH--->标志寄存器PSW中的低8位
PUSHF指令:
执行操作: SP<---SP - 2
(SP+1, SP ) <---PSW
POPF指令:
执行操作: PSW <---(SP+1, SP)
SP<---SP+ 2
符号扩展指令:
CBW 将字节扩展成字的指令
执行操作:若AL的最高有效位为0,则AH= 00H
若AL的最高有效位为1,则AH= 0FFH
CWD将字扩展成双字的指令
执行操作:若AX的最高有效位为0,则DX=0000H
若AX的最高有效位为1,则DX= 0FFFFH
- 算数运算指令
(1)加法指令
ADD加法指令
ADD DST,SRC
(DST)<----(DST)+(SRC)
两个操作数不可以都是内存单元
ADC带进位加法指令
ADC OPRD1, OPRD2
OPRD1< ---OPRD1 + OPRD2+CFà
INC加1指令
INC OPRD
OPRD+1--->OPRD
加法指令影响状态标志位,但INC不影响CF。
(2)减法指令
SUB减法指令
SUB OPRD1, OPRD2
OPRD1 - OPRD2--->OPRD1
SBB带借位减法
SBB OPRD1, OPRD2
OPRD1- OPRD2-CF--->OPRD1
DEC减1指令
DEC OPRD
OPRD-1--->OPRD
不影响借位标志
NEG求补指令
NEG OPRD
- OPRD--->OPRD
只有当操作数为0时,CF为0, 否则CF总为1
CMP比较指令
CMP OPRD1, OPRD2;
OPRD1---OPRD2à结果不保存
ZF为1,则两者相等,为0不等
(3)乘法指令
MUL无符号乘法指令
MUL SRC
执行操作:字节操作数 AX< --- AL * SRC
字操作数 (DX, AX) < --- AX * SRC
SRC不能为立即数
IMUL有符号乘法指令
IMUL SRC
执行操作于MUL相似,必须是带符号数
乘法指令中,目的操作数必须是累加器,字节为AL,字为AX。运算结果只影响CF,OF.
(4)除法指令
DIV无符号除法
DIV SRC
执行操作:
字节操作: AX/SRC--->AL 商
AX/SRC--->AH 余数
字操作:(DX,AX)/SRC--->AX 商
(DX,AX)/SRC--->DX 余数
IDIV有符号除法
IDIV SRC
执行操作同上
除法运算指令中,除数是被除数一半的字长
17.逻辑运算指令
AND逻辑与,OR逻辑或,XOR异或均为双操作数指令,长度必须相等,同为字或字节
这三条指令执行后,CF=0, OF=0, SF, PF, ZF发生变化。
NOT逻辑非(按位取反)
指令格式:NOT OPRD
TEST测试指令
TEST OPRD1, OPRD2
按位与操作,不保留结果,只影响标志位
18.移位指令
SAL:算术左移 SAL OPR,CNT
SHL:逻辑左移 SHL OPR,CNT
左移一位进CF,右边补0,相当于乘2。
若移位后最高位与CF不同,则OF=1,表示移位前后数据变号。
若移位位数大于1,所移的位数用CL存放
SAR: 算术右移
最低位进CF, 左边重复最高位, 即操作数符号不变。
SHR: 逻辑右移
最低位进CF, 左边补0。
ROL: 不带进位循环左移
MOV AL, -126 AL: 1000 0010
ROL AL, 1 AL: 0000 0101
移位后最高位与CF不同,则OF=1,表示移位前后数据变号。
ROR: 不带进位循环右移
MOV AL, -126 AL: 1000 0010
ROR AL, 1 AL: 0100 0001
RCL: 带进位循环左移
STC CF=1
MOV AL, -126 AL: 1000 0010
RCL AL, 1 AL: 0000 0101
RCR: 带进位循环右移
STC CF=1
MOV AL, -126 AL:1000 0010
RCR AL, 1 AL: 1100 0001
19.串操作指令
MOVS串传送指令
MOVSB 字节传送
执行操作: (1) DF=0,传送 (ES: DI) ← (DS: SI)
(2) 修改指针 SI←SI±1, DI←DI±1
MOVSW 字传送
执行操作: (1) DF=1,传送 (ES: DI) ← (DS: SI)
(2) 修改指针 SI←SI±2, DI←DI±2
DF=1时,减量,DF=0,增量
CMPS串比较指令
CMPSB,字节操作:((SI))—((DI))
SI,DI自增1
CMPSW,字操作:((SI))—((DI))
SI,DI自增2
DF=1时,减量,DF=0,增量
SCAS串搜索指令
SCASB:(AL)-((DI)),DI自增1
SACSW:(AL)-((DI)),DI自增2
DF=1时,减量,DF=0,增量
LODS串取指令
LODSB:(AL)<---((DI)),DI自增1
LODSW:(AL)<---((DI)),DI自增2
DF=1时,减量,DF=0,增量
STOS串存指令
STOSB:(DI)<---((AL)),DI自增1
STOSW:(DI)<---((AX)),DI自增2
DF=1时,减量,DF=0,增量
REP重复指令
(CX)=0,退出重复,(CX)!=0,(CX)<--(CX)-1,执行其后串操作指令
REPE/REPZ相等/为0重复指令
执行操作:如CX=0或ZF=0则退出,否则执行CX←CX-1
REPNE/REPNZ不相等/不为0重复指令
执行操作:如CX=0或ZF=1则退出,否则执行CX←CX-1
20.处理器控制指令(PSW)
置位(SET):赋值1; 清位(CLEAR): 赋值0
取补(COMPLEMENT): 对当前值取反