第三章8086微处理器
8086寄存器
8086/8088微处理器中可供程序员使用的有14个16位寄存器,按照用途可分为通用寄存器
、指令指针
、控制寄存器
和段寄存器
等4类。
通用寄存器
数据寄存器
15-8 | 7-0 |
---|---|
AH | AL |
BH | BL |
CH | CL |
DH | DL |
AX累加器
- 存放数据
- IO指令中提供/存储操作数(AX/AL)
1
IN AL, 12H
BX基础寄存器
- 存放数据
- 可以提供偏移地址
1
2MOV AX,BX BX当作数据
MOV AX,[BX] 将内存中的数据段中偏移地址为BX的值赋给AX
CX计数寄存器
- 存放数据
- 可以提供循环程序的循环次数,
loop
会使CX
自减一。
DX数据寄存器
- 存放数据
- 在乘除法提供一个默认操作数
1
2DIV BX;
(DX AX)/BX 由DX和AX组成一个32位操作数 - 提供IO端口地址
1
OUT DX,AL
指针寄存器
15-0 |
---|
SP |
BP |
SP堆栈指针寄存器
- 堆栈操作指令PUSH和POP访问
BP基址
- 可以默认提供堆栈段的偏移地址但是PUSH和POP不能访问
变址寄存器
15-0 |
---|
SI |
DI |
SI源变址寄存器DI目的变址寄存
- 在串操作指令中分别指向原串和目的串
段寄存器
15-0 | 名称 |
---|---|
CS | 代码段寄存器 |
DS | 数据段寄存器 |
SS | 堆栈段寄存器 |
ES | 附加数据段寄存器 |
- 用来提供段地址
控制寄存器
15-0 |
---|
IP |
BP |
IP指令指针寄存器
- 指向CPU即将取用的位置
FLAGS状态标志寄存器
- 查看状态
1
8086/8088有一个16位的标志寄存器FLAGS,在FLAGS中有意义的有9位,其中6位是状态位:CF、PF、AF、ZF、SF、OF,3位是控制位:TF、IF、DF。
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 O D I T S Z A P C
状态标志位:表示处理器当前的运行状态
CF–进位标志,运算结果有进(借)位,CF=1
AF–辅助进位标志,低4位向前有进(借)位,AF=1
ZF–零标志,结果为0,ZF=1
SF–符号标志,最高位的值
OF–溢出标志位,带符号数,双高为判别法(数值位往上进位和符号位往上进位的异或)
PF–奇/偶标志,运算结果低8位中1的个数位偶数个PF=1控制标志:控制处理器的某一特定功能
IF–可屏蔽中断允许标志,IF=1表示允许
DF–方向标志,DF=0地址增量变化;DF=1地址减量变化;
TF–陷阱标志(单步执行标志)
偏移地址和段寄存器的默认关系
- CS–IP
- DS–BX,SI,DI,位移量
- SS–BP,SP
- ES–DI(串操作)
8086微处理器引脚功能
AB:20,DB:16,CB:16,VCC:1,GND:2,CLK:1;
- AD15~AD0为地址/数据总线(分时复用,1/4为地址总线,3/4为数据总线);A19-A16/S6~S3为地址/状态总线。
- 数据总线用来在CPU与内存储器或IO设备之间交换信息,为双向、三态信号;
- 地址总线由CPU发出,用来确定CPU要访问的内存单元(或I/O端口)的地址信号,为输出、三态信号。
- CLK:时钟信号输入,为8086CPU提供基本的定时脉冲,其占空比为1:3,以提供最佳的内部定时。
- MN/MX:高电平为最小工作方式,单CPU工作,低电平为最大工作方式,多处理器合作。
- RESET:输入,为高时,CPU执行复位;
- NMI:非屏蔽中断请求信号(不可屏蔽中断请求);
- INTR:可屏蔽中断请求
- INTA:中断响应信号
- RD:读信号
- WR(LOCK):写信号
- M/IO(S2):指出当前访问的是内存还是IO接口
- READY:表示数据准备好的信号,CPU在T3状态查询该信号,如果有效,说明数据准备好了,否则插入若干个等待状态TW;
- BHE/S7:高8位数据线允许信号,低表示高8位有效,高表示低8位有效。
- ALE:地址锁存信号,在第一个时钟周期结束后,ALE由高变低时锁存。
- DT/R:表示数据传送方向,高:CPU输出,低:CPU输入。
- DEN:数据是否允许通过,低电平表示有效,高电平无效。
- HOLD:总线请求信号
- HLDA:当CPU收到HOLD时,不需要在使用总线时发送HLDA信号。
- TEST:用于CPU与外部硬件同步,当CPU在执行WAIT指令时,CPU会对该引脚进行测试。
第四章8086指令系统
8086/8088指令系统的寻址方式
寻找操作数存放地址的方法。
- 操作数可以包含在指令字节中,叫做
立即数操作数
。 - 操作数可以放在CPU的某个内部寄存器中,这种操作数叫做
寄存器操作数
。 - 操作数在内存数据区中,位
存储器操作数
。 - 操作数来自或送到I/O端口中,叫
I/O操作数
。
在8086/8088系统中,操作数又分为两大类:数据操作数
和地址操作数
。寻址方式为数据寻址方式
和地址寻址方式
两个类。
立即数寻址方式
立即数寻址方式一般都为常量,包含在指令码中。
寄存器寻址方式
IO端口寻址方式
- 直接端口寻址方式(小于FFH)
1
IN AL,21H
- 间接端口寻址方式
存储器寻址方式
- 直接寻址方式(数值,物理地址)
- 间接寻址方式
- 寄存器相对寻址方式
- 基址加变址寻址方式
- 基址加变址相对寻址
地址寻址方式
段内直接寻址方式
转移的地址是当前IP内容和指令规定的8位或16位位移量之和。
当转移两是8位时,称为短程转移
,通常在目标地址前加操作符SHORT
;位移量是16位时称为近程转移
,在目标地址前加操作符NEAR PTR
。
段内间接寻址方式(只变IP,不变CS)
1 | JMP BX |
段间直接寻址方式(都变)
段间间接寻址方式
数据传送指令
最基本的传送指令MOV
1 | MOV dst,src; (dst)<--(src) |
堆栈操作指令(不支持立即数)
堆栈操作指令是用来完成压入和弹出堆栈操作的。
压入堆栈指令
1 | PUSH scr; (SP)<--(SP)-2, |
弹出堆栈指令
1 | POP dst; (dst)<--((SP)+1:(SP)), |
交换指令XCHE(Exchange)
1 | 格式:XCHEG OPR1,OPR2 |
累加器专用指令
输入/输出指令
直接寻址的输入指令
1
IN acc,port; (acc)<--(port)
间接寻址的输入指令
1
IN acc,DX; (acc)<--((DX))
直接寻址的输出指令
1
OUT port,acc; (port)<--(acc)
间接寻址的输出指令
1
OUT DX,acc; ((DX))<--(acc)
字节转换指令
指令格式及操作:
1 | XLAT src_table; (AL)<--((BX)+(AL)) |
使用前建立一个字节表格,表格的首址存入BX,要转换的代码放入AL,然后执行XLAT,在AL中得到转换以后的代码。
地址传送指令
- 取有效地址指令
1
2LEA reg16,mem
将源操作数的16位偏移地址,送到一个16位的通用寄存器中。 - 地址指针装入DS指令
1
2
3
4指令格式:
LDS reg16,mem32
此指令的功能是将源操作数所对应的双字节的内存单元中的高字节(一般为16位段基址)送入DS,低字节内容(一般为偏移地址)送入指令所指定的寄存器中。
例如:LDS DI,[2130H] - 地址指针装入ES指令
1
2
3指令格式:LES reg16,mem32
将源操作数高子内容送入ES,低字内容放入指定寄存器中。
例如:LES DI,[2130H]
标志传送指令
- 取标志指令
指令格式:LAHF
FLAGS低八位内容放入AH - 置标志指令
指令格式:SAHF
AH内容放入FLAGS低八位 - 标志压入堆栈指令
1
2指令格式:PUSHF; (SP)<--(Sp)-2,
((SP)+1;(SP))<--(FLAG) - 标志弹出堆栈指令
1
2指令格式:POPF; (FLAG)<--((SP)+1;(SP)),
(SP)<--(SP)+2
算术运算类指令
加法指令
ADD(add)
加法
格式:ADD DST,SRC
操作:DST <= DST + SRCADC
带进位的加法
格式:ADC DST,SRC
操作:DST <= DST + SRC + CFINC
加1
格式:INC DST
操作:DST <= DST + 1
如要计算两个十六进制数之和
1 | MOV CX,5; 设置循环次数 |
减法指令
SUB
减法
格式: SUB DST,SRC
操作: DST=DST-SRCSBB
带借位的减法
格式: SBB DST,SRC
操作: DST<=DST-SRC-CFDEC
减1
格式: DEC DST
操作: DST=DST-1NEG
求补
格式:NEG DST
操作:DST<=0-DST
利用NEG指令获得负数的绝对值CMP
比较
格式:CMP DST,SRC;
操作:DST-SRC
相当于减法,但不保存结果,仅影响标志。
乘法指令
MUL
无符号乘法
格式:MUL SRC
操作:AX<=ALSRC(字节)/DX,AX<=AXSRC(字)IMUL
有符号数乘法
格式:IMUL SRC
操作:类似MUL。
默认使用AX或DX,AX为目的操作数。
除法指令
DIV
无符号数除法
操作:
- 字节除法:AX/SRC,商=>AL,余数=>AH
- 字除法:DX,AX/SRC,商=>AX,预处=>DX
IDIV
有符号数除法
格式: IDIV SRC
操作: 类似DIV
逻辑类指令
AND
与指令
格式:AND dst,src
操作功能:将目的操作数与原操作数按位与OR
或指令
格式:OR dst,src
操作功能:将目的操作数与原操作数按位或NOT
取反指令
格式:NOT dst
操作功能:0FFH-(dst)或0FFFFH-(dst)XOR
异或指令
格式:XOR dst,src
操作功能:dst和src按位异或TEST
相当于AND运算,但是不保存结果,仅影响标志。1
2
3
4
5常见的用法举例:
(1)清进位标志位:AND AX,AX或OR AL,AL等。
(2)清零操作数:XOR AX,AX不仅把AX清零,而且影响标志位。
(3)把某几位取反:用XOR指令,把要取反的位和1异或,不变的和0异或。
(4)清零或置位某几位:用AND指令清零,用OR指令置位。- 移位指令(H逻辑移位,A算术移位)
- 循环移位指令(O不带进位,C带进位)
串操作
串操作指令的特征是对数据块(字符串或数值串)进行操作,并且其中部分指令可以两个操作数同时是存储器的操作数。
MOVS
串传送CMPS
串比较SCAS
串扫描LODS
串装入STOS
串送存
控制转移类指令
能够使程序的执行流程发生改变的指令
- 无条件转移
JMP
转移指令
操作:有以下几种类型
- 段内直接短转移
1
JMP SHORT opr ;(IP)<--(IP)+Data8
- 段内直接近转移
1
JMP NEAR PTR opr; (IP)<--(IP)+Data16
- 段内间接转移
1
JMP WORD PTR opr (IP)<--寄存器或存储器操作数
- 段间直接转移
1
JMP FAR PTR opr
- 段间间接转移
1
JMP DWORD PTR opr
- 条件转移指令
- 判断单个标志
ZF:JZ(JE),JNZ(JNE)
SF:JS,JNS
OF:JO,JNO
PF:JP,JNP
CF:JC,JNC - 判断无符号数的大小
助记符意义:A(above):大于,B(below):小于,E(equal):等于
JB(JNAE),JNB(JAE),JA(JNBE),JNA(JBE)
判断CF and ZF - 判断有符号数大小
助记符意义:G(greater):大于,L(less):小于,E(equal):等于
JL(JNGE),HNL(JGE),JLE(JNG),JNLE(JG)
判断CF and ZF and SF - 判断CX寄存器
JCXZ:CX=0(为0转移)
- 循环控制指令
- 标志处理指令
汇编语言程序设计
汇编语言源程序格式
例如编程实现多字节加法,如S=3B74AC60F8H+20D59E36C1H
1 | DATA SEGMENT ;定义数据段起始语句 |
顺序结构
例:求两个数的平均值。这两个数分别放在X单元和Y单元中,而平均值放在Z单元中
1 | DATA SEGMENT |
分支结构
1 | DATA SEGMENT |
循环程序设计
循环结束条件
- 用计数控制循环:适用于
已知循环次数
的循环程序设计 - 用条件控制循环:适用于
未知循环次数
的程序设计
例:在xx单元开始的连续单元中存放有10个无符号字节数,从中找出最大者送yy单元1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22DATA SEGMENT
xx DB 49,38,65,12,97,13,55,27,28,85
yy DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA BX,XX
MOV AL,[BX]
MOV CX,9
LOOP1:INC BX
CMP AL,[BX]
JAE NEXT
XCHG AL,[BX]
NEXT:LOOP LOOP1
MOV YY,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START