8086指令集结构
- 格式:doc
- 大小:99.00 KB
- 文档页数:14
8086结构组成8086是一款16位微处理器,它的结构组成非常复杂。
本文将从以下几个方面来详细介绍8086的结构组成。
一、总体结构8086由三个主要部分组成:执行单元(EU)、总线接口单元(BIU)和寄存器组。
1.执行单元:负责执行指令并进行算术和逻辑运算。
2.总线接口单元:负责与外部设备通信并控制数据传输。
3.寄存器组:包括通用寄存器、段寄存器和指令指针寄存器等。
二、执行单元1.指令队列指令队列是执行单元中的一个重要部分,它可以存储多条指令,以便快速地进行取指令操作。
当EU需要执行一条新的指令时,它会从队列中取出下一条指令并开始执行。
2.算术逻辑单元算术逻辑单元(ALU)是执行单元中的核心部分,它可以进行各种算术和逻辑运算,如加、减、乘、除、与、或等操作。
ALU还可以处理条件跳转和无条件跳转等控制操作。
3.状态标志寄存器状态标志寄存器(FLAGS)用于记录ALU运算的结果,以便EU进行下一步操作。
FLAGS寄存器包括零标志位、进位标志位、溢出标志位等。
三、总线接口单元1.地址加法器地址加法器(AFA)是BIU的核心部分,它可以将内部地址转换为外部地址,并控制数据传输。
2.指令缓存器指令缓存器(IC)用于存储从内存中读取的指令。
当EU需要执行一条新的指令时,BIU会从IC中取出相应的指令并传输给EU。
3.数据缓存器数据缓存器(DC)用于暂时存储从内存中读取或写入的数据。
当EU 需要访问内存时,BIU会将相应的数据传输到DC中,EU再从DC中读取或写入数据。
四、寄存器组1.通用寄存器8086有8个16位通用寄存器,分别命名为AX、BX、CX、DX、SI、DI、BP和SP。
这些寄存器可以用于保存临时数据和计算结果等。
2.段寄存器8086有4个16位段寄存器,分别命名为CS、DS、ES和SS。
这些寄存器用于保存程序和数据在内存中的位置信息。
3.指令指针寄存器指令指针寄存器(IP)用于保存下一条指令在内存中的地址。
8086指令系统总结8086是一种x86架构的微处理器,由Intel公司于1978年推出。
它是16位的,拥有20位的物理寻址能力,可以访问1MB的内存空间。
8086指令系统是其所支持的一系列指令集合,下面将对8086指令系统进行详细总结。
数据传输指令是8086指令系统中的基础指令之一,用于将数据从一个位置传输到另一个位置。
其中包括mov指令、xchg指令、push指令和pop指令等。
mov指令用于将数据从一个存储位置复制到另一个存储位置;xchg指令用于交换两个存储位置中的数据;push指令用于将数据压入栈顶;pop指令用于将栈顶的数据弹出。
算术运算指令是用于进行各种算术运算的指令。
8086支持包括加法、减法、乘法和除法等多种算术运算指令。
例如,add指令用于将两个操作数相加,sub指令用于将第二个操作数从第一个操作数中减去,mul指令用于将两个操作数相乘,div指令用于将第一个操作数除以第一个操作数,并将结果保存在指定的寄存器中。
逻辑运算指令用于进行逻辑运算,包括与、或、非、异或等运算。
例如,and指令用于对两个操作数进行按位与运算,or指令用于对两个操作数进行按位或运算,not指令用于对一个操作数进行按位非运算,xor指令用于对两个操作数进行按位异或运算。
控制转移指令用于控制程序的执行流程。
包括无条件转移指令、条件转移指令和循环指令。
无条件转移指令用于无条件地跳转到指定的地址,例如jmp指令;条件转移指令用于根据一些条件是否成立来进行跳转,例如je指令(跳转到指定地址,如果上一次比较操作相等);循环指令用于循环执行指定的指令块,例如loop指令。
I/O指令用于进行输入输出操作,包括从外部设备读取数据和将数据写入外部设备。
例如,in指令用于将输入端口的数据读取到指定的寄存器中,out指令用于将指定的寄存器中的数据写入到输出端口。
此外,8086还支持一些特殊的指令,如访问标志寄存器的指令,控制指令(如hlt指令、nop指令)和字符串指令(如movsb指令、cmpsb指令)等。
8086微处理器指令系统数据传送数据传送指令可完成寄存器与寄存器之间、寄存器与存储器之间以及寄存器与I/O 端口之间的字节或字传送,它们共同的特点是不影响标志寄存器的内容通用数据传送指令MOV 传送指令格式: MOV 目标,源指令功能:将源操作数(一个字节或一个字)传送到目标操作数。
源操作数可以是8/16位通用寄存器、段寄存器、存储器中的某个字节/字或者是8/16 位的立即数。
堆栈操作指令后进先出的规则存取信息堆栈指针信息存入堆栈时,堆栈指针将自动减量,并将信息存入堆栈指针所指出的存储单元当需要从堆栈中取出信息时,也将从堆栈指针所指出的存储单元读出信息,并自动将堆栈指针增量堆栈指针始终指向堆栈中最后存入信息的那个单元栈顶不断移动、动端堆栈区的另一端则是固定不变的栈底PUSH 入栈指令格式: PUSH 源指令功能:将源操作数压入堆栈。
源操作数可以是16 位通用寄存器、段寄存器或者是存储器中的数据字。
P38 例 2.12POP 出栈指令格式: POP 目标指令功能:将堆栈中当前栈顶和次栈顶中的数据字弹出送到目标操作数。
目标操作数可以是16 位通用寄存器、段寄存器或者是存储单元。
P39 例 2.13XCHG 交换指令1格式: XCHG 目标,源指令功能:将源操作数与目标操作数(一个字节或一个字)相互交换位置。
源操作数可以是通用寄存器或存储单元。
目标操作数只允许是通用寄存器。
P39 例 2. 14XLAT 换码指令2目标地址传送指令这是一类专用于传送地址码的指令,可用来传送操作数的段地址或偏移地址LEA 有效地址送寄存器指令格式: LEA 目标,源指令功能:将源操作数的有效地址EA 传送到目标操作数。
源操作数必须是存储器操作数。
目标操作数必须是16位通用寄存器。
LDS 指针送寄存器和DS指令格式: LDS 目标,源指令功能:从源操作数所指定的存储单元中取出某变扯的地址指针(共4 个字节),将其前两个字节(即变量的偏移地址)传送到目标操作数,后两个字节(即变量的段地址)传送到DS 段寄存器中。
8086 汇编指令集一、数据传输指令它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.1. 通用数据传送指令MOV 传送字或字节.格式为: MOV DST,SRC执行的操作:(DST)<-(SRC)MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字压入堆栈.格式为:PUSH SRC执行的操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(SRC)POP 把字弹出堆栈.格式为:POP DST执行的操作:(DST)<-((SP+1),(SP)) (SP)<-(SP)+2PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI 依次压入堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX 依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI 依次压入堆栈.POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX 依次弹出堆栈.BSWAP 交换32 位寄存器里字节的顺序XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)格式为:XCHG OPR1,OPR2执行的操作:(OPR1)<-->(OPR2)CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )XADD 先交换再累加.( 结果在第一个操作数里)2. 输入输出端口传送指令.IN I/O 端口输入. ( 语法: IN 累加器,{端口号│DX} )长格式为:IN AL,PORT(字节)IN AX,PORT(字)执行的操作:(AL)<-(PORT)(字节)(AX)<-(PORT+1,PORT)(字)短格式为:IN AL,DX(字节)IN AX,DX(字)执行的操作: AL<-((DX))(字节)AX<-((DX)+1,DX)(字)OUT I/O 端口输出. ( 语法: OUT {端口号│DX},累加器),输入输出端口由立即方式指定时,其范围是0-255;由寄存器DX 指定时,其范围是0-65535.长格式为: OUT PORT,AL(字节)OUT PORT,AX(字)执行的操作: (PORT)<-(AL)(字节)(PORT+1,PORT)<-(AX)(字)短格式为: OUT DX,AL(字节)OUT DX,AX(字)执行的操作: ((DX))<-(AL)(字节)((DX)+1,(DX))<-AX(字)XLAT 换码指令字节查表转换,BX 指向一张256 字节的表的起点,AL 为表的索引值(0-255,即0-FFH);返回AL 为查表结果. 执行的操作: ( [BX+AL]->AL )格式为: XLAT OPR或: XLAT3. 目的地址传送指令.LEA 装入有效地址. 格式为: LEA REG,SRC执行的操作:(REG)<-SRC指令把源操作数的有效地址送到指定的寄存器中.例: LEA DX,string ;把偏移地址存到DX.LDS 传送目标指针,把指针内容装入DS.格式为: LDS REG,SRC执行的操作:(REG)<-(SRC) (DS)<-(SRC+2)把源操作数指定的 4 个相继字节送到由指令指定的寄存器及DS 寄存器中.该指令常指定SI寄存器.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送目标指针,把指针内容装入ES.格式为: LES REG,SRC执行的操作: (REG)<-(SRC) (ES)<-(SRC+2)把源操作数指定的 4 个相继字节送到由指令指定的寄存器及ES 寄存器中.该指令常指定DI寄存器.例: LES DI,string ;把段地址:偏移地址存到ES:DI.LFS 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FS:DI.LGS 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GS:DI.LSS 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SS:DI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装入AH.格式为: LAHF执行的操作:(AH)<-(PWS 的低字节)SAHF 标志寄存器传送,把AH 内容装入标志寄存器.格式为: SAHF执行的操作:(PWS 的低字节)<-(AH)PUSHF 标志入栈.格式为: PUSHF执行的操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(PSW)POPF 标志出栈.格式为: POPF执行的操作:(PWS)<-((SP)+1,(SP)) (SP)<-(SP+2)PUSHD 32 位标志入栈.POPD 32 位标志出栈.二、算术运算指令ADD 加法.格式: ADD DST,SRC执行的操作:(DST)<-(SRC)+(DST)ADC 带进位加法.格式: ADC DST,SRC执行的操作:(DST)<-(SRC)+(DST)+CFINC 加1.格式: INC OPR执行的操作:(OPR)<-(OPR)+1AAA 加法的ASCII 码调整.DAA 加法的十进制调整.SUB 减法.格式: SUB DST,SRC执行的操作:(DST)<-(DST)-(SRC)SBB 带借位减法.格式: SBB DST,SRC执行的操作:(DST)<-(DST)-(SRC)-CFDEC 减1.格式: DEC OPR执行的操作:(OPR)<-(OPR)-1NEC 求反(以0 减之).格式: NEG OPR执行的操作:(OPR)<--(OPR)CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).格式: CMP OPR1,OPR2执行的操作:(OPR1)-(OPR2)该指令与SUB 指令一样执行减法操作,但不保存结果,只是根据结果设置条件标志. AAS 减法的ASCII 码调整.DAS 减法的十进制调整.MUL 无符号乘法.格式: MUL SRC执行的操作:字节操作数:(AX)<-(AL)*(SRC)字操作数:(DX,AX)<-(AX)*(SRC)IMUL 整数乘法.格式: IMUL SRC执行的操作:与MUL 相同,但必须是带符号数,而MUL 是无符号数.以上两条,结果回送AH 和AL(字节运算),或DX 和AX(字运算),AAM 乘法的ASCII 码调整.DIV 无符号除法.非组合BCD 码乘法调整指令格式: DIV SRC执行的操作:字节操作:(AL)<-(AX)/(SRC)的商(AH)<-(AX)/(SRC)的余数字操作: (AX)<-(DX,AX)/(SRC)的商(AX)<-(DX,AX)/(SRC)的余数IDIV 整数除法.格式: DIV SRC执行的操作:与DIV 相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号与被除数的符号相同.以上两条,结果回送:商回送AL,余数回送AH,(字节运算);或商回送AX,余数回送DX,(字运算).AAD 除法的ASCII 码调整.非组合BCD 码除法调整指令CBW 字节转换为字. (把AL 中字节的符号扩展到AH 中去)格式: CBW执行的操作:AL 的内容符号扩展到AH.即如果(AL)的最高有效位为0,则(AH)=00;如(AL)的最高有效位为1,则(AH)=0FFHCWD 字转换为双字. (把AX 中的字的符号扩展到DX 中去)格式: CWD执行的操作:AX 的内容符号扩展到DX.即如(AX)的最高有效位为0,则(DX)=0;否则(DX)=0FFFFH.这两条指令都不影响条件码.CWDE 字转换为双字. (把AX 中的字符号扩展到EAX 中去)CDQ 双字扩展. (把EAX 中的字的符号扩展到EDX 中去)三、逻辑运算指令AND 与运算.格式: AND DST,SRC执行的操作:(DST)<-(DST)^(SRC)OR 或运算.格式: OR DST,SRC执行的操作:(DST)<-(DST)V(SRC)XOR 异或运算.格式: XOR DST,SRC执行的操作:(DST)<-(DST)V(SRC)NOT 取反.格式: NOT OPR执行的操作:(OPR)<-(OPR)TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).格式: TEST OPR1,OPR2执行的操作:(DST)^(SRC)两个操作数相与的结果不保存,只根据其特征置条件码SHL 逻辑左移.格式: SHL OPR,CNT(其余的类似)其中OPR 可以是除立即数以外的任何寻址方式.移位次数由CNT 决定,CNT 可以是 1 或CL.SAL 算术左移.(=SHL)SHR 逻辑右移.SAR 算术右移.(=SHR)ROL 循环左移.ROR 循环右移.RCL 通过进位的循环左移.RCR 通过进位的循环右移.以上八种移位指令,其移位次数可达255 次.移位一次时,可直接用操作码. 如SHL AX,1.移位>1 次时,则由寄存器CL 给出移位次数.如MOV CL,04SHL AX,CL四、串指令DS:SI 源串段寄存器:源串变址.ES:DI 目标串段寄存器:目标串变址.CX 重复次数计数器.AL/AX 扫描值.D 标志0 表示重复操作中SI 和DI 应自动增量;1 表示应自动减量.Z 标志用来控制扫描或比较操作的结束.MOVS 串传送.格式:可有三种MOVS DST,SRCMOVSB(字节)MOVSW(字)其中第二、三种格式明确地注明是传送字节或字,第一种格式则应在操作数中表明是字还是字节操作,例如:MOVS ES:BYTE PTR[DI],DS:[SI]执行的操作:1)((DI))<-((SI))2)字节操作:(SI)<-(SI)+(或-)1,(DI)<-(DI)+(或-)1当方向标志DF=0 时用+,当方向标志DF=1 时用-3)字操作:(SI)<-(SI)+(或-)2,(DI)<-(DI)+(或-)2当方向标志DF=0 时用+,当方向标志DF=1 时用-该指令不影响条件码.CMPS 串比较.格式: CMPS SRC,DSTCMPSBCMPSW执行的操作:1)((SI))-((DI))2)字节操作:(SI)<-(SI)+-1,(DI)<-(DI)+-1字操作: (SI)<-(SI)+-2,(DI)<-(DI)+-2指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果,只根据结果设置条件码,指令的其它特性和MOVS 指令的规定相同.SCAS 串扫描.把AL 或AX 的内容与目标串作比较,比较结果反映在标志位.格式: SCAS DSTSCASBSCASW执行的操作:字节操作: (AL)-((DI)),(DI)<-(DI)+-1字操作: (AL)-((DI)),(DI)<-(DI)+-2该指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)进行比较,并不保存结果,只根据结果置条件码.指令的其他特性和MOVS 的规定相同.LODS 装入串.把源串中的元素(字或字节)逐一装入AL 或AX 中.格式: LODS SRCLODSBLODSW执行的操作:字节操作:(AL)<-((SI)),(SI)<-(SI)+-1字操作: (AX)<-((SI)),(SI)<-(SI)+-2该指令把由(SI)指定的数据段中某单元的内容送到AL 或AX 中,并根据方向标志及数据类型修改SI 的内容.指令允许使用段跨越前缀来指定非数据段的存储区.该指令也不影响条件码.一般说来,该指令不和REP 联用.有时缓冲区中的一串字符需要逐次取出来测试时,可使用本指令.STOS 保存串.是LODS 的逆过程.格式: STOS DSTSTOSB(字节)STOSW(字)执行的操作:字节操作:((DI))<-(AL),(DI)<-(DI)+-1字操作: ((DI))<-(AX),(DI)<-(DI)+-2该指令把AL 或AX 的内容存入由(DI)指定的附加段的某单元中,并根据DF 的值及数据类型修改DI 的内容,当它与REP 联用时,可把AL 或AX 的内容存入一个长度为(CX)的缓冲区中.REP 当CX/ECX<>0 时重复.格式: REP string primitive其中String Primitive 可为MOVS,LODS 或STOS 指令执行的操作:1)如(CX)=0 则退出REP,否则往下执行.2)(CX)<-(CX)-13)执行其中的串操作4)重复1)~3)REPE/REPZ 当ZF=1 或比较结果相等,且CX/ECX<>0 时重复.格式: REPE(或REPZ) String Primitive其中String Primitive 可为CMPS 或SCAS 指令.执行的操作:1)如(CX)=0 或ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行2)(CX)<-(CX)-13)执行其后的串指令4)重复1)~3)REPNE/REPNZ 当ZF=0 或比较结果不相等,且CX/ECX<>0 时重复.格式: REPNE(或REPNZ) String Primitive其中String Primitive 可为CMPS 或SCAS 指令执行的操作:除退出条件(CX=0)或ZF=1 外,其他操作与REPE 完全相同.REPC 当CF=1 且CX/ECX<>0 时重复.REPNC 当CF=0 且CX/ECX<>0 时重复.五、程序转移指令1>无条件转移指令(长转移)JMP 无条件转移指令1)段内直接短转移格式:JMP SHORT OPR执行的操作:(IP)<-(IP)+8 位位移量2)段内直接近转移格式:JMP NEAR PTR OPR执行的操作:(IP)<-(IP)+16 位位移量3)段内间接转移格式:JMP WORD PTR OPR执行的操作:(IP)<-(EA)4)段间直接(远)转移格式:JMP FAR PTR OPR执行的操作:(IP)<-OPR 的段内偏移地址(CS)<-OPR 所在段的段地址5)段间间接转移格式:JMP DWORD PTR OPR执行的操作:(IP)<-(EA) (CS)<-(EA+2)2>条件转移指令(短转移,-128 到+127 的距离内)1)根据单个条件标志的设置情况转移JZ(或JE)(Jump if zero,or equal) 结果为零(或相等)则转移格式:JE(或JZ) OPR测试条件:ZF=1JNZ(或JNE)(Jump if not zero,or not equal) 结果不为零(或不相等)则转移格式:JNZ(或JNE) OPR测试条件:ZF=0JS(Jump if sign) 结果为负则转移格式: JS OPR测试条件:SF=1JNS(Jump if not sign) 结果为正则转移格式:JNS OPR测试条件:SF=0JO(Jump if overflow) 溢出则转移格式: JO OPR测试条件:OF=1JNO(Jump if not overflow) 不溢出则转移格式: JNO OPR测试条件:OF=0JP(或JPE)(Jump if parity,or parity even) 奇偶位为1 则转移格式: JP OPR测试条件:PF=1JNP(或JPO)(Jump if not parity,or parity odd) 奇偶位为0 则转移格式: JNP(或JPO) OPR测试条件:PF=0JB(或JNAE,JC)(Jump if below,or not above or equal,or carry) 低于,或者不高于或等于,或进位位为1 则转移格式:JB(或JNAE,JC) OPR测试条件:CF=1JNB(或JAE,JNC)(Jump if not below,or above or equal,or not carry) 不低于,或者高于或者等于,或进位位为0 则转移格式:JNB(或JAE,JNC) OPR测试条件:CF=02)比较两个无符号数,并根据比较的结果转移JB(或JNAE,JC)格式:同上JNB(或JAE,JNC)格式:同上JBE(或JNA)(Jump if below or equal,or not above) 低于或等于,或不高于则转移格式:JBE(或JNA) OPR测试条件:CFVZF=1JNBE(或JA)(Jump if not below or equal,or above) 不低于或等于,或者高于则转移格式:JNBE(或JA) OPR测试条件:CFVZF=03)比较两个带符号数,并根据比较的结果转移JL(或LNGE)(Jump if less,or not greater or equal) 小于,或者不大于或者等于则转移格式:JL(或JNGE) OPR测试条件:SFVOF=1JNL(或JGE)(Jump if not less,or greater or equal)不小于, 或者大于或者等于则转移格式:JNL(或JGE) OPR测试条件:SFVOF=0JLE(或JNG)(Jump if less or equal,or not greater) 小于或等于,或者不大于则转移格式:JLE(或JNG) OPR测试条件:(SFVOF)VZF=1JNLE(或JG)(Jump if not less or equal,or greater) 不小于或等于,或者大于则转移格式:JNLE(或JG) OPR测试条件:(SFVOF)VZF=04)测试CX 的值为0 则转移指令JCXZ(Jump if CX register is zero) CX 寄存器的内容为零则转移格式:JCXZ OPR测试条件:(CX)=0注:条件转移全为8 位短跳!3>循环控制指令(短转移)LOOP CX 不为零时循环.格式: LOOP OPR测试条件:(CX)<>0LOOPE/LOOPZ CX 不为零且标志Z=1 时循环.格式: LOOPZ(或LOOPE) OPR测试条件:(CX)<>0 且ZF=1LOOPNE/LOOPNZ CX 不为零且标志Z=0 时循环.格式: LOOPNZ(或LOOPNE) OPR测试条件:(CX)<>0 且ZF=0这三条指令的步骤是:1)(CX)<-(CX)-12)检查是否满足测试条件,如满足则(IP)<-(IP)+D8 的符号扩充.JCXZ CX 为零时转移.JECXZ ECX 为零时转移.4>子程序CALL 调用指令RET 返回指令5>中断指令INT 中断指令格式: INT TYPE或INT执行的操作: (SP)<-(SP)-2 ((SP)+1,(SP))<-(PSW)(SP)<-(SP)-2 ((SP)+1,(SP))<-(CS)(SP)<-(SP)-2 ((SP)+1,(SP))<-(IP)(IP)<-(TYPE*4) (CS)<-(TYPE*4+2)INTO 溢出中断执行的操作:若OF=1 则:(SP)<-(SP)-2 ((SP)+1,(SP))<-(PSW)(SP)<-(SP)-2 ((SP)+1,(SP))<-(CS)(SP)<-(SP)-2 ((SP)+1,(SP))<-(IP)(IP)<-(10H) (CS)<-(12H)IRET 中断返回格式: IRET执行的操作: (IP)<-((SP)+1,(SP))(SP)<-(SP)+2(CS)<-((SP)+1,(SP))(SP)<-(SP)+2(PSW)<-((SP)+1,(SP))(SP)<-(SP)+2六、处理器控制指令1.标志处理指令CLC 进位位置0 指令(Clear carry)CF<-0CMC 进位位求反指令(Complement carry)CF<-CFSTC 进位位置1 指令(Set carry)CF<-1CLD 方向标志置0 指令(Clear direction)DF<-0STD 方向标志置1 指令(Set direction)DF<-1CLI 中断标志置0 指令(Clear interrupt)IF<-0STI 中断标志置1 指令(Set interrupt)IF<-02.其他处理机控制指令NOP 无操作指令该指令不执行任何操作,其机器码占有一个字节,在调试程序时往往用这条指令占有一定的存储单元,以便在正式运行时用其他指令取代.HLT 停机指令该指令可使机器暂停工作,使处理机处于停机状态以便等待一次外部中断到来,中断结束后可继续执行下面的程序.WAIT 等待指令该指令使处理机处于空转状态,它也可以用来等待外部中断的发生,但中断结束后仍返回WAIT 指令继续德行.ESC 换码指令格式ESC mem其中mem 指出一个存储单元,ESC 指令把该存储单元的内容送到数据总线去.当然ESC 指令不允许使用立即数和寄存器寻址方式.这条指令在使用协处理机(Coprocessor)执行某些操作时,可从存储器指得指令或操作数.协处理机(如8087)则是为了提高速度而可以选配的硬件.LOCK 封锁指令该指令是一种前缀,它可与其他指令联合,用来维持总线的锁存信号直到与其联合的指令执行完为止.当CPU 与其他处理机协同工作时,该指令可避免破坏有用信息.七、伪指令DW 定义字(2 字节).PROC 定义过程.ENDP 过程结束.SEGMENT 定义段.ASSUME 建立段寄存器寻址.ENDS 段结束.END 程序结束.。
8086指令系统通用寄存器:数据寄存器:累加器AX,基址寄存器BX,计数器CX,数据寄存器DX 变址寄存器:源地址寄存器SI,目的变址寄存器DI指针寄存器:基址指针BP,堆栈指针SP段寄存器:代码段寄存器CS,堆栈段寄存器SS,数据段寄存器DS,附加段寄存器ES标志寄存器:FLAGS,指令指针:IP数据寄存器8086有4个16位数据寄存器:AX,BX,CX,DX;它们都可以分为两个独立的8位寄存器:AH/AL,BH/BL,CH/CL,DH/DL;对其中的某8位操作,并不影响另外对应8 位寄存器的数据.数据寄存器是通用的,用来存放计算结果和操作数, 但每个寄存器又有它们各自专用目的,主要是:AX称为累加器,使用程度最高,用于算术,逻辑运算及与外设传送信息等;BX称为基地址寄存器,常用做存放存储器的地址;CX称为计数器,作为循环和串操作等指今中隐含的计数器;DX称为数据寄存器,常用来存放双字节长数据的高16位,或存放外设端口地址.指针及变址寄存器指针及变址寄存器包括SI,DI,BP,SP四个16位寄存器,常用于存储器寻址时提供地址.SI源变址寄存器,DI 目的变址寄存器,一般与DS联用确定数据段中某一存储单元地址.SP堆栈指针寄存器,指示栈顶的偏移地址;BP基址指针寄存器, 表示堆栈段中的基地址.IP16位指令指针寄存器,指示代码段中指令的偏移地址,它与代码段寄存器CS 联用,以确定下一条指令的物理地址.处理器利用CS:IP取得下一条要执行的指令,然后修改IP的内容,使之指向下一条指令的存储器地址.标志寄存器(FLAGS) 也称为状志标志寄存器PSW0 CF(Carry Flag) 进位标志12 PF(Parity Flag)零标志34 AF(Auxiliary Carry Flag)辅助进位标志56 ZF(Zero Flag)零标志7 SF(Sign Flag)符号标志:运算结果最高有效位的状态就是符号位的状态.8 TF(Trap Flag)陷井标志9 IF(Interrupt-enable Flag)中断允许标志10 DF(Direction Flag)方向标志11 OF(Overflow Flag)溢出标志12131415状态标志:CF,ZF,SF,PF,OF,AF控制标志:DF,IF,TF8086的字长是16位的,但其地址线是32位的.8086处理器将1M存储器空间分成许多逻辑段(Segment),每个段的最大限为16KB. 这样,每个存储单元就可以用"段地址:段内偏移地址"表达其准确的物理位置."段地址:偏移地址"的形式称为逻辑地址 .将逻辑地址中的段地址左移4位(这是对二进制而言,若是十六进制,只要左移一位),加上偏移地址就得到20位物理地址. 例如逻辑地址"1460H:100H"表示物理地址14700H, 同一个物理地址可以有多个逻辑地址形式.8位通用寄存器AH/AL/BH/BL/CH/CL/DH/DL16位的通用寄存器AX/BX/CX/DX.DST 目的操作数SRC 源操作数一. 通用数据传送指令1. 传送指令MOV (move)格式:MOV DST,SRC操作:(DST)←(SRC) 将原操作数(字节或字)传送到目的地址。
8086指令集寄存器:累加器:AX 变址寄存器:SI 代码段寄存器:CS 指令指针:IP基址寄存器:BX 变址寄存器:DI 数据段寄存器:DS 微处理器状态字:PSW 计数寄存器:CX 堆栈寄存器:SP 附加段寄存器:ES数据寄存器:DX 基址指针:BP 堆栈段寄存器:SS属性操作符:符号及含义:SEG:取出段地址OPR:一个操作数REGn:一个n位寄存器OFFSET:取出偏移地址SRC:源操作数MEM:一个存储单元TYPE:取出其类型DST:目的操作数CNT:计数值LENGTH:取出变量重复次数REG:一个寄存器LABEL:标号或过程名SIZE:取出变量的大小SEG:段地址IDATA:立即数数据寻址方式:立即寻址,寄存器寻址,存储器寻址(5种),隐含寻址一:立即寻址:MOV AX ,12A2H ;二:寄存器寻址:MOV DS,AX ; MOV V AR ,BX ;三:存储器寻址:操作数保存在存储单元中(5种)直接寻址:偏移地址直接给出, 1.MOV AX,V AR; 2. MOV DL,V AR2+5;3. MOV CX,[1200H]4. MOV V AR,2500 ;寄存器间接寻址:有效地址存放在寄存器中,直接寻址:1.MOV AX,[ SI ] ; 2.MOV [BX],DX ;寄存器相对寻址:有效地址为一个基址寄存器或变址寄存器的内容怀一个8位或16位的位移量这和. 1.MOV BX,[ SO+5 ] ; 2.MOV CX,V AR[BX]; 3.MOV AL,V AR[DI-5]基址变址寄存器:有效地址为一个基址寄存器和一个变址寄存器之和,1.MOV DX,[BX][SI]2.MOV AX,[BP][SI]基地变址且相对寻址:基址寄存器内容,一个变址寄存器内容,一个位移量,三者之和。
1.MOV AX,[BX+5][SI];2.MOV V AR[BP][DI],AX;数据传送指令:通用传送类指令:MOV 格式: MOV DST,SRC;获取有效地址指令:LEA 格式:LEA REG16, MEM;获取地址指针指令:LDS,LES 格式:LDS REG16, MEM(取高16位送入DS,低16送入REG16中;) 格式; LES REG16, MEM(高16位送入ES,低16送入REG16中)标志传送指令:LAHF,SAHF 格式:LAHF ;PSW寄存器中低8位传送到寄存器AH中格式:SAHF ; 将寄存器AH中低8位传送到PSW寄存器中的低8位数据交换指令:XCHG 格式:XCHG DST,SRC :两个操作数之间数据的交换字节转换指令:XLAT 格式:XLAT :堆栈操作指令:PUSH,POP,PUSHF,POPF算术运算类指令:加减法指令:加法指令:ADD,ADC : 格式:ADD DST,SRC ;将SRC+DST的结果存入DSTADC DST,SRC;将SRC+DST+CF的结果存入DST 减法指令:SUB,SBB: 格式:SUB DST,SRC;相似上方,取负指令:NEG 格式:NEG DST; 0-DST的结果存在DST.比较指令:CMP 格式:CMP DST,SRC; DST-SRC的结果设置PSW的状态标志位。
8086汇编机器指令8086汇编是一种低级语言,它基于Intel 8086微处理器的指令集架构。
在计算机科学中,汇编语言是一种与机器语言密切相关的语言,它提供了一种将高级语言编写的程序转换为机器语言的方式。
8086汇编的机器指令是一组独特的二进制代码,它们被计算机硬件直接执行,从而实现各种功能。
下面是8086汇编的一些常见指令的相关参考内容:1. MOV指令(Move):用于将数据从一个位置复制到另一个位置。
例如:```MOV AX, BX ;将BX寄存器中的值复制到AX寄存器```2. ADD指令:用于将两个值相加并将结果存储在目标位置。
例如:```ADD AX, BX ;将AX寄存器和BX寄存器中的值相加,并将结果存储在AX寄存器```3. SUB指令(Subtract):用于将一个值从另一个值中减去并将结果存储在目标位置。
例如:```SUB AX, BX ;将BX寄存器的值从AX寄存器的值中减去,并将结果存储在AX寄存器```4. CMP指令(Compare):用于比较两个值,并根据比较结果设置标志位。
例如:```CMP AX, BX ;比较AX寄存器和BX寄存器的值,根据比较结果设置标志位```5. JMP指令(Jump):用于无条件跳转到程序中的另一个位置。
例如:```JMP label ;跳转到标签为"label"的位置```6. JE指令(Jump if Equal):用于在相等条件下跳转到程序中的另一个位置。
例如:```JE label ;如果上一次比较为真,则跳转到标签为"label"的位置```7. JNE指令(Jump if Not Equal):用于在不相等条件下跳转到程序中的另一个位置。
例如:```JNE label ;如果上一次比较为假,则跳转到标签为"label"的位置```8. LOOP指令:用于循环执行一段代码块。
8086常⽤指令集⽬录从功能上包括六⼤类:数据传送算术运算逻辑运算和移位串操作程序控制处理器控制⼀、数据传输指令注意点:两操作数字长必须相同;两操作数不允许同时为存储器操作数两操作数不允许同时为段寄存器;在源操作数是⽴即数时,⽬标操作数不能是段寄存器;IP和CS不作为⽬标操作数,FLAGS⼀般也不作为操作数在指令中出现。
①通⽤数据传输指令1、传送指令MOVMOV ⽬的操作数,源操作数注意:⽬的操作数和源操作数不能是IP寄存器、类型必须相同,不可以同时为段寄存器不允许在两个存储单元中直接传送数据⽬的操作数不允许是⽴即数⽴即数不允许直接送⼊段寄存器2、交换指令XCHG格式:XCHG REG,MEM/REG注意:操作数不能为⽴即数、段寄存器两操作数必须有⼀个是寄存器操作数,不能同时为存储单元。
②堆栈操作指令堆栈操作的原则先进后出以字节为单位指令的操作数必须是16位操作数可以是寄存器或存储器两单元,但不能是⽴即数;不能从栈顶弹出⼀个字给CS;1、进栈指令PUSHPUSH 源操作数2、出栈指令POPPOP ⽬的操作数③累加器(即AX或AL)专⽤传输指令指令寻址⽅式根据端⼝地址码的长度,指令具有两种不同的端⼝地址表现形式。
直接寻址端⼝地址为8位时,指令中直接给出8位端⼝地址;寻址256个端⼝。
间接寻址端⼝地址为16位时,指令中的端⼝地址必须由DX指定;可寻址64K个端⼝。
acc(AL/AX)PORT(端⼝地址)1、输⼊指令ININ acc,PORT2、输出指令OUTOUT PORT,acc3、查表指令XLATXLAT说明:⽤BX的内容代表表格⾸地址,AL内容为表内位移量,BX+AL得到要查找元素的偏移地址操作:将BX+AL所指单元的内容送AL注意:执⾏该指令前需先执⾏:MOV BX,换码表的偏移⾸地址MOV AL,被转换码④⽬标地址传输指令取近地址指令:LEA取远地址指令:LDS、LESLDS和LES均⽤于将⼀个32位的远地址指针写⼊到⽬标寄存器。
8086指令集的操作码8086指令集的操作码,指的是英特尔8086微处理器所支持的一系列指令的二进制表示。
这些操作码由不同的位字段组成,每个位字段代表不同的指令功能或参数,通过编码的方式告知处理器要执行的具体操作。
本文将以中括号内的主题为主线,分步介绍8086指令集的操作码,帮助读者了解其结构和功能。
第一步,我们先了解8086指令集的基本结构。
8086指令集主要由操作码、操作数和寄存器组成。
操作码用于表示指令的类型和功能,操作数用于指定指令要操作的数据,而寄存器则用于存储指令过程中的临时数据。
操作码是指令集的核心部分,它决定了处理器要进行的具体操作。
第二步,我们详细分析操作码的结构。
8086指令集的操作码通常由一个或多个字节组成,不同指令的操作码长度各不相同。
每个操作码由若干位字段组成,不同位字段表示不同的含义。
下面是8086指令集常见操作码的一些位字段及其含义:1. 操作码前缀:有些指令的操作码以一个或多个字节作为前缀,用于修改指令的默认行为。
例如,0x66前缀用于指示指令使用16位操作数而不是默认的8位操作数。
2. 操作码码头:通常由几个位字段组成,用于表示指令的类型和功能。
不同的码头表示不同的指令类型,例如,00开头的指令码用于表示数据传输指令,8x开头的指令码用于表示算术和逻辑操作等。
3. 操作数字段:一些指令的操作码中包含指定操作数的字段。
例如,寄存器操作数字段用于指定寄存器编号,内存操作数字段用于指定内存地址,立即数操作数字段用于指定一个常数等。
4. 模式字段:一些指令的操作码中包含用于指定指令执行模式的字段。
例如,寻址模式字段用于指定内存操作数的寻址方式,寄存器模式字段用于指示指令使用哪些寄存器。
5. 功能字段:一些指令的操作码中包含用于指定指令所执行的具体功能的字段。
例如,ALU操作码字段用于指定逻辑或算术操作的类型,位移操作码字段用于指定位移操作的方向和位数等。
第三步,我们了解如何使用操作码来编写8086汇编指令。
8086微处理器的指令集架构8086微处理器是一种16位的通用微处理器,由英特尔公司于1978年发布。
它的指令集架构称为x86,后来的许多处理器都是基于该架构进行扩展的。
这个指令集架构是8086微处理器与其后继处理器(如80286、80386等)之间的兼容性的基础,影响了后来的计算机硬件和软件设计。
8086指令集架构具有大量的指令和寻址模式,这些指令可以操作不同的数据类型和寄存器。
下面我们来介绍一些8086指令集的主要特点和功能:1.数据传送指令:- MOV:用于将数据从一个位置复制到另一个位置。
例如,MOV AX, BX可以将BX寄存器的内容复制到AX寄存器。
- PUSH和POP:用于将数据从寄存器或内存推送到堆栈或从堆栈中弹出。
例如,PUSH AX将AX寄存器的内容推送到堆栈中。
2.算术和逻辑指令:- ADD、SUB、INC和DEC:用于对寄存器或内存中的数据执行加法、减法、递增和递减操作。
- AND、OR、XOR和NOT:用于对寄存器或内存中的数据执行逻辑操作,如与、或、异或和取反。
- MUL和DIV:用于对寄存器或内存中的数据执行乘法和除法操作。
3.控制转移指令:- JMP:用于无条件跳转到指定标签或内存位置。
- JZ、JNZ、JE、JNE等:用于根据条件跳转到不同的指令位置。
例如,JZ表示如果零标志位为真,则跳转。
- CALL和RET:用于调用和返回子程序。
4.串操作指令:- MOVS、LODS、STOS、CMPS:用于在内存之间复制、加载、存储和比较数据。
- REP和REPE:用于重复执行串操作指令。
5.输入输出指令:- IN和OUT:用于从输入输出端口读取和写入数据。
- INT和IRET:用于进行中断和中断返回操作。
在8086指令集架构中,还有一些特殊的指令和寻址模式,用于实现更复杂的功能。
例如,8086支持段寻址模式,即使用段寄存器和偏移地址的组合来访问内存。
此外,还有一些面向特定任务的指令,如乘法指令和浮点操作指令等。
8086汇编指令汇总一、基本指令集1.MOV:用于将一个值从一个位置复制到另一个位置。
2.ADD:将两个操作数相加,并将结果存储在第一个操作数中。
3.SUB:将第二个操作数从第一个操作数中减去,并将结果存储在第一个操作数中。
4.INC:将指定的寄存器或内存位置的值加一5.DEC:将指定的寄存器或内存位置的值减一6.MUL:将两个操作数相乘,并将结果存储在累积寄存器中。
7.DIV:将累积寄存器的值除以指定的操作数,并将商存储在累积寄存器中,余数存储在另一个寄存器中。
二、数据传送指令1.MOVSB:从指定内存位置复制一个字节到另一个位置。
2.MOVSW:从指定内存位置复制一个字到另一个位置。
3.MOVSBW:从指定内存位置复制一个字节到另一个位置,并将其扩展为字。
4.LODSB:从指定内存位置加载一个字节到累积寄存器中。
5.LODSW:从指定内存位置加载一个字到累积寄存器中。
6.STOSB:将累积寄存器中的值存储到指定内存位置。
7.STOSW:将累积寄存器中的值存储到指定内存位置。
8.XCHG:交换两个操作数的值。
三、算术与逻辑指令1.AND:对两个操作数执行逻辑与操作,并将结果存储在第一个操作数中。
2.OR:对两个操作数执行逻辑或操作,并将结果存储在第一个操作数中。
3.XOR:对两个操作数执行逻辑异或操作,并将结果存储在第一个操作数中。
4.NOT:对指定的操作数执行逻辑非操作。
5.SHR:将指定操作数的位向右移动指定的位数。
6.SHL:将指定操作数的位向左移动指定的位数。
7.CMP:比较两个操作数的值,并设置相应的条件码。
四、控制转移指令五、字符串操作指令1.REP/REPE/REPZ:用于重复执行一些指令,并且在条件满足时继续执行,直到满足特定的条件。
2.MOVSB/MOVSW:从一个内存位置复制一个字节或字到另一个位置。
3.CMPSB/CMPSW:将两个内存位置的值进行比较。
4.SCASB/SCASW:在累积寄存器中查找指定的字节或字,并设置相应的条件码。
8088/8086的功能结构一、8088/8086的结构8086与8088在结构上都是由和两大部份组成。
以下是8088/8086的内部结构框图。
执行单元EU负责执行指令。
EU在工作时不断地从指令队列掏出指令代码,并完成指令所要求的操作。
它由算术逻辑单元ALU、通用寄放器REGs、标志寄放器FLAGS和EU操纵部件组成。
各部件的功能如下:ALU:即运算器,进行算术、逻辑、移位、偏移地址计算等各类运算。
FLAGS:寄存运算结果的特点,如进借位、是不是为零、奇偶性、溢出等。
REGs:临时寄存操作数、运算结果和操作数地址等。
EU操纵部件:接收指令队列中的指令,进行指令译码、分析,形成各类操纵信号,实现EU 各个部件完成规定动作的操纵。
总线接口单元BIU负责CPU与存储器、I/O接口之间的信息(包括数据、地址、操纵命令等)传送。
包括生成访问存储器所需的20位的物理地址、不断从内存中取指令并送到指令队列、和配合EU对指定的内存单元或外设端口进行数据存取操作。
BIU由段寄放器、指令指针寄放器IP、指令队列、地址加法器和总线操纵逻辑组成。
各部件的功能如下:总线操纵逻辑:CPU与外总线之间的接口,实现指令、数据和其他外部信息的存取。
段寄放器:寄存存储器段的段基地址。
指令指针寄放器:寄存当前要读取的指令的地址。
它相当于前面介绍过的。
指令队列:8088和8086的指令队列长度别离为4字节和6字节,为FIFO(先进先出)结构。
当EU从指令队列中取走指令,指令队列显现空字节时,BIU就自动执行一次取指令周期,从内存中掏出后续的指令代码放入队列中。
当EU需要数据时,BIU依照EU给出的地址,从指定的内存单元或外设中掏出数据供EU利用。
当运算终止时,BIU将运算结果送入指定的内存单元或外设。
当指令队列空时,EU就等待,直到有指令为止。
假设BIU正在取指令,EU发出访问总线的请求,那么必需等BIU取指令完毕后,该请求才能取得响应。
标志寄存器:9个有效位,分6个状态寄存器和3个控制寄存器CF 当执行一个加法(减法)使最高位产生进位(借位)时CF=1 否则CF=0PF 指令执行的结果低8位有偶数个一时,CF=1 否则CF=0AF 当执行一个加法(减法)使运算结果低4位向高4位有进位(借位)时AF=1 否则AF+0ZF 当前运算结果为零,ZF=1 否则ZF=0SF 符号标志位OF 溢出标志位DF 方向标志位IF 中断允许位IF=1时响应外部中断TF 跟踪标志位操作数:[目的操作数(OPD),源操作数(OPS)] ;立即操作数,寄存器操作数,存储器操作数。
寻址方式:1) 寄存器寻址例:INC AX; MOV AX,BX2) 寄存器间接寻址(寄存器只能是BX,DI,SI,BP);[PA=(BX、DI、SI)+DS》4)或BP+SS》4]3) 寄存器相对寻址4) 基址变址寻址5) 相对基址变址寻址6) 直接寻址7) 立即数寻址i. 立即数寻址立即数寻址不能用在单操作数指令中ii. 在双操作数中,立即数寻址方式不能用于目的操作数字段指令系统:1) 数据传送指令mov注意:不允许在两个存储单元之间直接传送数据不允许在两个段寄存器之间传送数据不允许用立即数直接为段寄存器赋值不影响标志位不允许寄存器或存储单元到除CS外的段寄存器2) 入栈(出栈)指令PUSH(POP)注意:PUSH操作数不能是“立即数”POP操作数不能是段寄存器CS不影响标志位先进后出单操作符3) 交换指令XCHG注意:只允许寄存器与存储单元之间的交换不影响标志位4) 换码指令XLAT5) 地址传送指令LEA(load effective address):偏移地址()6) 数据段指针送寄存器LDS :低地址的字送指定的通用寄存器(SI)、高地址的字送DS7) 附加段指针送寄存器指令LES :与LDS相似,低地址的字送通用寄存器(DI)、高地址送ES上三指令不影响标志位8) 标志寄存器传送指令LAHF :标志寄存器低八位送AHSAHF :AH送标志寄存器低八位PUSHF:标志寄存器压入堆栈POPF :栈顶内容送标志寄存器9) 加法指令ADD目的操作数只能是寄存器或存储单元对CF,OF,SF,PF,ZF,AF有影响10) 加1指令INC对OF,SF,PF,ZF,AF有影响11) 带位加法指令ADC在进行单精度运算时用ADD指令,在高精度低位运算时用ADD、高位用ADC OPD=OPD+OPS+CF12) 减法指令SUB对CF,OF,SF,PF,ZF,AF有影响13) 带借位减法指令SBBOPD=OPD—OPS—CF对CF,OF,SF,PF,ZF,AF有影响对CF,OF,SF,PF,ZF,AF有影响14) 减1指令DEC15) 比较指令CMP16) 求补指令NEG17) 无符号乘法指令MUL字节操作:AX=AL*OPS字操作:DX,AX=AX*OPS18) 有符号乘法指令IMUL19) 无符号除法指令DIV字节的操作:AL=AX/(OPS)的商AH=AX/(OPS)的余数字的操作:20) 有符号除法IDIV21) 字节转换为字指令CBW把AL中的符号位扩展到AH中,如果AL的最高位为0,则AH=00H,如果最高位为1,则AH=FFH22) 字转换为双字指令CWD23) 压缩的BCD码调整指令DAA 加法的十进制调整指令DAS 减法的十进制调整指令24) 非压缩的BCD码调整指令AAA 加法的ASCII调整指令AAS 减法的ASCII调整指令AAM 乘法的ASCII调整指令AAD 除法的ASCII调整指令25) 逻辑与运算指令ADDORNOTTEST(OPD和OPS的内容不变)26) 移位指令逻辑左移与算术左移SHL、SAL(低位补0)算术右移SAR(高位不变、CF为最后移入的值)逻辑右移SHR(高位补0、CF为最后移入的值)27) 循环移位左移ROL (CF为最后移入的值)右移ROR (CF为最后移入的值)带进位循环左移RCL(CF+OPD 一起左循环)带进位循环右移RCR(OPD+CF 一起右循环)28) 无条件转移指令下JMPJMP SHORT OPD(IP=IP+8位位移量)JMP NEAR PTR OPD(IP=IP+16位位移量)上二条指令目的地址是IP=OPD+IPJMP WORD PTROPD(IP=EA)JMP FAR PTR OPD(IP=OPD的段内偏移地址CS=OPD段地址) JMP DWORD PTR OPD(IP=EA CS=EA+2)29) 条件转移指令JZ(JE)结果为0则转移(ZF=1)JNZ(JNE)结果不为0则转移(ZF=0)JS 结果为负则转移(SF=1)JNS 结果为正则转移(SF=0)JO 溢出则转移(OF=1)JNO 不溢出则转移(OF=0)JP(JPE)奇偶位为1则转移(PF=1)JNP(JPO)奇偶位不为1则转移(PF=0)JC(JNAE,JB)低于且不等于或进位位为1则转移(CF=1)JNC(JNE,JNB)高于或等于或进位位为0则转移(CF=0)30)。
8086指令的基本格式一、概述在计算机科学领域中,指令是计算机执行操作的基本单位。
8086指令集是Intel 于1978年推出的一种16位微处理器指令集,被广泛应用于个人电脑和其他嵌入式系统中。
本文将详细介绍8086指令的基本格式及其组成部分。
二、8086指令的组成8086指令由若干个字节组成,每个字节代表一个特定的操作码或操作数。
根据指令的功能和操作数的个数,8086指令可以分为不同的类型,包括数据传输指令、算术运算指令、逻辑运算指令、控制转移指令等。
三、8086指令的基本格式8086指令的基本格式包括操作码、操作数和标志位。
下面将对每个部分进行详细介绍。
1. 操作码操作码是指令的关键部分,用于指定要执行的操作类型。
8086指令的操作码通常由一个或多个字节组成,不同的操作码代表不同的指令功能。
例如,MOV指令用于数据传输,ADD指令用于算术运算。
2. 操作数操作数是指令的操作对象,用于指定要操作的数据。
8086指令的操作数可以是寄存器、内存地址或立即数。
寄存器是8086处理器内部的存储单元,用于存储和操作数据。
内存地址指的是存储器中的某个位置,可以通过地址来访问其中的数据。
立即数是指令中直接给出的常数值。
3. 标志位标志位是用于记录处理器状态和指令执行结果的标志位。
8086处理器有多个标志位,包括进位标志、零标志、符号标志等。
这些标志位可以通过特定的指令来设置或清除,并在指令执行过程中进行判断和使用。
四、8086指令的执行过程8086指令的执行过程可以分为取指令、译码、执行和写回等阶段。
1.取指令阶段:处理器从内存中读取下一条指令,并将其存储在指令寄存器中。
2.译码阶段:处理器对取出的指令进行解码,确定要执行的操作类型和操作数。
3.执行阶段:处理器根据指令的操作类型和操作数执行相应的操作,如数据传输、算术运算等。
4.写回阶段:处理器将执行结果写回到寄存器或内存中,更新标志位。
五、8086指令的示例下面将通过示例来说明8086指令的基本格式和使用方法。
8086指令集结构一.8086 的寄存器结构8086CPU中具有14个程序员可以访问的16位寄存器(如图1.1所示),按其功能可分为通用寄存器、段寄存器、指令指针寄存器及标志寄存器。
图1.1 8086寄存器结构框图(1) 通用寄存器8086CPU共有8个16位寄存器,它们可以作为一般的通用寄存器存放数据。
按照相应的用途又可以分为两组:一组是数据寄存器(AX,BX,CX,DX),可以按照字(16位)形式访问,也可按照字节(8位)形式访问。
主要用来暂时存放在计算过程中需要用到的操作数、操作运算结果。
另一组是地址指针寄存器(SP,BP,SI,DI),只能按照字形式访问。
主要存放访问主存时所需的偏移地址。
AX(Accumulator) 称作累加器,在乘、除法等指令运算中指定存放操作数及运算结果。
BX(Base) 称作基址寄存器,在计算主存地址时可以用作基址寄存器。
CX(Count) 称作计数寄存器,在循环指令及串处理等指令中作为隐含的计数器使用。
DX(Data) 称作数据寄存器,在字(16位)乘、除法等指令中用于存放双倍字长结果的高16位数据;在I/O指令中存放I/O的端口地址。
以上四个16位寄存器均可分为两个独立的8位寄存器使用。
如AX分为AH 和ALSP(Stack Pointer) 称作堆栈指针寄存器,存放堆栈段首地址到栈顶单元的偏移量。
BP(Base Pointer) 称作基址指针寄存器,通常用于存放需要访问的、位于堆栈段数据的一个基地址或该段的某个字单元到堆栈段首地址的偏移量。
SI(Source Index) 称作源变址寄存器,主要用于存放需要访问的(源)操作数所在主存单元相对于该段首地址的偏移量。
在串操作指令中,用作隐含的源变址寄存器。
DI(Destination Index) 称作目的变址寄存器,主要用于存放需要访问的(目的)操作数所在主存单元相对于该段首地址的偏移量。
在串操作指令中,用作隐含的目的变址寄存器。
(2) 段寄存器8086支持访问最多1MB的主存空间,主存按段结构进行管理,在主存中存放的段的类型一共有4种(代码段、数据段、附加段、堆栈段)。
主存地址的表示形式为:段寄存器:段内偏移。
CS(Code Segment) 称作代码段寄存器,指定当前正在运行的代码段。
DS(Data Segment) 称作数据段寄存器,指定当前访问的数据段。
EX(Extra Segment) 称作附加段寄存器,指定当前的附加段。
附加段主要为当前运行程序所处理的存储器操作数提供所需的辅助存储空间。
SS(Stack Segment) 称作堆栈段寄存器,指定当前的堆栈段,堆栈段可以根据需要在其中存放暂存的各种数据。
(3) 指令指针寄存器IP(Instruction Pointer) 是一个16位的专业寄存器,存放需要访问的指令在代码段中的偏移量(类似于通常所说的程序计数器PC)。
多数情况下,CS:IP 指向下一条即将执行的指令地址。
(4)标志寄存器8086CPU中设置了一个16位的标志寄存器FLAGS,但只有其中的9位有效,每一位指示机器当前的某个状态特征或控制信息。
包括6位状态标志位和3位控制标志位。
a)状态标志位状态标志位主要由CPU根据指令执行的结果自动设置。
这些标志位通常作为某个条件转移指令的测试条件。
CF(Carry Flag) 进位标志,记录运算时最高位产生的进位。
PF(Parity Flag) 奇偶标志,反映操作结果的低8位中1的个数,如果1的个数为偶数,则PF置1,否则PF置0。
PF主要用来检测在机器中传送信息时是否出错。
AF(Auxiliary Carry Flag) 辅助进位标志,记录运算结果的第3位(即低半字节)向高位(第4位)产生的进位或借位。
该标志通常用于十进制算术运算的调整。
ZF(Zero Flag) 零标志,运算结果为零,则ZF置1,否则置0。
SF(Sign Flag) 符号标志,记录运算结果的符号,若非负则置0,否则置1。
OF(Overflow Flag) 溢出标志,反应带符号数的运算结果是否超出机器所能表示的数值范围,超出该范围则为溢出,OF置1,否则置0。
b)控制标志位控制标志位主要用于串操作方向的控制、中断的屏蔽以及程序的调试。
TF(Trap Flag) 陷阱标志,也可称为单步标志或跟踪标志,用于程序的调试。
当TF为1,CPU执行完一条指令后便产生单步中断,然后转去执行单步中断服务程序。
IF(Interrupt Flag) 中断标志,或称为中断允许标志。
当IF置1则允许CPU 响应中断请求,当IF置0,则禁止CPU响应可屏蔽中断请求。
DF(Direction Flag) 方向标志,用于串操作指令,控制串的处理方向。
当DF置1时,每执行一步串操作,地址指针寄存器SI和DI的内容自动递减,以指向下一步串操作的地址。
当DF置0时,SI和DI内容自动递增。
二.8086的寻址方式2.1 与数据相关的寻址方式(1)立即寻址方式指令中所需要的操作数直接存放在本条指令代码的立即数字段中,操作数作为指令的一部分存放在代码段中,当把指令取出时,操作数已经被一起取到CPU 的指令队列中,指令执行时不需要再去主存或寄存器中读取该操作数。
示例:MOV AL ,23H该条指令经过汇编后,操作数23H被存放在指令的操作数字段中。
随着取指操作一起被读入CPU。
(2) 寄存器寻址方式指令中所需要的操作数存放在CPU的某个寄存器中,指令的地址码部分给出寄存器地址(或称作寄存器号)。
寄存器可以使用16位也可以使用8位寄存器。
示例:MOV AL,BH该指令的源操作数BH和目的操作数AL均为寄存器寻址方式,而MOV AL,23H的目的操作数AL为寄存器寻址方式,源操作数23H为立即寻址方式。
(3) 直接寻址直接寻址方式也称为存储器直接寻址方式。
指令中的操作数字段直接指出操作数所在的内存地址。
示例:MOV AX,DS:[1200H]该指令的源操作数为DS:[1200H]所指向的内存单元中的16位数据。
指令功能是把主存中当前数据段偏移1200H字节处的字单元内容传送到通用寄存器AX中。
(4) 寄存器间接寻址方式指令中所需要的操作数存放在主存的某个单元中,而操作数的有效地址EA存放在某个作为地址寄存器的4个通用寄存器BX、BP、SI或DI中。
若以BX、SI 或DI作为间址寄存器,则默认段为数据段,即DS指向的段。
如果以BP作为间址寄存器,则默认段为堆栈段,即SS指向的段。
示例:MOV AX,[BX]该指令的源操作数为DS:BX所指向的内存单元中的16位数据。
(5) 变址寻址方式指令中所需要的操作数存放于主存的某个单元中,指令的地址码部分给出构成操作数有效地址EA的位移量部分和4个通用寄存器BX、BP、SI或DI之一的寄存器地址。
这里默认段的指定同寄存器间接寻址。
示例:MOV AX,20H[BX]该指令的源操作数为DS:[BX]+20H所指向的内存单元中的16位数据。
指令功能把主存中当前数据段偏移BX寄存器内容加20H处字单元内容传送到通用寄存器AX中。
(6) 基址变址寻址方式指令中所需要的操作数存放于主存的某个单元中,操作数的有效地址EA由指令中给出的位移量、基址寄存器(BX或BP)的内容和变址寄存器(SI或DI)的内容之和构成。
段寄存器的默认规则根据两个基址寄存器BX及BP而确定。
示例:MOV AX,DS:16H[BX][SI]该指令的源操作数为DS:16H[BX][SI]所指向的内存单元中的16位数据。
指令功能是把主存中当前数据段偏移BX寄存器内容、SI寄存器内容、16H三者之和的字节处字单元内容传送到通用寄存器AX中。
2.2 与转移地址相关的寻址方式与转移地址相关的寻址方式主要用来确定转移指令和过程调用指令等的转向地址。
(1)段内直接寻址段内直接寻址方式是指程序转向的目的地与本条转移指令在同一个段内。
示例:JMP 20H该指令修改指令指针寄存器IP为IP+20H,即实现将程序的执行点跳转到下一条指令的后20H字节单元处开始执行。
(2)段间直接寻址段间直接寻址方式是指程序转向的目的地与转移指令不在同一个段内。
示例:JMP 1701:0100H该指令同时修改CS和IP寄存器,段地址1701H被送入CS,0100H被送入IP。
这样程序便被跳转到17010H+0100H处开始执行。
(3)段内间接寻址间接寻址方式表示程序转向的目标地址在指令中不直接给出,而是通过寄存器或主存单元间接给出。
示例:JMP BX表示跳转到本段由BX给出的段内偏移(按字节算)处。
如果段内偏移存放在主存某个字单元中,则转移的目标地址可以采用数据寻址方式中对主存操作数的各种寻址方式。
例如:JMP [BX]上述指令表示转移目标地址在代码段中的偏移量保存在数据段中的偏移量位于通用寄存器BX中的内存字单元里;(4)段间间接寻址段间间接寻址方式是指程序转向的目的地与本条转移指令不在同一段内,程序转向的目标地址保存在主存某4字节的单元中。
前两个字节(低地址)的内容被送入IP,后两个字节(高地址)被送入代码段寄存器CS。
示例:JMP DWORD PTR [BX]该指令将DS:[BX]所指向的内存地址上的4字节数据送入CS和IP寄存器中。
三.8086指令集1.数据传送指令(一)通用传送指令(1)MOV指令指令格式:MOV 目,源功能:将源操作数传送给目标操作数。
(2)堆栈操作指令进栈指令:PUSH格式:PUSH 源功能:将源操作数压入堆栈。
例:用堆栈指令完成上例的功能。
MOV AX,3000HMOV DS,AX ;段寄存器填充MOV SI,0100H ;基本指令执MOV DI,2000H ;行前的初值MOV CX,50NT: PUSH [SI] ;程序从这POP [DI] ;开始设计INC SIINC SIINC DIINC DILOOP NTMOV AH,4CHINT 21H(3)交换指令 XCHG格式:XCHG 目,源功能:源和目标中的内容交换。
(二)累加器专用传送指令(1)输入输出指令 IN,OUT输入指令格式: #1 IN AX|AL,8位端口号#2 IN AX|AL,DX功能:从外设输入数据到AX|AL寄存器。
输出指令格式:#1 OUT 8位端口号,AX|AL#2 OUT DX,AX|AL功能:将AX|AL中的数据输出到外设。
该类指令是硬件功能与软件作用的结合。
(2)查表转换指令 XLAT指令格式:XLAT功能:将内存单元[BX+AL]中的内容,置入AL寄存器中。
(三)地址传送指令地址传送指令有两类:仅传送偏移地址指令及段地址与偏移地址同时传送指令。
(1)仅传送偏移地址指令:LEA指令格式:LEA 目,源功能:将源操作数的偏移地址传送给目标寄存器。