8086/8088寻址方式

寄存器寻址 操作数存放在寄存器中
立即寻址 操作数存放在内存代码段
直接寻址 操作数存放在内存
寄存器间接寻址 操作数存放在内存
变址寻址 操作数存放在内存
基址加变址寻址 操作数存放在内存

寄存器寻址:操作数放在CPU内部的寄存器中,可以是8位或16位寄存器
:注意源操作数和目的操作数的位数应一致。
立即寻址:操作数直接放在指令中,紧跟在操作码的后面,与操作码一起放在存储器的代码段中(8/16位)。
直接寻址:操作数存放在内存中,在指令中给出存放单元的偏移地址,如果不加说明,操作数默认在数据段。
寄存器间接寻址:操作数存放在内存中,但其偏移地址存放在指令中给出的寄存器中。
其中,作为间接寻址的寄存器只能有4个:BX, SI, DI, BP其他寄存器无此功能
注意:用BP间接寻址,操作数默认在堆栈段,用其余3个寄存器时,操作数默认在数据段。
变址寻址:操作数在内存中,由指定的寄存器内容,加上指令中给出的8位或16位偏移量作为操作数的偏移地址。
计算方法:偏移地址=寄存器内容 + 指令中给定的偏移量
作为变址的寄存器只能有4个:BX, SI, DI, BP其他寄存器无此功能。
基址加变址寻址:操作数存放在内存中,但其偏移地址是由三部分相加而成: 基址寄存器内容+变址寄存器内容+偏移量
基址寄存器只有2个:
BX,默认的操作数在数据段;
BP,默认的操作数在堆栈段。
变址寄存器只有2个:SI和DI。偏移量同样由指令给出。

8086/8088指令系统

数据传送类指令

通用数据传送指令

格式:MOV OPRD1,OPRD2
功能:OPRD2 → OPRD1
CPU内部寄存器之间数据的传送(除CS、IP)
立即数传送至CPU内部的通用寄存器组
CPU内部的寄存器(除CS、IP)与存储器(所有寻址方式)之间
能实现用立即数给存储单元赋值
注意:
CS,IP不能作为目的操作数 MOV CS, AX
两个段寄存器间不能直接传送 MOV SS, DS
立即数不能直接传送给段寄存器 MOV DS,2000H
内存单元间不能直接传送 MOV [SI],[2000H]
立即数不能作为目的操作数 MOV 1000H, AX

堆栈指令

入栈指令:格式:PUSH OPRD
功能: (OPRD)入栈
(1) SP-1→SP OPRD高字节→[SP]
(2) SP-1→SP OPRD低字节→[SP]
先减指针, 再压数据, 先高后低
例:
MOV AX,1234H
PUSH AX;入栈
出栈指令:格式:POP OPRD
功能: 栈顶内容送OPRD
(1) [SP]→ OPRD低字节 SP+1→SP
(2) [SP]→ OPRD高字节 SP+1→SP
先出数据, 再加指针,先低后高
例: POP BX;出栈
注意:
只能对16位数进行操作,一次压入弹出一个字
PUSH AH;错
必须对寄存器的内容或内存单元的内容进行操作
PUSH 2000H;错 PUSH [2000H]; 对
设SP为0100H,SS为2000H, PUSH BX 后,栈顶的物理地址是:20100H-2H=200FEH
而执行POP BX 后,栈顶的物理地址是:20100H+2H=20102H

交换指令

格式:XCHG OPRD1,OPRD2
完成通用寄存器之间,通用寄存器与累加器之间、与存储器之间8位、16位数据的相互交换。
例如:XCHG BL,AH XCHG AX,[BX]
内存之间的数据、累加器之间不可相互交换
CS,IP不能参与交换
段寄存器和立即数不能作为一个操作数

累加器专用传送指令

1)输入输出指令

