770 likes | 916 Views
指 令 系 统. 第 4 章. 4.2.5 字符串操作指令 4.2.6 转移指令 4.2.7 处理器控制指令 4.2.8 输入输出指令 4.2.9 中断指令 4.3 80X86 的增强型指令 4.3.1 80286 增强和新增指令 4.3.2 80386 增强和新增指令 4.3.3 80486 新增指令. 4.1 寻址方式 4.1.1 操作数类型 4.1.2 寻址方式 4.2 8086 指令系统 4.2.1 数据传送指令 4.2.2 算术运算指令 4.2.3 逻辑运算指令
E N D
指 令 系 统 第 4 章 4.2.5 字符串操作指令 4.2.6 转移指令 4.2.7 处理器控制指令 4.2.8 输入输出指令 4.2.9 中断指令 4.3 80X86的增强型指令 4.3.1 80286增强和新增指令 4.3.2 80386增强和新增指令 4.3.3 80486新增指令 4.1 寻址方式 4.1.1 操作数类型 4.1.2 寻址方式 4.2 8086指令系统 4.2.1 数据传送指令 4.2.2 算术运算指令 4.2.3 逻辑运算指令 4.2.4 移位指令
寻址方式 4.1 4.1.1 操作数类型 ●操作数包含在指令中,即指令中的操作数部分直接给出操作数本身,操作数随指令一起从存储器中取出来后就可以参加运算,称为立即数。 立即数 操作数 ●操作数在CPU的某个寄存器中,由指令给出寄存器的编码来指出操作数在哪个寄存器中,称为寄存器操作数。 寄存器操作数 ●操作数在内存数据区中,指令中的操作数部分给出此操作数地址的计算方法,称为存储器操作数。 存储器操作数
立即寻址 4.1.2 寻址方式 1. 立即寻址的操作数是一个立即数,它直接包含在指令中。立即数可为8位或16位数,它们放在指令代码的操作码后。 立即寻址主要用于给存储器或寄存器赋初值。 【例4-1】 MOV AX,080AH,其寻址如图4-1所示。 … 操作码 立即数低字节 0AH 08H 立即数高字节 高址 … AH AL AX 图4-1 立即寻址示意图
寄存器寻址 2. 操作数在内部寄存器中。对16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP或BP,而对8位操作数,寄存器可以是AH、AL、BH、BL、CH、CL、DH、DL。 【例4-2】 MOV AX,BX 执行过程如图4-2所示。 AX BX 图 4-2 寄存器寻址示意图
直接寻址 3. 操作数的有效地址(EA)直接包含在指令中,它与操作码一起存放在代码段中。操作数存放的物理地址=DS×16 + 16位地址偏移量。 【例4-3】 MOV AX,[22A0H] 执行过程如图4-3所示。 DS 3 0 0 0 … +) 2 2 A 0 操作码 代码段 偏移量A0H 3 2 2 A 0 H 偏移量22H … 322A0H 数据段 32H 322A1H 48H … AX 48 32 图4-3 直接寻址方式示意图
寄存器间接寻址 4. 寄存器间接寻址情况一 若以SI、DI、BX间接寻址,操作数通常在现行数据段中,即DS中的值左移四位加上SI、DI或BX中的有效地址即为操作数的物理地址。 【例4-5】 MOV AX,[SI] 执行过程如图4-4所示。 DS 2 0 0 0 … +)SI 1 0 0 0 操作码 代码段 2 1 0 0 0 H … 21000H 数据段 A0H 21001H 50H … AX 50 A0 图4-4 寄存器间接寻址方式示意图
寄存器间接寻址 寄存器间接寻址情况二 4. 若以BP间接寻址,则操作数在堆栈段中,即操作数的物理地址位堆栈段寄存器SS中的值左移四位与BP相加。 【例3-6】 MOV AX,[BP] 执行过程如图3-5所示。 SS 3 0 0 0 … +)BP 2 0 0 0 3 2 0 0 0 H 操作码 代码段 … 32000H 数据段 B0H 32001H 62H … AX 62 B0 图3-5 以BP间接寻址方式示意图
基址寻址 5. BX 8位偏移量 + EA= BP 16位偏移量 【例4-7】 MOV AX,COUNT[BP] 执行过程如图4-6所示。 SS 1 0 0 0 … +) BP 2 0 0 0 操作码 +)COUNT 2 1 0 0 代码段 偏移量00 偏移量20 1 4 1 0 0 H … 14100H 30H 数据段 14101H 20H … AX 20 30 图4-6 基址寻址方式示意图
变址寻址 6. SI 8位偏移量 + EA= DI 16位偏移量 【例4-8】 MOV AX,COUNT[SI] 执行过程如图4-7所示。 DS 3 0 0 0 … +) SI 2 0 0 0 操作码 +)COUNT 3 0 0 0 代码段 偏移量00 偏移量30 3 5 0 0 0 H … 35000H 30H 数据段 35001H 20H … 20 30 AX 图4-7 变址寻址方式示意图
基址加变址寻址 7. BX SI 8位偏移量 EA= + + BP DI 16位偏移量 【例4-9】 MOV AX,[BX+SI+250H] 执行过程如图4-8所示。 DS 3 0 0 0 … +) BX 1 0 0 0 操作码 操作码 +) SI 2 0 0 0 代码段 +) 0 2 5 0 偏移量50 偏移量02 3 3 2 5 0 H … 33250H 30H 33251H 数据段 20H AX … 20 30 图4-8 基址加变址寻址方式示意图
数据串寻址 8. ●数据串寻址用于数据串操作指令。 【例4-10】 MOVSB 执行后: [DI] ←[SI] SI←SI±1 DI←DI±1
I/O端口寻址 9. 由指令直接给出输入输出设备的端口地址。规定端口地址为8位,能寻址256个端口。 直接端口寻址 I/O 端口寻址 由寄存器DX给出输入输出设备的端口地址。由于DX是16位,因此能寻址64K个端口。 间接端口寻址 【例4-11】 IN AL,20H ;将地址为20H的外设的内容读入AL中 OUT DX,AL ;将AL中内容输出给以DX的内容为地址的外设
隐含寻址 10. ●这种寻址方式中,操作数是隐含的。指令中没有明显给出操作数。 【例4-12】 AAA 即对AL中的内容进行十进制加法调整,并把调整后的结果放入AH和AL中。这条指令的隐含操作数是AH和AL。
8086指令系统 4.2 数据传送指令 4.2..1 数据传送指令
通用数据传送指令 1. MOV指令 压栈指令 堆栈操作 指令 通用数据传 送指令 出栈指令 数据交换指令 换码指令
MOV指令 段寄存器 CS DS ES SS 通用寄存器 AX BX CX DX SI DI BX BP 立即数 存储器 指令格式:MOV OP目,OP源 指令功能:将源操作数传送到目的操作数中。 OP目表示目的操作数,可以是寄存器、存储器。 OP源表示源操作数,可以是寄存器、存储器和立即数。 图4-9 数据传送方向示意图
堆栈操作指令 压栈指令 指令格式:PUSH OP 指令功能:将寄存器或存储器单元的内容送入堆栈 OP为16位的寄存器或存储器操作数。 操作过程:1)SP←SP-1 ;[SP]←OPH(操作数高字节) 2)SP←SP-1 ;[SP]←OPL(操作数低字节)
出栈指令 堆栈操作指令 指令格式:POP OP 指令功能:将SP所指向的堆栈栈顶的一个字弹到寄存器 或存储单元中。 OP为16位操作,可以是寄存器或存储器操作数。 操作过程:1)OPL←[SP] ;SP←SP+1 2)OPH←[SP] ;SP←SP+1
数据交换指令 指令格式:XCHG OP1,OP2 指令功能:实现OP1和OP2内容的相互交换。 操作数为通用寄存器或存储器。 【例4-19】 XCHG AL,BL ;AL与BL进行字节互换 XCHG BX,CX ;BX与CX进行字互换 注意 ●交换可在通用寄存器之间、通用寄存器和存储器之间进行。段寄存器不能作为本指令的操作数,而且两个存储单元之间不能直接交换数据。
换码指令 指令格式:XLAT 指令功能:将BX的内容和AL的内容相加作为有效地址EA, 在一个表格中找出此单元中的内容并传送至AL中。 ●使用此指令时,应首先在数据段中预置一个表格。该表格的最大长度不能超过256字节。表的起始地址的偏移量应事先装入BX寄存器,AL中存放查找对象在表中地址与表的起始地址相差的字节数。
目标地址传送指令 2. (1)LEA指令 指令格式:LEA OP目,OP源 指令功能:将源操作数的有效地址EA送到目的操作数。 【例4-21】LEA BX,[BP+SI] ;BP+SI→BX LEA DI,TABLE ;取TABLE的有效地址送入DI 注意 ●本指令处理的是变量的地址(偏移量),不是变量的值。它等效于传送有效地址的MOV指令,但MOV指令必须在变量名前使用OFFSET操作符。
LDS指令 2.目标地址传送指令 (2) 指令格式: ●LDS OP目,OP源 指令功能: ●把4个字节地址指针(包括一个段地址和一个 偏移地址)从源操作数指定的4个存储单元取出, 低地址的两字节送目的操作数,高地址的两字节送 DS段寄存器。 【例4-23】 LDS DI,[2130H] ;将2130H和2131H单元的内容送DI 将2132H和2133H单元的内容送DS
LES指令 (3) 指令格式: ●LES OP目,OP源 指令功能: ●本指令与LDS指令的操作基本相同,所不同 的是将源操作数4个字节中高地址的两字节 传送到ES段寄存器而不是DS段寄存器。
标志寄存器传送指令 3. ●读标志指令 指令格式:LAHF 指令功能:将标志寄存器低8位→AH。 ●设置标志指令 指令格式:SAHF 指令功能:将AH →标志寄存器低8位。 ● PUSH指令 指令格式:PUSHF 指令功能:将16位标志寄存器入栈,同时修改栈指针。 ● POPF指令 指令格式:POPF 指令功能:将栈顶的一个字送标志寄存器,同时修改栈指针SP。
加法指令 4.2..2 算术运算指令 1. (1)不带进位的加法指令 指令格式: ADD OP目,OP源 指令功能: ●将源操作数和目的操作数相加,结果保留在目的 操作数中,并根据结果设置标志。 (2)带进位的加法指令 指令格式: ADC OP目,OP源 指令功能: ●将源操作数、目的操作数及CF的值相加,结果保 留在目的操作数中,并根据结果设置标志。 (3)加1指令 指令格式: INC OP 指令功能: ●将操作数加1,再送回该操作数。这条指令一般用于 循环程序的指针修改。操作数可以是8位/16位通过寄 存器或存储器,不能为立即数。
减法指令 2. (1)不带借位的减法指令 指令格式: SUB OP目,OP源 指令功能: ●将目的操作数减去源操作数,结果送回到目的 操作数中,并根据结果设置标志。 (2)带借位的减法指令 指令格式: SBB OP目,OP源 指令功能: ●将目的操作数减去源操作数再减去借位标志CF的 现行值,结果送回到目的操作数中,并根据结果 设置标志。 (3)减1指令 指令格式: DEC OP 指令功能: ●将操作数的值减1后送回源操作数中,根据结果置 标志位。操作数可以是8位/16位通过寄存器和存储 器操作数,不能为立即数。
减法指令 2. (4)取补指令 指令格式: NEG OP 指令功能: ●将操作数取补后送回原操作数。操作数可以 是8位/16位通用寄存器或存储器操作数,不能 为立即数。 (5)比较指令 指令格式: CMP OP目,OP源 指令功能: ●将目标操作数与源操作数相减,不回送结果, 只根据结果置标志位。
乘法指令 3. (1)无符号数乘法指令 指令格式:MUL OP 指令功能: ●完成两个不带符号的8位/16位二进制数的乘法运算。 ●指令中给出的操作数是乘数,它可以是8位/16位通用寄存器及存储器;另一操作数被乘数隐含在AL/AX中,乘积存放在AH:AL或DX:AX中,如图3-13所示。 AL AX 8位操作数 16位操作数 × × AH AL DX AX 图4-13 乘法运算示意图
乘法指令 3. (2)带符号数乘法指令 指令格式: IMUL OP 指令功能: ●完成两个带符号的8位/16位二进制数的乘法运算。有关IMUL的其它约定与MUL相同。 注意 对于字节乘法,当AH为AL的符号扩展时,CF=OF=0, 否则CF=OF=1;对于字乘法,当DX为AX的符号扩展时, CF=OF=0,否则CF=OF=1。
除法指令 4. (1)无符号数除法指令 指令格式:DIV OP 指令功能: ●完成两个不带符号的二进制数的除法运算。 指令中给出的操作数是除数,它可以是8位/16位通 用寄存器及存储器;被除数隐含在AX(字节除)或 DX、AX(字除法)中。 操作过程: ●字节除法 AX/ OP→ AL AX MOD OP→AH ●字除法 (DX、AX)/OP →AX (DX、AX)MOD OP →DX
除法指令 4. (2)带符号数除法指令 指令格式: IDIV OP 指令功能: ●完成两个带符号的二进制数的除法运算。商 的符号根据代数规则确定,余数的符号与被 除数相同。操作数的规定同DIV指令。 注意 ●本指令在完成字节相除时最大的商为+127(7FH),最小的商为-128(80H);在完成字相除时最大的商为+32767(7FFFH),最小的商为-32768(8000H)。若商超出此范围,则将产生一个类型0的中断。
除法指令 4. (3)符号扩展指令 (3)符号扩展指令 1)字节扩展指令 指令格式: CBW 指令功能: ●将AL中的单字节数的符号扩展到AH中。若AL <80H,则0→AH;若AL≥80H,则OFFH →AH。 2)字扩展指令 指令格式:CWD 指令功能: ●将AX中的数的符号扩展到DX中。若AX<8000H, 则0→DX;若AX≥8000H,则OFFFFH →DX。 注意 这两条符号扩展指令常常放在IDIV指令之前,对标志位没有影响。
非组合BCD码的加法调整指令 5.十进制运算调整指令 (1) 指令格式: AAA 指令功能: 对AL中的由两个非组合BCD码相加所得的结果 进行调整,并将调整后的结果存于AX中。 操作过程: 如果AL的低4位表示的数大于9或者AF=1,则 将AL加6,AH加1,将AF和CF置1,清除AL的 高四位;否则清除AL的高4位以及AF和CF标志。
组合BCD码的加法调整指令 5. 十进制运算调整指令 (2) 指令格式:DAA 指令功能:对AL中的由两个组合BCD码相加所得的结果 进行调整,并将调整后的结果存于AL中。 操作过程:如果AL的低4位大于9或者AF=1,则AL+6→AL, 并置AF=1;如果AL的高4位大于9或者CF=1, 则AL+60H→AL,并置CF=1。 注意 以上这两条指令使用时必须紧跟在ADD或ADC指令之后。而且,这两条指令只能对AL中的结果进行调整,因此对多字节的十进制数运算,只能从低字节开始逐个字节的进行运算和调整。
非组合BCD码的减法调整指令 5.十进制运算调整指令 (3) 指令格式:AAS 指令功能:对AL中的由两个非组合BCD码相减所得的结果 进行调整,并将调整后的结果存于AL中。 操作过程:调整方法与AAA类似,不同的只是当AL的低 4位表示的数大于9或者AF=1时,将AL-6→AL, AH-1→AH,并将AF和CF置1,清除AL的高四位。
组合BCD码的减法调整指令 5.十进制运算调整指令 (4) 指令格式:DAS 指令功能:对AL中的由两个组合BCD码相减所得的结果 进行调整,并将调整后的结果存于AL中。 操作过程:调整方法与DAA类似,不同的只是当AL的低4位 大于9或者AF=1,则AL-6→AL,并置AF=1;而 当AL的高4位大于9或者CF=1时,则AL-60H→AL, 并置CF=1。 注意 使用AAS、DAS指令必须紧跟在SUB或SBB指令之后。
非组合BCD码的乘法调整指令 5.十进制运算调整指令 (5) 指令格式:AAM 指令功能:对AX中的由两个非组合BCD码相乘所得的结果 进行调整,并将调整后的结果存于AX中。 操作过程:将AL中的内容除以10,并将除得的商和余数分 别送AH和AL。 注意 本指令必须紧跟在MUL指令之后使用。
非组合BCD码的除法调整指令 5.十进制运算调整指令 (6) 指令格式:AAD 指令功能:把AX中的由两个非组合BCD码进行调整,然后 可按DIV指令实现两个非组合BCD码的除法运算。 操作过程:将AH中的内容乘以10与AL中的内容相加,结果 送AL中,再将AH清零。 注意 本指令必须在DIV运算前使用。
逻辑运算指令 4.2..3 1.逻辑与运算指令 指令格式:AND OP目,OP源 指令功能:对两个操作数按位进行与操作,结果回送到目标 操作数。 2.逻辑或运算指令 指令格式:OR OP目,OP源 指令功能:对两个操作数进行逻辑或运算,结果回送到目标 操作数。
逻辑异或运算指令 3. 指令格式:XOR OP目,OP源 指令功能:对两个操作数进行逻辑异或运算,结果回送到目标 操作数。 4.逻辑非运算指令 指令格式:NOT OP 指令功能:对操作数逐位取反后回送到原处。 5.测试指令 指令格式:TEST OP目,OP源 指令功能:将目标操作数与源操作数进行逻辑与运算,不回送 结果,只根据结果置标志位。
移位指令 4.2..4 1. 一般移位指令 (1)逻辑左移指令 指令格式:SHL OP目,计数值 指令功能:将操作数的内容左移,每移一次,最低位补0, 最高位→CF。 (2)逻辑右移指令 指令格式:SHR OP目,计数值 指令功能:将操作数的内容右移,每移一次,最高位补0, 最低位→CF。
一般移位指令 1. (3)算术左移指令 指令格式:SAL OP目,计数值 指令功能:同SHL(逻辑左移指令) (4)算术右移指令 指令格式:SAR OP目,计数值 指令功能:将操作数的内容右移,每移一次,最高位的值 不变,最低位CF→。
循环移位指令 2. (1)循环左移指令 指令格式:ROL OP目,计数值 指令功能:将操作数的内容循环左移,每移一次,最高位移 入CF,同时移入最低位。 (2)循环右移指令 指令格式:ROR OP目,计数值 指令功能:将操作数的内容循环右移,每移一次,最低位移 入CF,同时移入最高位。
循环移位指令 2. (3)带进位的循环左移指令 指令格式:RCL OP目,计数值 指令功能:包括进位位在内,一起循环左移,每移一次,最 高位移入CF,原CF移入最低位。 (4)带进位的循环右移指令 指令格式:RCR OP目,计数值 指令功能:包括进位位在内,一起循环右移,每移一次,最 低位移入CF,原CF移入最高位。
字符串操作指令 4.2..5 串是存储区中的一个数据序列。串操作是指对串中的每个字或字节数据做相同的操作。串操作分为串传送、串搜索、串比较及串存取等。 所有基本的串操作有如下共同点: (1)用寄存器SI寻址源操作数,且假定源操作数是在现行的数据段区域中,用寄存器DI寻址目标操作数,且假定目标操作数是在现行的附加段区域中。 (2)每执行一次串操作后自动修改指针SI、DI。若方向标志DF=0,则每次操作后SI和DI自动加1或加2;若DF=1,则每次操作后SI和DI自动减1或减2。 (3)串长存放在CX中。
字符串传送指令 1. 指令格式:MOVS OP目,OP源 MOVSB MOVSW 指令功能:从源串中取一个字节/字,传送到目标串中,并 自动修改SI/DI,使之指向下一元素。字符串传 送指令前可以加重复前缀REP,表示每传送完 一个元素使CX减1,直到CX=0。 注意 使用MOVS指令时,必须说明操作数的数据类型,这样 才能确定是字节传送,还是字传送。
字符串比较指令 2. 指令格式:CMPS OP目,OP源 CMPSB CMPSW 指令功能:取源串一个字节/字,与目标串的一个字节/字相减, 不回送结果,根据结果置标志位,并修改串地址指 针,使之指向下一个字节/字单元。
字符串搜索指令 3. 指令格式:SCAS OP SCASB SCASW 指令功能:将AL/AX寄存器中的关键字,减去由DI所指向的 目标串中的元素,不回送结果,根据结果置标志 位,并修改DI寄存器内容,指向下一元素。 注意 执行这类指令前,必须先将要查找的关键字送AL/AX中, 串的首偏移地址送DI,串长送CX。
取字符串和存字符串指令 4. (1)取字符串指令 指令格式:LODS OP LODSB LODSW 指令功能:将源串中SI所指向的存储单元中的一个字节/字 取到AL/AX寄存器中,并修改SI的内容,指向下 一字节/字单元。
存字符串指令 4.取字符串和存字符串指令 (2) 指令格式:STOS OP STOSB STOSW 指令功能:将AL/AX中的一个字节/字,存到由DI所指向的 目标串的存储单元,并修改DI的内容,指向下一 个字节/字的存放单元。 注意 LODS指令一般不使用重复前缀,STOS指令常使用REP前缀。