- 论坛徽章:
- 1
|
- 8086/8088指令系统
- 一、数据传送指令
- 1.通用数据传送指令
- MOV(Move)传送
- PUSH(Push onto the stack)进栈
- POP(Pop from the stack)出栈
- XCHG(Exchange)交换
- .MOV指令
- 格式为: MOV DST,SRC
- 执行的操作:(DST)<-(SRC)
- .PUSH进栈指令
- 格式为:PUSH SRC
- 执行的操作:(SP)<-(SP)-2
- ((SP)+1,(SP))<-(SRC)
- .POP出栈指令
- 格式为:POP DST
- 执行的操作:(DST)<-((SP+1),(SP))
- (SP)<-(SP)+2
- .XCHG 交换指令
- 格式为:XCHG OPR1,OPR2
- 执行的操作:(OPR1)<-->(OPR2)
- 2.累加器专用传送指令
- IN(Input) 输入
- OUT(Output) 输出
- XLAT(Translate) 换码
- 这组指令只限于使用累加器AX或AL传送信息.
- .IN 输入指令
- 长格式为: 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 输出指令
- 长格式为: OUT PORT,AL(字节)
- OUT PORT,AX(字)
- 执行的操作: (PORT)<-(AL)(字节)
- (PORT+1,PORT)<-(AX)(字)
- 短格式为: OUT DX,AL(字节)
- OUT DX,AX(字)
- 执行的操作: ((DX))<-(AL)(字节)
- ((DX)+1,(DX))<-AX(字)
- 在IBM-PC机里,外部设备最多可有65536个I/O端口,端口(即外设的端口地址)为0000~FFFFH.其中前256个端口(0~FFH)可以直接在指令中指定,这就是长格式中的PORT,此时机器指令用二个字节表示,第二个字节就是端口号.所以用长格式时可以在指定中直接指定端口号,但只限于前256个端口.当端口号>=256时,只能使用短格式,此时,必须先把端口号放到DX寄存器中(端口号可以从0000到0FFFFH),然后再用IN或OUT指令来 传送信息.
- .XLAT 换码指令
- 格式为: XLAT OPR
- 或: XLAT
- 执行的操作:(AL)<-((BX)+(AL))
- 3.有效地址送寄存器指令
- LEA(Load effective address)有效地址送寄存器
- LDS(Load DS with Pointer)指针送寄存器和DS
- LES(Load ES with Pointer)指针送寄存器和ES
- .LEA 有效地址送寄存器
- 格式为: LEA REG,SRC
- 执行的操作:(REG)<-SRC
- 指令把源操作数的有效地址送到指定的寄存器中.
- .LDS 指针送寄存器和DS指令
- 格式为: LDS REG,SRC
- 执行的操作:(REG)<-(SRC)
- (DS)<-(SRC+2)
- 把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中.该指令常指定SI寄存器.
- .LES 指针送寄存器和ES指令
- 格式为: LES REG,SRC
- 执行的操作: (REG)<-(SRC)
- (ES)<-(SRC+2)
- 把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中.该指令常指定DI寄存器.
- 4.标志寄存器传送指令
- LAHF(Load AH with flags)标志送AH
- SAHF(store AH into flags)AH送标志寄存器
- PUSHF(push the flags) 标志进栈
- POPF(pop the flags) 标志出栈
- .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)
- 二、算术指令
- 1.加法指令
- ADD(add)加法
- ADC(add with carry)带进位加法
- INC(increment)加1
- .ADD 加法指令
- 格式: ADD DST,SRC
- 执行的操作:(DST)<-(SRC)+(DST)
- .ADC 带进位加法指令
- 格式: ADC DST,SRC
- 执行的操作:(DST)<-(SRC)+(DST)+CF
- .ADD 加1指令
- 格式: INC OPR
- 执行的操作:(OPR)<-(OPR)+1
- 2.减法指令
- SUB(subtract)减法
- SBB(subtract with borrow)带借位减法
- DEC(Decrement)减1
- NEG(Negate)求补
- CMP(Compare)比较
- .SUB 减法指令
- 格式: SUB DST,SRC
- 执行的操作:(DST)<-(DST)-(SRC)
- .SBB 带借位减法指令
- 格式: SBB DST,SRC
- 执行的操作:(DST)<-(DST)-(SRC)-CF
- .DEC 减1指令
- 格式: DEC OPR
- 执行的操作:(OPR)<-(OPR)-1
- .NEG 求补指令
- 格式: NEG OPR
- 执行的操作:(OPR)<- -(OPR)
- .CMP 比较指令
- 格式: CMP OPR1,OPR2
- 执行的操作:(OPR1)-(OPR2)
- 该指令与SUB指令一样执行减法操作,但不保存结果,只是根据结果设置条件标志西半球.
- 3.乘法指令
- MUL(Unsigned Multiple)无符号数乘法
- IMUL(Signed Multiple)带符号数乘法
- .MUL 无符号数乘法指令
- 格式: MUL SRC
- 执行的操作:
- 字节操作数:(AX)<-(AL)*(SRC)
- 字操作数:(DX,AX)<-(AX)*(SRC)
- .IMUL 带符号数乘法指令
- 格式: IMUL SRC
- 执行的操作:与MUL相同,但必须是带符号数,而MUL是无符号数.
- 4.除法指令
- DIV(Unsigned divide)无符号数除法
- IDIV(Signed divide)带符号数除法
- CBW(Convert byte to word)字节转换为字
- CWD(Contert word to double word)字转换为双字
- .DIV 无符号数除法指令
- 格式: DIV SRC
- 执行的操作:
- 字节操作:(AL)<-(AX)/(SRC)的商
- (AH)<-(AX)/(SRC)的余数
- 字操作: (AX)<-(DX,AX)/(SRC)的商
- (AX)<-(DX,AX)/(SRC)的余数
- .IDIV 带符号数除法指令
- 格式: DIV SRC
- 执行的操作:与DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号与被除数的符号相同.
- .CBW 字节转换为字指令
- 格式: CBW
- 执行的操作:AL的内容符号扩展到AH.即如果(AL)的最高有效位为0,则(AH)=00;如(AL)的最高有效位为1,则(AH)=0FFH
- .CWD 字转换为双字指令
- 格式: CWD
- 执行的操作:AX的内容符号扩展到DX.即如(AX)的最高有效位为0,则(DX)=0;否则(DX)=0FFFFH.
- 这两条指令都不影响条件码.
- 三、逻辑指令
- 1.逻辑运算指令
- AND(and) 逻辑与
- OR(or) 逻辑或
- NOT(not) 逻辑非
- XOR(exclusive or)异或
- TEST(test) 测试
- .AND 逻辑与指令
- 格式: AND DST,SRC
- 执行的操作:(DST)<-(DST)^(SRC)
- .OR 逻辑或指令
- 格式: OR DST,SRC
- 执行的操作:(DST)<-(DST)V(SRC)
- .NOT 逻辑非指令
- 格式: NOT OPR
- 执行的操作:(OPR)<-(OPR)
- .XOR 异或指令
- 格式: XOR DST,SRC
- 执行的操作:(DST)<-(DST)V(SRC)
- .TEST 测试指令
- 格式: TEST OPR1,OPR2
- 执行的操作:(DST)^(SRC)
- 两个操作数相与的结果不保存,只根据其特征置条件码
- 2.移位指令
- SHL(shift logical left) 逻辑左移
- SAL(shift arithmetic left) 算术左移
- SHR(shift logical right) 逻辑右移
- SAR(shift arithmetic right) 算术右移
- ROL(Rotate left) 循环左移
- ROR(Rotate right) 循环右移
- RCL(Rotate left through carry) 带进位循环左移
- RCR(Rotate right through carry) 带进位循环右移
- 格式: SHL OPR,CNT(其余的类似)
- 其中OPR可以是除立即数以外的任何寻址方式.移位次数由CNT决定,CNT可以是1或CL.
- 循环移位指令可以改变操作数中所有位的位置;移位指令则常常用来做乘以2除以2操作.其中算术移位指令适用于带符号数运算,SAL用来乘2,SAR用来除以2;而逻辑移位指令则用来无符号数运算,SHL用来乘2,SHR用来除以2.
- 四、串处理指令
- 1.与REP相配合工作的MOVS,STOS和LODS指令
- .REP重复串操作直到(CX)=0为上
- 格式: REP string primitive
- 其中String Primitive可为MOVS,LODS或STOS指令
- 执行的操作:
- 1)如(CX)=0则退出REP,否则往下执行.
- 2)(CX)<-(CX)-1
- 3)执行其中的串操作
- 4)重复1)~3)
- .MOVS 串传送指令
- 格式:可有三种
- MOVS DST,SRC
- MOVSB(字节)
- 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时用-
- 该指令不影响条件码.
- .CLD(Clear direction flag)该指令使DF=0,在执行串操作指令时可使地址自动增量;
- .STD(Set direction flag)该指令使DF=1,在执行串操作指令时可使地址自动减量.
- .STOS 存入串指令
- 格式: STOS DST
- STOSB(字节)
- STOSW(字)
- 执行的操作:
- 字节操作:((DI))<-(AL),(DI)<-(DI)+-1
- 字操作: ((DI))<-(AX),(DI)<-(DI)+-2
- 该指令把AL或AX的内容存入由(DI)指定的附加段的某单元中,并根据DF的值及数据类型修改DI的内容,当它与REP联用时,可把AL或AX的内容存入一个长度为(CX)的缓冲区中.
- .LODS 从串取指令
- 格式: LODS SRC
- LODSB
- LODSW
- 执行的操作:
- 字节操作:(AL)<-((SI)),(SI)<-(SI)+-1
- 字操作: (AX)<-((SI)),(SI)<-(SI)+-2
- 该指令把由(SI)指定的数据段中某单元的内容送到AL或AX中,并根据方向标志及数据类型修改SI的内容.指令允许使用段跨越前缀来指定非数据段的存储区.该指令也不影响条件码.
- 一般说来,该指令不和REP联用.有时缓冲区中的一串字符需要逐次取出来测试时,可使用本指令.
-
- 2.与REPE/REPZ和REPNZ/REPNE联合工作的CMPS和SCAS指令
- .REPE/REPZ 当相等/为零时重复串操作
- 格式: REPE(或REPZ) String Primitive
- 其中String Primitive可为CMPS或SCAS指令.
- 执行的操作:
- 1)如(CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行
- 2)(CX)<-(CX)-1
- 3)执行其后的串指令
- 4)重复1)~3)
- .REPNE/REPNZ 当不相等/不为零时重复串操作
- 格式: REPNE(或REPNZ) String Primitive
- 其中String Primitive可为CMPS或SCAS指令
- 执行的操作:
- 除退出条件(CX=0)或ZF=1外,其他操作与REPE完全相同.
- .CMPS 串比较指令
- 格式: CMP SRC,DST
- CMPSB
- CMPSW
- 执行的操作:
- 1)((SI))-((DI))
- 2)字节操作:(SI)<-(SI)+-1,(DI)<-(DI)+-1
- 字操作: (SI)<-(SI)+-2,(DI)<-(DI)+-2
- 指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果,只根据结果设置条件码,指令的其它特性和MOVS指令的规定相同.
- .SCAS 串扫描指令
- 格式: SCAS DST
- SCASB
- SCASW
- 执行的操作:
- 字节操作:(AL)-((DI)),(DI)<-(DI)+-1
- 字操作: (AL)-((DI)),(DI)<-(DI)+-2
- 该指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)进行比较,并不保存结果,只根据结果置条件码.指令的其他特性和MOVS的规定相同.
- 五、控制转移指令
- 1.无条件转移指令
- .JMP(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.条件转移指令
- 1)根据单个条件标志的设置情况转移
- .JZ(或JE)(Jump if zero,or equal) 结果为零(或相等)则转移
- 格式:JE(或JZ) OPR
- 测试条件:ZF=1
- .JNZ(或JNE)(Jump if not zero,or not equal) 结果不为零(或不相等)则转移
- 格式:JNZ(或JNE) OPR
- 测试条件:ZF=0
- .JS(Jump if sign) 结果为负则转移
- 格式: JS OPR
- 测试条件:SF=1
- .JNS(Jump if not sign) 结果为正则转移
- 格式:JNS OPR
- 测试条件:SF=0
- .JO(Jump if overflow) 溢出则转移
- 格式: JO OPR
- 测试条件:OF=1
- .JNO(Jump if not overflow) 不溢出则转移
- 格式: JNO OPR
- 测试条件:OF=0
- .JP(或JPE)(Jump if parity,or parity even) 奇偶位为1则转移
- 格式: JP OPR
- 测试条件:PF=1
- .JNP(或JPO)(Jump if not parity,or parity odd) 奇偶位为0则转移
- 格式: JNP(或JPO) OPR
- 测试条件:PF=0
- .JB(或JNAE,JC)(Jump if below,or not above or equal,or carry) 低于,或者不高于或等于,或进位位为1则转移
- 格式:JB(或JNAE,JC) OPR
- 测试条件:CF=1
- .JNB(或JAE,JNC)(Jump if not below,or above or equal,or not carry) 不低于,或者高于或者等于,或进位位为0则转移
- 格式:JNB(或JAE,JNC) OPR
- 测试条件:CF=0
- 2)比较两个无符号数,并根据比较的结果转移
- .JB(或JNAE,JC)
- 格式:同上
- .JNB(或JAE,JNC)
- 格式:同上
- .JBE(或JNA)(Jump if below or equal,or not above) 低于或等于,或不高于则转移
- 格式:JBE(或JNA) OPR
- 测试条件:CFVZF=1
- .JNBE(或JA)(Jump if not below or equal,or above) 不低于或等于,或者高于则转移
- 格式:JNBE(或JA) OPR
- 测试条件:CFVZF=0
- 3)比较两个带符号数,并根据比较的结果转移
- .JL(或LNGE)(Jump if less,or not greater or equal) 小于,或者不大于或者等于则转移
- 格式:JL(或JNGE) OPR
- 测试条件:SFVOF=1
- .JNL(或JGE)(Jump if not less,or greater or equal)不小于,或者大于或者等于则转移
- 格式:JNL(或JGE) OPR
- 测试条件:SFVOF=0
- .JLE(或JNG)(Jump if less or equal,or not greater) 小于或等于,或者不大于则转移
- 格式:JLE(或JNG) OPR
- 测试条件:(SFVOF)VZF=1
- .JNLE(或JG)(Jump if not less or equal,or greater) 不小于或等于,或者大于则转移
- 格式:JNLE(或JG) OPR
- 测试条件:(SFVOF)VZF=0
- 4)测试CX的值为0则转移指令
- .JCXZ(Jump if CX register is zero) CX寄存器的内容为零则转移
- 格式:JCXZ OPR
- 测试条件:(CX)=0
- 注:条件转移全为8位短跳!
- 3.循环指令
- .LOOP 循环指令
- 格式: LOOP OPR
- 测试条件:(CX)<>0
- .LOOPZ/LOOPE 当为零或相等时循环指令
- 格式: LOOPZ(或LOOPE) OPR
- 测试条件:(CX)<>0且ZF=1
- .LOOPNZ/LOOPNE 当不为零或不相等时循环指令
- 格式: LOOPNZ(或LOOPNE) OPR
- 测试条件:(CX)<>0且ZF=0
- 这三条指令的步骤是:
- 1)(CX)<-(CX)-1
- 2)检查是否满足测试条件,如满足则(IP)<-(IP)+D8的符号扩充.
- 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<-0
- .CMC进位位求反指令(Complement carry)CF<-CF
- .STC进位位置1指令(Set carry)CF<-1
- .CLD方向标志置0指令(Clear direction)DF<-0
- .STD方向标志置1指令(Set direction)DF<-1
- .CLI中断标志置0指令(Clear interrupt)IF<-0
- .STI中断标志置1指令(Set interrupt)IF<-0
- 2.其他处理机控制指令
- NOP(No Opreation) 无操作
- HLT(Halt) 停机
- WAIT(Wait) 等待
- ESC(Escape) 换码
- LOCK(Lock) 封锁
- 这些指令可以控制处理机状态.这们都不影响条件码.
- .NOP 无操作指令
- 该指令不执行任何操作,其机器码占有一个字节,在调试程序时往往用这条指令占有一定的存储单元,以便在正式运行时用其他指令取代.
- .HLT停机指令
- 该指令可使机器暂停工作,使处理机处于停机状态以便等待一次外部中断到来,中断结束后可继续执行下面的程序.
- .WAIT等待指令
- 该指令使处理机处于空转状态,它也可以用来等待外部中断的发生,但中断结束后仍返回WAIT指令继续德行.
- .ESC换码指令
- 格式ESC mem
- 其中mem指出一个存储单元,ESC指令把该存储单元的内容送到数据总线去.当然ESC指令不允许使用立即数和寄存器寻址方式.这条指令在使用协处理机(Coprocessor)执行某些操作时,可从存储器指得指令或操作数.协处理机(如8087)则是为了提高速度而可以选配的硬件.
- .LOCK封锁指令
- 该指令是一种前缀,它可与其他指令联合,用来维持总线的锁存信号直到与其联合的指令执行完为止.当CPU与其他处理机协同工作时,该指令可避免破坏有用信息.
复制代码
[ 本帖最后由 大大狗 于 2007-1-23 22:13 编辑 ] |
|