格式:IN AL,PORT (8位)IN AX,PORT (16位)
功能:从PORT口输入数据到AL(AX)。
格式:OUT PORT,AL(8位) OUT PORT,AX (16位)
功能:将AL(AX)中的内容从PORT口输出。
IN AL, 40H (40H) → AL
IN AX, 40H (40H) → AL (41H) → AH
IN,OUT只能对AL,AX操作,若传送的数据为16位,则端口地址只能取偶数。
当端口地址大于8位(0FFH)时,要用DX间接寻址
MOV DX, 352H
IN AL, DX
2)换码(查表)指令
格式:XLAT
功能:完成一个字节的查表转换
将累加器AL中的内容变换为存储器(默认数据段)表格中的某一个值,常用来实现编码码制的转换。
在执行查表指令时,CPU将BX与AL的值相加作为偏移地址,将它所对应单元中的内容取出送到AL中去。

地址传送指令

1)取偏移地址指令
格式:LEA OPRD1,OPRD2
功能:将源操作数的偏移地址送到目的操作数中。
要求源操作数必须为存储器操作数,目的操作数必须为一个16位的通用寄存器。
该指令通常用来使一个寄存器作为地址指针。
LEA BX,TAB ;将TAB标号所指位置的偏移地址送BX
MOV AL,[BX];以BX为地址指针取一个数据

2)地址传送指令LDS
格式:LDS OPRD1,OPRD2
将指定内存中的4个字节(32位)分别装入指定的寄存器和段寄存器DS中。
3)地址传送指令LES
将指定内存中的4个字节(32位)分别装入指定的寄存器和段寄存器ES中。
例:DS=1000H DI = 0400H [10400H]=FFH [10401H]=00H [10402H]=AAH [10403H]=00H
LEA SI, [DI] ; SI= 0400H
LES AX, [DI] ; AX= 00FFH ES=00AAH

标志寄存器传送指令

1)LAHF(Load AH with Flags):读取标志
功能:标志寄存器PSW中的低8位→AH
2)SAHF(Set Flags with AH): 设置标志
功能:AH→标志寄存器中的低8位
3)PUSHF: 标志寄存器入栈命令
4)POPF:将栈顶内容送标志寄存器PSW
注意:这个命令将改变PSW的内容。

算术运算类指令

加法指令

  1. 不带进位的加法
    格式:ADD OPRD1, OPRD2
    功能:(OPRD1) + (OPRD2)→OPRD1
    结果影响标志位
    ADD [BX+DI], AL; 存储器与通用寄存器相加
    ADD DX, 50H[BX+SI];通用寄存器与存储单元内容相加
    ADD [BX+DI], [2000H];错
  2. 带进位的加法
    格式:ADC OPRD1, OPRD2
    功能:(OPRD1) + (OPRD2)+CFOPRD1
    结果影响标志位
    该指令主要用于多字节数相加
  3. 增量指令
    格式:INC OPRD
    功能:(OPRD)+1 → OPRD
    不影响CF,影响AF,OF,PF,SF和ZF
    MOV AL, 0FFH
    INC AL ; ZF=1
    INC NUM

