注意:
1. PF标志仅反映最低8位中“1”的个数是偶或奇,即使是进行16位字操作。低字节中“1”的个数为0或者偶数时,PF=1.
2. 注意溢出和进位的区别。处理器在进行运算时,根据无符号数设置进位标志,根据是否超出有符号数范围设置溢出标志
段寄存器DS/CS/SS/ES
因为8086有20跟地址线,要解决16位的机器字长处理20为地址的问题,采取分段的形式访问内存,段内最大64KB
外部设备
CPU通过接口与外设通信,每一个接口有一组寄存器(数据寄存器、状态寄存器、命令寄存器),每一个寄存器都有一个独立于内存的I/O地址空间
寻址方式
由于指令系统设计了多种操作数的来源,寻找操作数的过程就是操作数的寻址,不同的寻址方式执行的速度和效率不一样。
跟数据有关的寻址方式(MOV)(注意两个操作数字长要一致)
立即寻址方式 MOV AX, 5 (直接给出操作数)
寄存器寻址方式 MOV AX, BX (在寄存器中给出操作数,CS指令不能用MOV改变)
直接寻址方式 MOV AX, VALUE 或 MOV AX, [VALUE] 或 MOV AX, [2000H] (直接给出有效地址,在内存中寻找操作数,隐含段为DS,可使用段跨越前缀指定其它段)
寄存器间接寻址方式 MOV AX, [BX](有效地址在寄存器中,不允许使用AX/CX/DX存放有效地址)
寄存器相对寻址方式 MOV AX, COUNT[SI] 或 MOV AX, [COUNT+SI](可用寄存器BX/BP/SI/DI)
基址变址寻址方式 MOV AX, [BX][SI](必须是一个基址寄存器和一个变址寄存器的组合)
相对基址变址寻址方式 MOV AX, MASK[BX][SI]
比例变址寻址方式 MOV EAX, ARRAY[ESI*4]
基址变址寻址方式 MOV EAX, [EBX][ESI*6]
相对比例变址寻址方式 MOV EAX, ARRAY[EBX][ESI*8]
与转移地址有关的寻址方式(JMP)
段内直接寻址 JMP (NEAR PTR/SHROT)NEXT (NEAR PTR----16位位移量, SHORT----8位位移量,有效地址为当前IP+位移量(8/16位))
段内间接寻址 JMP BX或JMP TABLE[BX](转向的有效地址是一个寄存器或存储单元的内容)
段间直接寻址 JMP FAR PTR NEXT(转向另一个代码段中的地址,修改CS和IP)
段间间接寻址 JMP DWORD PTR [INTERS+BX](用存储器中的两个相继字的内容取代CS和IP)
指令系统
数据传送指令(不影响标志位)
MOV DST, SRC(DST不能是CS,立即数不能直接送段寄存器,两个操作数不能同时为段寄存器)
MOVSX 带符号扩展传送指令,MOVZX 不带符号扩展传送指令(源操作数长度一定小于目的操作数长度)
PUSH SCR (必须以字为单位,DST不能是CS)
PUSHA/POPA (AX/CX/DX/BX依次入/出栈)
XCHG OPR1, OPR2 交换操作数(不允许使用段寄存器)
IN AL/AX, PORT/DX (I/O->CPU)
OUT AL/AX, PORT/DX (CPU->I/O)
LEA REG, SRC (有效地址送寄存器指令,REG不能是段寄存器,SRC必须是存储器寻址方式)
算数指令(影响标志位)
ADD/ADC/INC (除INC不影响CF标志外,都对条件标志位有影响)
SUB/SBB/NEG/CMP (除DEC不影响CF标志外,都对条件标志位有影响)
MUL/IMUL (AL/AX为隐含的乘数寄存器、AX/AX&DX为隐含的乘积寄存器,SRC不能是立即数,除CF/OF,对条件标志位无定义)
DIV/IDIV ( AX(DA&AX)为隐含的被除数寄存器,AL(AX)为隐含的商寄存器,AH(DX)为隐含的余数寄存器,SRC不能是立即数, 对多有条件标志位无定义)
CBW/CWD (无操作数,隐含对AL/AX进行符号扩展,不影响标志位)
DAA/DAS(压缩的BCD码加/减法调整指令,隐含的操作寄存器为AL,紧接在加减指令之后使用,除AF/CF外,对其他条件标志位无定义)
AF=1或(AL)0~3=A~F,则(AL) <-(AL) ±06H,AF=1
CF=1或(AL)4~7=A~F,则(AL) <-AL) ± 60H,CF=1
AAA/AAS(非压缩的BCD码加/减法调整指令)
AAM/AAD(非压缩的BCD码乘/除法调整指令)
NOT/AND/OR/XOR/TEST(CF/OF=0; AF无定义; 其余按照运算结果设置)
移位指令 S/R(简单移位/循环),H/A(逻辑/算数S)或O/C(不带进位/带进位R),L/R(左移/右移) (当移位超过1位时,不能使用立即数,条件标志位CF为移入的数值,只移一位时,OF=1最高有效位的值发生变化,根据结果设置SF/ZF/PF)
串传送指令(不影响条件标志位)
REP MOVS/STOS/LODS(目的串默认附加段,源串默认数据段,CX=串长度,CLD/STD建立方向标志DF,0表示从低到高)
REPE/REPZ(相等继续比较)REPNE/REPNZ(不相等继续比较)CMPS/SCAS (DI:相比配/不匹配的字符的下一个地址,CX: 剩下的还未比较的字符的个数)
控制转移指令(不影响条件标志位)
JMP 无条件转移
JZ(JE): ZF=1转移,JNZ(JNE): ZF=0转移
JS/JNS/JO/JNO...
JC(JB/JNAE) CF=1转移,JNC(JNB/JAE) CF=0转移
JA/JAE/JB/JBE CF&ZF=1/0
JL/JLE/JG/JGE SF&ZF=1/0
JCXZ CX=0转移
LOOP CX=0转移,否则循环
LOOPE/LOOPZ CX≠0&ZF=1循环
LOOPNE/LOOPNZ CX≠0&ZF=0循环
CALL 段内直接调用/段内间接调用 IP压栈
段间直接调用/段间间接调用 CS/IP压栈
RET (立即数) 段内调用 弹IP,段间调用 弹IP/CS, 立即数表示弹出IP/CS后堆栈弹出多少个字节
INT TYPE(压标志->压CS->压IP,新 IP=TYPE*4, CS=TYPE*4+2)
IRET 从中断返回指令(INT 指令执行时,把IF和TF置零,但不影响其他标志位)
伪操作
段定义伪操作
PARA: 段起始地址的最低十六进制数位必须为0, PRIVATE: 私有段,不与其他同名段合并(这两个位默认的定位类型和组合类型)
PUBLIC: 与其他同名段合并,由连接命令决定连接顺序,每一小分段从小段(16个字节)的边界开始
COMMON: 覆盖
符号定义伪指令
等价伪指令EQU 等号伪指令= 定义符号名伪指令LABEL
WBUF LABLE WORD
BUF DB 200 DUP(0)
汇编地址计数器 $ (当前正在汇编的指令的偏移地址)
置汇编地址计数器 ORG 常数表达式 (设置当前地址计数器的值,使下一字节的地址成为参数表达式的值)
EVEN (使下一变量或指令开始于偶字节地址)
ALIGN 常数 (使下一变量或指令开始于常数的倍数)
基数控制伪操作 .RADIX expression (当使用其他基数表示的常数时,使用此指令)
表达式与运算符
算数运算符
+ -*/ MOD SHL SHR
既可以用于数值表达式也可以用于地址表达式
逻辑运算符
AND ORXORNOT
关系运算符
EQ(相等) NE(不相等)LT(小于)GT(大于)LE(小于等于)GE(大于等于)
属性运算符 PTR
数值返回运算符
SEG 分离变量或标号所在段的首地址
TYPE 分离变量或标号的类型
LENGTH 对于变量中使用DUP的情况,汇编程序将回送分配给该变量的单元数,而对于其他情况则送1。
SIZE 取出变量所含的数据存储区的大小,返回值为LENGTH*TYPE
字节分离运算符
HIGH 分离出高字节, LOW 分离出低字节
CONST DW 0ABCDH
MOV AH, HIGH CONST ; 0ABHàAH
子程序
同一模块的不同过程之间的参数传递
通过寄存器传递参数
直接访问模块中的变量
通过地址表穿传送参数地址
通过堆栈传送参数或参数地址
子程序的重入是只子程序被中断后又被中断服务程序说调用,子程序的冲入是被动的进入,递归是主动的进入
宏汇编
宏:具有宏名的一段汇编语句序列(宏定义时书写)
宏指令:这段汇编语句序列的缩写(宏调用时书写)
红展开:宏指令出用这段宏代替的过程(宏汇编时实现)
宏调用的实质是在汇编的过程进行宏展开,用宏定义的代码序列替代宏指令的过程
伪指令
LOCAL:宏定义体采用了标号,要用LOCAL进行说明,必须是宏定义MACRO语句之后的第一条语句
.XALL列出只产生目标代码的宏展开
.LALL列出包括注释项在内的所有宏展开
.SALL不列出任何展开信息
%和&,作为哑元的前缀
重复汇编
在汇编过程中,重复展开一段基本相同的语句
条件汇编
在汇编过程中,根据条件决定汇编的语句
输入输出程序设计
中断的分类
内部中断(软中断): CPU内部原因产生的中断,CPU错误、由INT指令引起的中断、DEBUG设置的中断
外部中断(硬中断): 非CPU内部原因产生的中断,分可屏蔽中断和不可屏蔽中断
从外设发出中断请求道CPU相应中断,有两个决定性的条件
1.该外设的中断请求是否被屏蔽,通过端口21H的中断相应位来决定,相应位为0表示允许中断
2.CPU是否允许响应中断,由CPU的标志寄存器FLAGS中的IF位决定
在一次中断程序处理完成后,应对20H端口发中断结束命令,第5位(EOI)置1.否则以后将屏蔽掉对同级中断的请求
主程序为响应中断应做的准备工作,以及硬件(CPU和外设接口)自动完成的工作:
主程序:(1)设置中断向量
(2)设置8259A的中断屏蔽位
(3)设置CPU的中断允许位
硬件: (4)外设接口送中断请求给CPU
(5)当前指令执行完后,CPU送响应信号给外设接口
(6)CPU接收中断类型号
(7)当前的FLAGS,CS和IP入栈
(8)清除IF和TF
(9)中断向量送IP和CS
中断处理程序
(1)保护寄存器的内容
(2)如允许中断嵌套,则开中断(STI)
(3)处理中断
(4)关中断
(5)送中断结束命令(EOI)给中断命令寄存器
(6)恢复寄存器内容
(7)返回被中断的程序(IRET)
每当按键动作产生,系统做如下处理:
1.主板上的键盘微控制器获得按键的扫描码,将扫描码放入I/O端口60H,并触发键盘终端INT 09H的中断请求。
2.若允许键盘中断,且CPU开中断,可进入INT 09H的ISR
3.INT 09H的ISR从端口60H读扫描码,并根据对应按键动作做出相应处理。如果是非变 换键和非特殊请求键,则生成一个16位值,存入键盘缓冲区,低字节ASCII码,高位字节扫描码。INT 09H的ISR不将按键的断码放入BUFFER
BIOS键盘中断INT 16H
显示器I/O
显存地址B000:0000、B800:0000,低字节ASCII码,高字节属性值,BIOS显示终端INT 10H