8086
1、8086内部结构:总线接口部件BIU(地址加法器、专用寄存器组、指令队列缓冲器、总线控制逻辑),指令执行部件(算术逻辑单元、标志寄存器、通用寄存器、EU控制系统)。
通用寄存器:AX(AH,AL)、BX(BH,BL)、CX(CH,CL)、DX(DH,DL)、SP、BP、SI、DI。
控制寄存器:IP、FLAGS。
段寄存器:CS、DS、ES、SS。
FLAGS:状态标志位(CF、PF、AF、ZF、SF、OF),控制标志位(IF、TF、DF)
逻辑地址来源:IP—CS,SP—SS,EA—DS,SI—DS,DI—ES。
寻址方式:立即寻址(MOV AL,06H)、直接寻址(MOV AL,[3000H])、寄存器寻址(MOV AL,BX)、寄存器间接寻址(MOV AL ,[BX])、带位移的基址寻址(MOV AL ,4000H[BP])、带位移的变址寻址(MOV AL ,4000H[SI])、基址变址寻址(MOV AL,[BX][SI])、带位移的基址变址寻址(MOV AL ,4000H[BX][SI])。基址(BX、BP),变址(SI、DI),位移量(8位、16位)。存储器寻址:PA物理地址=DS段地址×10H+EA有效地址。
OPR:表示除立即数外所有的寻址方式。
PTR:表示临时指定类型,前面类型有BYTE、WORD、DWORD等
2、8086指令系统:
目标操作数:不允许为立即数和其他同源操作数。
源操作数:可以是8/16位通用寄存器、段寄存器、存储器中的某个字节/字或者8/16位的立即数。
MOV 目标,源; 传送指令
PUSH 源; 入栈指令
POP 目标; 出栈指令
XCHG 目标,源; 交换指令
XLAH ; 换码指令
LEA 目标,源; 目标地址传送指令
LDS 目标,源; 指针送寄存器和DS指令
LES 目标,源; 指针送寄存器和ES指令
LAHF ; 标志位送AH指令
SAHF; AH送标志寄存器指令
PUSHF; 标志进栈指令
POPF; 标志出栈指令
ADD 目标,源; 加法指令
ADC 目标,源; 带进位的加法指令
INC 目标; 加1指令
SUB 目标,源; 减法指令
SBB 目标,源; 带借位的减法指令
DEC 目标; 减1指令
NEG 目标; 求补指令
CMP 目标,源; 比较指令
MUL 源; 无符号数乘法指令
IMUL 源; 有符号数乘法指令
DIV 源; 无符号数除法指令
IDIV 源; 有符号数除法指令
CBW ; 字节转为字指令
CWD; 字转为双字指令
NOT 目标; 逻辑非指令
AND 目标,源; 逻辑与指令
OR 目标,源; 逻辑或指令
XOR 目标,源; 逻辑异或指令
TEST 目标,源; 测试指令
SHL 目标,计数值; 逻辑左移指令
SAL 目标,计数值; 算术左移指令
SHR 目标,计数值; 逻辑右移指令
SAR 目标,计数值; 算算术右移指令
ROL 目标,计数值; 循环左移指令
ROR 目标,计数值; 循环右移指令
RCL 目标,计数值; 带进位的循环左移指令
RCR 目标,计数值; 带进位的循环右移指令
串指令操作:源操作数地址固定由DS:SI提供,目标操作数固定由ES:DI提供。
前缀:REP(无条件重复)、REPE(相等时重复)、REPNE(不相等时重复)、REPZ(结果为0时重复)、REPNZ(结果不为0时重复)。
MOVS 目标串,源串; 串传送指令
MOVSB 字节传送
MOVSW 字串传送
CMPS 目标串,源串; 串比较指令
CMPSB 字节串比较
CMPSW 字串比较
SCAS 目标串; 串扫描指令
SCAB 字节串扫描
SCAW 字串扫描
LODS 源串; 取串指令
LODSB 取字节串
LODSW 取字串
STOS 目标串; 存串指令
STOSB 存入字节串
STOSW 存入字串
HLT 停机指令
NOP 无操作数指令
3、汇编语言设计
汇编语句格式:
指令语句(标号: 指令名称 操作数 ;注释)
如:DELAY: LOOP DELAY ;延时操作
指示性语句(名称 伪指令名称 操作数 ;注释)
如:STR EQU 9 ;给STR赋值9
变量:(段属性、偏移属性、类型属性)
类型属性:BYTE(字节变量)、WORD(字变量)、DWORD(双字变量)
变量名 DB/DW/DD 表达式 定义(单)字节/字(2字节)/双字(4字节)变量
如:DATA1 DB 10,10H,’AB’,?;定义字节变量DATA1,且其内容值为10,10H,’AB’及不确定数
LAB DB 5 DUP(0) ;定义LAB为5个0组成的字节变量,即从LAB单元起连续5个内容清零
标号:(段属性、偏移属性、距离属性)
距离属性:NEAR(段内使用)、FAR(段间使用)
算术运算符:
+ 加法 MOV AH,2+3ß----àMOV AH,5;
- 减法 MOV AL,6-3ß----àMOV AL,03H;
× 乘法 MOV AL,2*3ß----àMOV AL,06H;
/ 除法 MOV CL,33/5ß----àMOV CL,06H;
MOD 模除 MOV DL,23 MOD 5ß----àMOV DL,03H;
SHL 左移 MOV BL,00100011B SHL 4ß--àMOV BL,00110000B
SHR 右移 MOV BL,0010B SHR 4ß--àMOV BL, 0000B
逻辑运算符:
NOT 非运算 NOT 1010B = 0101B
AND 与运算 1011B AND 1100B = 1000B
OR 或运算 1011B OR 1100B = 1111B
XOR 异或运算 1011B XOR 1100B = 0111B
关系运算符:
EQ 相等 MOV AL,5 EQ 11B =00H全0(假)
NE 不等 5 NE 11B = 全1 (真)
LT 小于 5 LT 3 = 全0(假)
LE 小于等于 MOV AX,5 LE 101B = 0FFFFH全1(真)
GT 大于 5 GT 100B = 全1(真)
GE 大于等于 5 GE 111B = 全0(假)
分解运算符:
SEG 变量或标号: 返回段地址 SEG N1 = N1所在的段地址
OFFSET 变量或标号: 返回偏移地址 OFFSET N1 = N1所在的偏移地址
LENGTH 变量: 返回变量单元数 LENGTH N2 = N2单元数
如:P1 DB 10 DUP(?) MOV AL, LENGTH P1ß----àMOV AL,10
P1 DW 20 DUP(?) MOV AL, LENGTH P1ß----àMOV AL,20
TYPE 变量或标号: 返回元素字节数 TYPE N2 = N2 中元素字节数
如:A1 DB 21H,42H; MOV AL,TYPE A1 ß--àMOV AL,1
A1 DW 21H,42H; MOV AL,TYPE A1 ß--àMOV AL,2
SIZE 变量: 返回变量总字节数 SIZE N2 = N2 总字节数
SIZE=LENGTH * TYPE
如:P1 DB 10 DUP(?) MOV AL, SIZE P1ß----àMOV AL,10
P1 DW 20 DUP(?) MOV AL, SIZE P1ß----àMOV AL,40
修改属性:
PTR:类型 PTR 变量/标号 ; 将变量或者标号类型转为PTR左边的类型
如:MOV AX,WORD PTR M1;将M1类型转为字节型
JMP FAR PTR L1 ;将L1距离属性转为段间
THIS: 变量/标号 EQU THIS 类型 ;将变量或标号定义为指定的类型(不分配新的存储单元,其寻址空间与跟在后面变量的寻址空间相同)
如:BB EQU THIS BYTE ;AA DD 44332200H ;BB和AA分别为字节和双字变量,但具有相同的寻址空间。
伪指令语句:
EQU:等值伪指令(符号名 EQU 表达式);同一个程序中不允许重新定义且不占内存空间(表达式可以为:一个值、符号名、表达式、助记符)
如:COUNT EQU 256;BETA EQU BX+SI;ALP EQU COUNT-1;BUT EQU SEG MN;EMP EQU OFFSET MN;
=:等号伪指令(与EQU格式和功能相同)用等号定义的符号允许重新定义。
如:EMP = 200H;COUNT = 100;EMP = COUNT;
SEGMENT和ENDS:段定义伪指令
如:DATA SEGMENT
[内容]
DATA ENDS ;任何逻辑段从SEGMENT开始到ENDS结束
ASSUME:段分配伪指令 ;为段分配段寄存器
如:ASSUME CS:CODE,DS:DATA,ES:EXTRA,SS:ASTACK
$ :当前偏移地址
如:BUF DB ‘123456’ ;COUNT EQU $-BUF;COUNT中存放BUF中的字节数。$表示count的首地址即BUF的末地址,而BUF表示BUF的首地址。
ORG:设置$值
如:ORG 10H ;BUF DB ‘ABCD’;BUF的偏移地址为10H,如果不设置$则偏移地址为0。
分支程序设计:
JMP 标号 :无条件转移指令;无条件转移至标号处
JMP SHORT OPR:段内直接段转移指令;转移的目标地址IP为当前IP值与代码中的8位位移量的和。(IP=IP+8位位移量)
如:JMP SHORT NEXT
…[内容]…
NEXT:MOV AL,05H;设当前IP=0102H,位移量为08H。则转移地址的偏移地址IP=0102H+08H。
JMP NEAR PTR OPR即JMP 标号:段内直接近转移 ;转移的目标地址IP为当前IP值与代码中的16位位移量的和。(IP=IP+16位位移量)
JMP OPR:段内间接转移指令;转移目标地址由寄存器或存储单元给出即(IP=(EA))。
如:JMP WORD PTR [BX+20H];求出物理地址PA(DS*10H+BX+20H)后,程序从CS当前地址跳转至PA处继续执行。
JMP FAR PTR 标号:段间直接转移指令;IP=标号的偏移地址,CS=标号的段地址。
JMP DWORD PTR OPR:段间间接转移指令;IP=(EA),CS=(EA+2)(EA只能通过存储器寻址方式确定)。
LOOP:循环指令(CX=0结束循环)
条件转移指令:(段内直接段转移)
单条件转移指令:(ZF、SF、OF、PF、CF)
JZ/JE OPR: ZF=1(结果为0)转移指令
JNZ/JNE OPR: ZF=0(结果不为0)转移指令
JS OPR: SF=1(结果为负)转移指令
JNS OPR: SF=1(结果为正)转移指令
JO OPR: OF=1(有溢出)转移指令
JNO OPR: OF=0(无溢出)转移指令
JP/JPE OPR: PF=1(第八位1的个数为偶数)转移指令
JNP/JPO OPR: PF=0(第八位1个数为奇数)转移指令
JC OPR: CF=1(右进位)转移指令
JNC OPR: CF=0(无进位)转移指令
比较两个无符号数条件转移指令:
JB/JNAE OPR:小于转移 <
JBE/JNA OPR:小于等于转移 <=
JA/JNBE OPR:大于转移 >
JAE/JNB OPR:大于等于转移 >=
比较两个有符号数条件转移指令:
JL/JNGE OPR:小于转移 <
JLE/JNG OPR:小于等于转移 <=
JG/JNLE OPR:大于转移 >
JGE/JNL OPR:大于等于转移 >=
DOS功能调用:
- 键盘输入单字符(1号调用)
MOV AH,01H
INT 21H
- 显示单字符(2号调用)
DL,待显示字符ASCALL码或’字符’(引号表示)
MOV AH,02H
INT 21H
- 显示字符串(9号调用)
LEA DL,字符串首地址
MOV AH,09H
INT 21H
- 键盘输入字符串(10号调用)
LEA DX,输入缓存区首地址(前提要先定义缓存区)
MOV AH,0AH
INT 21H
- 返回操作系统(4CH号调用)
MOV AH,4CH
INT 21H
宏定义:
宏指令名 MACRO 参数名
宏体
ENDM
如:WRITE MACRO AA
LEA DX,AA
MOV AH,9
INT 21H
ENDM ;显示AA中的内容
子程序定义:
FED PROC NEAR/FAR
[内容]
RET(返回指令)
FED ENDP
4、中断系统:
(1)基本概念:
中断:在执行程序过程中,由于某事件的发生,迫使CPU暂停当前程序去执行该事件的程序,等该事件程序结束后又返回原程序断点处继续执行原程序的整个过程。
中断源:即外设。键盘、显示器、打印机、软件中断等。
(2)中断系统功能:
实现中断并返回;实现优先权排队;高级中断源能中断低级的中断处理。
(3)中断处理过程
中断请求。中断源向CPU发出中断请求,中断请求存入CPU的中断请求输入端。(保存中断请求信号)。
中断判优。判别多中断源请求优先权。
中断响应。中断当前程序,去执行中断程序。
中断处理。保护现场(要用到的寄存器内容入栈保存)
开中断(若允许中断嵌套,则开中断,响应更高级的中断请求)
中断服务(执行中断源要求的操作)
关中断(中断服务结束后关中断,以保证有效的恢复现场)
恢复现场(将保存的寄存器内容从栈中弹出,以便将程序断点处的状态恢复到中断前状态)
中断返回。寄存器内容弹出栈,CPU返回主程序断点,自动开中断
(4) 中断类型:
外部中断:(硬件中断)(优先级更高)
非屏蔽中断:由NMI引脚产生的中断请求。不受IF的限制,CPU均会执行该信号请求,用于系统掉电、紧急停机等。
可屏蔽中断:由INTR引脚产生的中断请求。于IF标志位状态有关,IF=1时执行中断请求,IF=0时,CPU不响应,中断被屏蔽。
内部中断:(软中断)
由软中断指令或CPU本身引起的中断
中断向量地址=4×中断类型码
CPU执行中断操作步骤:CPU根据中断源的中断类型码转到相应的中断服务程序去执行。
CPU将使用的寄存器入栈保存;
获得中断类型码(即INT 后面的常数);
计算中断向量地址
段地址放CS,偏移地址放IP
转中断服务
恢复现场,执行中断返回指令IRET
继续执行主程序
如中断指令:INT 4AH;它的中断向量地址为4*4AH=128H,即128H、129H存放该指令的偏移地址,12AH、12BH存放该指令的段地址,取出该指令的段地址和偏移地址CPU就可以转入中断服务程序,执行中断。
中断向量表的设置:
设中断服务程序入口地址为VINTSUB,中断类型码为N
PUSH DS ;数据段内容入栈保存
MOV AX, 0
MOV DS, AX ;中断向量表的段地址送入DS(从0开始)
MOV BX, N*4 ;BX为中断向量地址
MOV AX, OFFSET VINTSUB ;将中断向量偏移地址存入中断向量表
MOV [BX], AX
MOV AX, SEG VINTSUB ;将中断向量段地址存入中断向量表
MOV [BX+2], AX
POP DS ;DS出栈,恢复数据段地址
DOS功能调用设置中断向量:
MOV AH, 25H ;预置功能号
MOV AL, N ;预置中断类型码
INT 21H
如:DS:DX预置中断向量段地址和偏移地址
PUSH DS ;保存DS内容
MOV AX, SEG VINTSUB ;中断向量段地址存入DS
MOV DS, AX
MOV DX, OFFSET VINTSUB ;中断向量偏移地址存入DX
MOV AH, 25H ;调用DOS执行中断服务
MOV AL, N
INT 21H
POP DS ;恢复DS
中断控制器8259A:
由IRR中断请求寄存器、PR优先级判别器、ISR中断服务寄存器、IMR中断屏蔽寄存器、初始化命令寄存器、操作命令寄存器组成。
IRR中断请求寄存器(8位):存放外部输入的中断请求信号IRQ7~IRQ0,CPU响应了这个中断请求,则相应位置为1。
ISR中断服务寄存器(8位):记录正在处理中的所有中断级,某几个中断级正在被服务时,ISR的相应位置为1。
IMR(OCW1)中断屏蔽寄存器(8位):对IRR起屏蔽作用,当某些需要屏蔽时,相应位置为1。
PR优先权电路:对IRR中未屏蔽的中断请求进行判优。
ICW1~ICW4初始化命令寄存器(均为8位):初始化后不再修改。
OCW1~OCW3操作命令寄存器(均为8位):
8259A的工作方式:
中断嵌套方式:
普通全嵌套方式;特殊全嵌套方式。
中断屏蔽方式:
普通屏蔽;特殊屏蔽。
中断优先权循环方式:
自动循环方式(等优先权方式);特殊循环方式(指定最低级的循环方式)
中断查询方式:采用OCW3实现
中断结束方式:ISR的1位置清零。
自动结束方式;非自动结束方式。
中断触发发方式:
边沿触发;电平触发。
8259A的编程:
初始化命令字:
ICW1:规定8259A的初始状态。
ICW2:规定不同中断源的中断类型码。(其中填的是中断信号的中断类型码)
ICW3:仅用于8259A的级联方式。
ICW4:规定8259A的工作方式(中断优先级和中断结束方式等)
ICW1必须写入偶地址寄存器,ICW2~ICW4写入奇地址寄存器。
OCW1:写入IMR中断屏蔽寄存器中,将对应请求输入线IRQ1~IRQ7位置置1/0。
OCW2:控制中断结束方式和优先修改权。
R:指示优先权是否循环。1为循环,0为不循环。
SL:决定第三位(L2、L1、L0)是否有效。1为有效,0为无效。
EOI:指示OCW2是否为中断结束命令。1为中断结束,0为EOI命令循环。
L2、L1、L0:当SL=1时有效,指示该操作命令字涉及的哪一级中断。
OCW3:用于控制中断状态有读出、选择、查询及屏蔽方式。
8255并行接口芯片
由数据端口A、B、C和控制寄存器组成
三种工作方式:
方式0:基本输入输出方式
方式1:选通输入输出方式
方式2:双向输入输出方式(只有A口能用)
8253定时器/计数器接口芯片
组成:
三个独立的计数器(0、1、2,CLK计数输入、OUT输出信号、GATE门控信号)
每个计数器都由寄存器(CR计数初值寄存器、CE减1计数器、OL输出锁存器)
控制寄存器(保存CPU送来的工作方式控制字)
后面几张截图截的其他博主的内容。希望这篇文章对大家有所帮助~