减法指令

  1. 不带借位的减法
    格式:SUB OPRD1, OPRD2
    功能:(OPRD1)-(OPRD2)→ OPRD1
    结果影响标志位
    SUB BX,DX ;通用寄存器之间
    SUB AL,[BX+SI] ;累加器和存储器之间
    SUB [BX+DI],[2000H] ;错
  2. 带借位的减法
    格式:SBB OPRD1, OPRD2
    功能: (OPRD1)-(OPRD2)-CF→OPRD1
    结果影响标志位,该指令主要用于多字节数相减
    LEA BX, BUFF
    SUB AL, [BX]
    SBB AH, [BX+1]
  3. 减量指令
    格式:DEC OPRD
    功能:(OPRD)-1→ OPRD
    不影响CF,影响AF, OF, PF, SF和ZF
    MOV CX, 1
    DEC CX ; ZF=1
  4. 求补指令
    格式:NEG OPRD; 对操作数取补码后送回
    功能:0 – (OPRD) → OPRD
    NEG AL
    NEG COUNT
    指令影响标志位AF,CF,OF,PF,SF和ZF, 此指令执行时, 只有当操作数为0时, CF为0, 否则CF总为1。若操作数为80H或8000H,执行求补指令后,结果没有变化,但OF置1。
  5. 比较指令
    格式:CMP OPRD1, OPRD2
    功能:(OPRD1) - (OPRD2)
    不保存结果,只影响标志位
    CMP AX, 2000H ; 将AX内容与2000H相比较
    CMP AX, [BX+DI+100]; 将AX内容与存储单元的值相比较
    比较结果影响标志位AF,CF,OF,PF,SF和ZF
    比较指令主要用于比较两个数之间的关系
    若两者相等,相减以后结果为零,ZF标志为1,否则为0。
    大小的比较( 假设CMP AX,BX )
    对无符号数,若结果没有产生借位(CF=0),则AX≥BX;若产生了借位(CF=1),则AX<BX。
    对带符号数,则可根据OF与SF异或运算的结果来判断,结果为1,则AX<BX,结果为0,则AX≥BX

乘法指令

8位数×8位数 → 16位数
16位数×16位数 →32位数
约定:
两个8位数相乘,有一个乘数在AL中,另一个乘数在寄存器或内存中,乘积在AX中;
两个16位数相乘,有一个乘数在AX中,另一个乘数在寄存器或内存中,乘积的高16位在DX中,低16位在AX中。
乘法有有符号数和无符号数两套指令
1)无符号数乘法指令格式:
MUL OPRD; 不出现 AL 或 AX
功能:AL/AX×OPRD → AX / DX, AX
MUL BL; AL × BL→ AX
MUL CX; AX × CX→ DX(高位) , AX(低位)
MUL BYTE PTR [DI]; AL × ?→ AX
MUL WORD PTR [SI]; AX × ? → DX AX
2)有符号数乘法指令
格式:IMUL OPRD; 不出现AL 或AX
IMUL BL; AL × BL→ AX
IMUL CX; AX × CX→ DX(高位) , AX(低位)
IMUL BYTE PTR [DI];
乘法运算时,结果影响CF和OF,AF, PF, SF, ZF标志位无意义。

除法指令

16位数÷8位数 → 8位数
32位数÷ 16位数 → 16位数
约定:
除数必须为被除数的一半字长
被除数为16位,放在AX中,除数为8位,在寄存器或内存中,8位商在AL中, 8位余数AH中;
被除数为32位,放在DX(高位), AX(低位)中,除数为16位,在寄存器或内存中,16位商在AX中, 16位余数DX中。
除法有有符号数和无符号数两套指令
1)无符号数除法指令
格式:DIV OPRD; 不出现 AX 或 DX AX
功能:DX,AX/AX ÷OPRD →AX/AL,DX/AH
DIV BL; AX÷BL→ AL(商) , AH(余数)
DIV CX; DX AX÷ CX→AX(商) , DX(余数)
DIV BYTE PTR [DI]; AX÷[DI] → AL(商) AH(余数)
2)有符号数除法指令
IDIV OPRD; 不出现AX或DX AX
IDIV BL; AX÷BL→ AL(商) , AH(余数)
除法运算后,所有的标志位都是不确定的,没有意义;
用IDIV指令时,如果是双字除以一个字,则商的范围为-32768~32767,如果是一个字除以一个字节,则商的范围为-128~127。如果超出这个范围,会作为除数为0来处理,产生0号中断;
8086系统规定余数的符号和被除数相同;
当8位数除以8位数,16位数除以16位数时,必须对被除数进行扩展。
扩展指令
将字节扩展成字的指令:CBW
将AL中的符号位扩展到AH中。当AL<80H,执行CBW后,AH=0;当AL>=80H时,AH=0FFH。
将字扩展成双字的指令:CWD
将AX中的符号位扩展到DX中。当AX<8000H,执行CWD后, DX=0; 当AX>=8000H时,DX=0FFFFH。
当遇到两个字节或字相除时,要预先执行CBW指令或CWD指令,扩展被除数,否则不能正确执行除法操作。

十进制调整指令

BCD码:用二进制形式表示的十进制码。每一位十进制数用4位二进制表示,运算规则是逢十进一。
压缩BCD码: 一个字节中有两位BCD码 0100 0101
非压缩BCD码:一个字节只用低4位表示一位BCD码,高4位为0。 0000 0100 0000 0101
BCD码运算时,先用一般的二进制运算,然后再进行BCD码调整。
1)非压缩BCD码加法十进制调整指令AAA
两个非压缩的BCD码相加,结果在AL中,执行该指令后将结果调整为十进制,放在AX中。
调整原则
在调整前若AL低半部包含的数值大于9或AF=1, 则AAA完成下列操作: AL加6,AF和CF置1,AL的高4位清零
2)压缩BCD码加法调整指令DAA
两个压缩的BCD码相加,结果在AL中,执行该指令后将结果调整为十进制,放在AL中。
调整原则:
如果AF=1或AL的低4位大于9, 则AL加06H并置AF=1
如果CF=1或AL的高4位大于9, 则AL加60H并置CF=1。
如果满足上述2条, 则AL加66H, 并置AF=1,CF=1。
3)BCD码减法十进制调整指令
BCD码减法调整指令与加法调整指令类似,只是分别将加06H,60H,66H改为减06H,60H,66H。
AAS: 对非压缩的BCD码减法调整
DAS: 对压缩的BCD码减法调整
4)BCD码乘法十进制调整指令AAM
BCD码均为无符号数,故只有用MUL乘法指令才能调整;
BCD码乘法调整指令只能对非压缩的BCD码相乘结果进行调整;
5)BCD码除法十进制调整指令AAD
BCD码均为无符号数,故只有用DIV除法指令才能调整,并且在两个数相除前进行调整;
BCD码除法调整指令只能对非压缩的BCD码相乘结果进行调整;

逻辑运算与移位指令

逻辑运算指令

  1. NOT
    格式:NOT OPRD
    功能:OPRD按位取反
    对标志位没有影响
  2. AND、OR、XOR
    格式:AND(OR/XOR) OPRD1, OPRD2
    功能:OPRD1 AND(OR/XOR) OPRD2 → OPRD1
    这三条指令执行后,CF=0, OF=0, SF,PF,ZF发生变化。
  3. TEST
    格式:TEST OPRD1, OPRD2
    功能:(OPRD1) AND (OPRD2)
    结果影响标志位 ZF PF SF

移位指令

1)逻辑左移和算术左移
格式:SAL OPRD, M 功能:OPRD算术左移M位
格式:SHL OPRD, M 功能:OPRD逻辑左移M位.

左移一位进CF,右边补0,相当于无符号数乘2。影响标志位,若移位后最高位与CF不同,则OF=1,表示移位前后数据变号。
影响标志位,若移位后最高位与CF不同,则OF=1,表示移位前后数据变号。
若移位位数大于1,所移的位数用CL存放。
eg:
MOV AL, 02H ;AL: 0000 0010
MOV CL, 4
SHL AL, CL ;AL: 0010 0000
2)算术右移
格式:SAR OPRD, M 功能:OPRD算术右移M位

最低位进CF, 左边重复最高位, 即操作数符号不变。一般用于有符号数的右移,符号扩展。
若移位位数大于1,所移的位数用CL存放。
3)逻辑右移
格式:SHR OPRD, M 功能:OPRD逻辑右移M位

最低位进CF, 左边补0。一般用于无符号数的右移。
若移位位数大于1,所移的位数用CL存放。
4)不带进位循环左移
格式:ROL OPRD,M 功能:不带进位循环左移

若移位后最高位与CF不同,则OF=1,表示移位前后数据变号。
若移位位数大于1,所移的位数用CL存放。
5)不带进位循环右移
格式:ROR OPRD,M 功能:不带进位循环右移

若移位位数大于1,所移的位数用CL存放。
6)带进位循环左移
格式:RCL OPRD,M 功能:带进位循环左移

可实现多字节的移位,将DX, AX左移1位
SAL AX, 1 CF←AX←0
RCL DX, 1 CF←DX←CF
7)带进位循环右移
格式:RCR OPRD,M 功能:带进位循环右移
同样可实现多字节的移位。

转移和控制类指令

程序控制指令

8086/8088CPU使用CS寄存器和IP指令指针的值来寻址,用以取出指令并执行。而转移类指令通过改变CS和IP的值,来达到改变程序执行顺序的目的。
所有的程序控制转移类指令均不影响标志位。
转移有段内转移段间转移之分。
段内转移:目标指令与转移指令在同一代码段中,只改变IP的值
段间转移:目标指令与转移指令分别在不同的代码段,转移时需要改变CS和IP的值
所有的程序控制转移类指令均不影响标志位。
1)无条件转移指令
格式:JMP OPRD
功能:控制程序无条件的转向由OPRD指向的位置
分为两种情况:直接转移间接转移

直接无条件转移:
短程:JMP SHORT OPRD
段内转移 -128-127范围内,即IP+8位位移量
近程:JMP NEAR PTR OPRD或JMP OPRD
段内转移 同一代码段范围内,即IP+16位位移量
远程:JMP FAR PTR OPRD
段间转移 修改CS和IP
OPRD通常以标号形式出现,NEAR为默认值可以省略。

间接无条件转移:
OPRD常为存储器操作数,由直接寻址方式或寄存器间接寻址方式给出
①段内间接转移
格式:JMP WORD PTR OPRD 或JMP OPRD(OPRD为寄存器名)
JMP WORD PTR[SI]
该指令按照(DS)×\times× 16+(SI)的值找到操作数位置,然后取出一个字节送给IP
②段间间接转移
格式:JMP DWORD PTR OPRD
JMP DWORD PTR[100H]
该指令按照(DS)×\times× 16+100H的值找到操作数位置,第一个字节给IP,第二个字节给CS

2)条件转移指令
功能:根据条件来判断程序是否转移。满足条件时程序转向指定位置执行,否则,程序顺序执行。
(注意:此时程序出现分支)
条件转移指令只能实现段内转移,且只能转移到距当前指令-128~127字节的范围内,即一个字节的补码范围
根据标志寄存中各标志位的状态,或两数比较的结果,或测试的结果决定程序是否进行转移。

3)循环控制指令
这组指令主要对CX和标志位ZF进行测试,确定是否循环,执行前要先把循环控制次数放入CX
3条指令控制转移范围均在-128~127字节内

4)子程序调用和返回指令
CALL NEAR PTR OPRD
CALL FAR PTR OPRD
功能:调用子程序
RET 功能:返回主程序
RET n 按RET返回后,再做SP=SP+n操作,要求n为偶数。
5)中断指令
中断指令
一般格式:INT N
功能: 响应N号中断;
溢出中断
一般格式:INTO
功能: 对溢出情况进行中断响应;
中断返回
一般格式:IRET
功能: 从中断服务子程序返回主程序;

标志处理和CPU控制指令

微机笔记2——8086/8088指令系统相关推荐

  1. 微机原理8086/8088——指令系统与寻址方式

    微机原理8086/8088概念系列 微机原理8086/8088--微型计算机组成 微机原理8086/8088--微处理器功能结构 微机原理8086/8088--内部寄存器 微机原理8086/8088- ...

  2. 汇编语言之8086/8088指令系统

    Typist : Akame Qixisi / Excel Bloonow 在我学习汇编语言(基于8086)的过程中,遇到过一些想要某些操作却不知道指令的情况,所以在这里统一记录一下.如有错误或不同观 ...

  3. 【沧海拾昧】微机原理:8086/8088中断系统

    #C0305 沧海茫茫千钟粟,且拾吾昧一微尘 --<沧海拾昧集>@CuPhoenix [阅前敬告] 沧海拾昧集仅做个人学习笔记之用,所述内容不专业不严谨不成体系 如有问题定为本集记录有谬, ...

  4. 微型计算机原理指令系统,微机原理与接口技术 指令系统.ppt

    微机原理与接口技术 指令系统 第4章 指令系统 4.1 寻址方式 4.2 8086指令系统 4.3 从80286到Pentium 系列微处理器的指令系统 第4章 指令系统 指令:计算机用以控制各个部件 ...

  5. 计算机组成原理笔记day05 8086及8088 概述及内部结构

    80X86微处理器简介 概述 微处理器: 微处理器简称CPU,是用来实现运算和控制功能的部件,由运算器.控制器和寄存器三部分组成. 运算器用于完成数据的算术和逻辑运算. CPU内部的寄存器用来暂存参加 ...

  6. 微机笔记——1.微型计算机概述

    微型计算机的组成结构与工作过程 微机的组成结构 微机的组成 一台微型计算机由四部分组成:微处理器(简称CPU),存储器,输入输出接口和总线 它们以微处理器为核心,把存储器.I/O接口电路通过总线有机的 ...

  7. 8086/8088 存储器分段概念

    这一节主要讲述8086/8088 存储器分段的概念. 目的 从8086 CPU开始采用了分段的方法管理存储器,只有充分理解存储器分段的概念和存储器逻辑地址和物理地址的关系,才能有助于我们掌握8086/ ...

  8. 汇编语言(四)-8086的指令系统

    8086的指令系统 1. 数据传送指令 1.1 通用数据传送 1.2 地址传送指令 1.3 标志寄存器传送 1.4 累加器专用指令 2. 算术指令 2.1 加法运算指令 2.2 减法运算指令 2.3 ...

  9. 8086/8088 CPU寄存器组

    作者:黑剑  出处:http://www.cnblogs.com/blacksword/ 8086/8088 CPU寄存器组 今天来回顾一下8086/8088 CPU寄存器组的知识.其实8086汇编还 ...

最新文章

  1. Spring Boot req中@NotNull, @NotEmpty和@NotBlank之间的区别是什么?
  2. Openpose推断阶段原理
  3. c语言实验报告熟悉vc,C语言实验报告源代码
  4. 6.Springcloud的Ribbon的负载均衡算法解析及配置方式
  5. 利用jquery 控制select 实例代码
  6. CCF NOI1065 最小公倍数
  7. Pycharm乱码解决大全
  8. 《修炼之道:.NET开发要点精讲》读书笔记(三)
  9. Quartus II bilibili 入门 EDA实用技术教程(一)---verilog语言编程基础
  10. Python爬虫有哪些较好的书籍?
  11. 从腾讯外包月薪5K到转岗正式员工月薪15K,这178天的心酸只有自己知道...
  12. 抗癌中草药彩色图谱——西洋参
  13. ADMM之1范数理解
  14. UE4蓝图 绑定输入
  15. Java 两个日期间的天数计算
  16. 陆丰市福山妈祖:四大天王
  17. 高效C++ Effective C++
  18. Matlab中的mod()函数
  19. js三座大山----(第三座山)
  20. LeetCode部分刷题笔记!!!JavaScript!!!

热门文章

  1. 搜索引擎中用到的一些拆词方式解析
  2. Eclipse+MyEclipse+Tomcat下配置建立Web Project
  3. eclipse中导入maven项目时pom文件报错
  4. Flask之flask-script
  5. 基于Heritrix+Lucene的搜索引擎构建(6)——搜索UI与结果页面
  6. 3月27日外电头条:Windows的开源野心
  7. erlang一次线上问题解决
  8. Centos 6.5-yum安装出现错误解决方案
  9. INSTALL_FAILED_INVALID_APK: Split lib_slice_X_apk was defined multiple times异常
  10. 关于mapper接口与mapper.xml文件在同包运行找不到问题解决