1.63k likes | 1.82k Views
第 一节 8086 指令系统 1. Intel 8086 的寻址方式 重点: 立即寻址、直接寻址、寄存器寻址、寄存器间接寻 址 、变址寻址、基址加变址寻址 , 有效地址的计 算 掌握数据传送类指令的使用方法。. 指令的一般格式. 1 、指令格式. 指令:计算机提供给用户的硬件命令。 指令系统 ( 集 ) :指令的集合 。. 操作码:指计算机所要执行的操作,即指出操作类型,是一种助记符。 操作数:指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其它有关操作数的信息。
E N D
第 一节 8086指令系统1 • Intel 8086的寻址方式 • 重点: 立即寻址、直接寻址、寄存器寻址、寄存器间接寻 址 、变址寻址、基址加变址寻址 ,有效地址的计 算 • 掌握数据传送类指令的使用方法。
指令的一般格式 1、指令格式 • 指令:计算机提供给用户的硬件命令。 • 指令系统(集):指令的集合。
操作码:指计算机所要执行的操作,即指出操作类型,是一种助记符。操作码:指计算机所要执行的操作,即指出操作类型,是一种助记符。 • 操作数:指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其它有关操作数的信息。 • 寻址方式:就是指令中用于说明操作数所在地址的方法,或者说是寻找操作数有效地址的方法。
2、操作数寻址方式 • 立即数寻址 • 寄存器寻址 • 直接寻址 • 寄存器间接寻址 • 寄存器相对寻址 • 基址变址寻址 • 相对基址变址寻址
说明: • 立即数可以是8位或16位的。如果是16位立即数,则高8位放在高地址,低8位放在低地址。 • 使用场合:由于立即数用来表示常数,所以立即数寻址方式经常用于给寄存器赋初值。 • 它只能用于源操作数字段,不能用于目的操作数字段。 • 由于立即数可以从指令中直接取得,因此CPU不需要另外占用总线周期去取操作数,故立即数寻址方式显著的特点就是速度快。
(2)寄存器寻址方式 • 源和目的操作数都在寄存器中 • 例:MOV DS,AX • MOV CL,AL • 对于16位操作数,可以用字寄存器,比如:AX、BX、CX、DX、SI、DI、SP、BP以及段寄存器; • 对于8位操作数,可以用字节寄存器,比如:AH、 • BH、CH、DH、AL、BL、CL、DL; • 这种寻址方式因为操作数在寄存器中,不需要访问存储器,所以运算速度较高。
(3)直接寻址 在指令中直接给出有效地址,它可能是一个数值地址,也可能是符号地址(变量名)。 操作数一般存放在数据段中,因此计算物理地址就应该把DS的值作为段基址即:物理地址=16×(DS)+EA MOV AL,[2000H]; [DS*10H+2000H]送 AL; MOV AX,[2000H]; [DS*10H+2000H]送AL, DS*10H+2000H+1]送AH; MOV AL,ES:[2000H];这里ES是段超越前缀,所以源操作数是在ES*10H+2000H的内存单元中。 MOV [3000H],AL;目的操作数采用直接寻址,将AL送[DS*10H+3000H]的内存单元。
(4)寄存器间接寻址方式 操作数的偏移地址(有效地址EA)放在寄存器中只有SI、DI、BX和BP可作间址寄存器 例: MOV AX, [BX] MOV CL, CS:[DI] • 若选择BX或SI或DI寄存器提供的间址,则操作数一般在数据段区域中,用DS提供段基址。 • 若选择BP寄存器提供的间址,则操作数在堆栈段区域中,用SS提供段基址。 • 用SI、DI、BX、BP作为间接寻址时允许使用段跨越前缀,从而实现对其它段中数据的存取。 • 用途:这种寻址方法适用于数组、字符串、表格的处理。
(6)基址+变址寻址 例:MOV AX,[BX][SI] (DS)=3200H,(BX)=0456H (SI)=1094H EA=0456H+1094H=14EAH 物理地址=32000H+14EAH=334EAH 若选择BP寄存器提供基地址,则操作数在堆栈段区域中,用SS提供段基址
8086/8088 指令系统 8086/8088的指令系统可以分为以下六个功能组。 1、数据传送(Data Transfer) 2、算术运算(Arithmetic) 3、逻辑运算(Logic) 4、串操作(String menipulation) 5、程序控制(Program Control) 6、处理器控制(Processor Control)
一、数据传送指令 主要MOV,XCHG、堆栈和地址传送指令。 1、数据传送MOV指令 一般格式:MOV OPRD1,OPRD2 MOV 是操作码,OPRD1目的操作数、OPRD2源操作数。 功能:完成数据传送 具体来说,一条数据传送指令能实现: ⑴CPU内部寄存器之间数据的任意传送(除了代码段寄存器CS和指令指针IP以外)。 • MOV AL,BL;字节传送 • MOV CX,BX;字传送 • MOV DS,BX
⑵立即数传送至CPU内部的通用寄存器组(即AX、 BX、CX、DX、BP、SP、SI、DI ), MOV CL,4 MOV AX,03FFH MOV SI,057BH ⑶CPU内部寄存器(除了CS和IP以外)与存储器(所有寻址方式)之间的数据传送。 MOV AL,BUFFER MOV AX,[SI] MOV [DI],CX MOV SI,BLOCK[BP] MOV DS,DATA[SI+BX] MOV DEST[BP+DI],ES
⑷ 能实现用立即数给存储单元赋值 • 例:MOV [2000H],25H • 注意: • ①存储器传送指令中,不允许对CS和IP进行操作; • ②两个操作数中,除立即寻址之外必须有一个为寄存器寻址方式,即两个存储器操作数之间不允许直接进行信息传送;如需要把存储单元AREA1的内容送至同一段内AREA2中去,传送过程如下: • MOV AL,AREA1 • MOV AREA2,AL • ③两个段寄存器之间不能直接传送信息,也不允许用立即寻址方式为段寄存器赋初值; • 如:MOVAX,0;MOVDS,AX • ④目的操作数,不能用立即寻址方式。
2、堆栈指令 入栈(PUSH)、出栈(POP) 仅能进行字传送。 • ⑴ 入栈指令PUSH • 一般格式:PUSH OPRD • 例如:PUSH BX • 执行过程为: • SP=SP-1,[SP]=BH; • SP=SP-1,[SP]=BL
⑵ 出栈指令POP • 一般格式:POP OPRD • 功能:将数据弹出堆栈 • 对指令执行的要求同入栈指令。 • 例如:POP AX • POP [BX] • POP DS
4、累加器专用传送指令 • ⑴ IN 指令 • 一般格式:IN AL,n ; B AL←[n] • IN AX,n ; W AX←[n+1][n] • IN AL,DX ; B AL←[DX] • IN AX,DX ; W AX←[DX+1][DX] • 功能:从I/O端口输入数据至AL或AX。 • 若端口地址超过255时,须用DX作端口寻址,最多可寻找64K个端口。 • ⑵ OUT 指令 • 一般格式:OUT n,AL ; B AL→[n] • OUT n,AX ; W AX→[n+1][n] • OUT DX,AL ; B AL→[DX] • OUT DX,AX ; W AX→[DX+1][DX] • 功能:将AL或AX的内容输出至I/O端口。 • 该指令将AL或AX中的内容传送到一个输出端口。
⑶ XLAT指令 • 一般格式:XLAT ; ( AL)=(DS)×16+((BX)+(AL)) • 功能:完成一个字节的查表转换。 • 寄存器AL的内容作为一个表的下标;表的基地址放在BX中;转换后的结果存放在AL中. • 例如:MOV BX,OFFSET TABLE • IN AL,1 • XLAT ;查表 • OUT 1,AL ;(AL)= AAH • 本指令可用在数制转换、函数表查表、代码转换等场合。
5、地址传送指令 • ⑴ LEA (Load Effective Address) • 一般格式: LEA OPRD1,OPRD2 • 功能:把源操作数OPRD2的地址偏移量传送至目的操作数OPRD1。 • 要求:①源操作数必须是一个内存操作数②目的操作数必须是一个16位的通用寄存器。例:LEA BX,BUFR;把变量BUFR的地址偏移量送BX
⑵ LDS (Load pointer into DS) • 一般格式: LDS OPRD1,OPRD2 • 功能:完成地址指针的传送。 • 将段地址送DS,偏移量部分 • 送入一个16位的指针寄存器 • 或变址寄存器。 • 要求:源操作数是一个内存 • 操作数,目的操作数是一个通 • 用寄存器/变址寄存器。 • 例如:LDS SI,[BX] ;把BX所指的32位地址指针的段地址送DS,偏移量送SI。
⑶ LES (Load pointer into ES) • 一般格式: LES OPRD1,OPRD2 • 这条指令除将地址指针的段地址部分送入ES外,与LDS类似 • 例: LES DI,[BX+COUNT]
6、标志寄存器传送 • ⑴ LAHF (LOAD AH WITH FLAG) • 将标志寄存器中的SF、ZF、AF、PF和CF(即低8位)传送至AH寄存器的指定位 • ⑵ SAHF (STORE AH WITH FLAG) • 将寄存器AH的指定位,送至标志寄存器的SF、ZF、AF、PF和CF位 • ⑶ PUSHF (PUSH FLAG) • 将标志寄存器压入堆栈,不影响标志位。 • ⑷ POPF (POP FLAG) • 将栈顶的一个字,送标志寄存器,影响标志位。
习题: • 设有关寄存器及存储单元的内容如下: • (DS)=2000H,(BX)=0100H,(AX)=1200H,(SI)=0002H,(20100H)=12H,(20101H)=34H,(20102H)=56H,(20103)=78H,(21200)=2AH,(21201H)=4CH,(21202H)=0B7H,(21203H)=65H。 • 说明下列各条指令的寻址方式,单独执行后相关寄存器或存储单元的内容 • (1)MOV AX,1800H • (2)MOV AX,BX • (3)MOV BX,[1200H] • (4)MOV DX,1100[BX] • (5)MOV [BX][SI],AL • (6)MOV AX,1100[BX][SI]
第二节 8086/8088 指令系统2 重点:了解指令的功能,掌握算术运算、逻辑运算和移位指令的功能和应用 二、算术运算指令
1、加法指令 (Addition) • ⑴ADD OPRD1,OPRD2 • 功能:OPRD1←OPRD1+OPRD2 • 例如: • ADD AL,30;累加器与立即数相加 • ADD BX,[3000H];通用寄存器与存储单元内容相加 • ADD DI,CX;通用寄存器之间 • ADD DX,DATA[BX+SI];通用寄存器与存储单元内容相加 • ADD BETA[SI],DX;存储器操作数与寄存器相加 • 这些指令对标志位CF、OF、PF、SF、ZF和AF有影响。
⑵ADC OPRD1,OPRD2;带进位的加法 • 功能:OPRD1←OPRD1+OPRD2 +CF • ADC指令主要用于多字节运算中。若有两个四字节的数,分别放在自FIRST和SECOND开始的存储区中,每个数占四个存储单元,低字节在低地址,以下程序段可完成相加。 • MOV AX,FIRST • ADD AX,SECOND;进行字运算 • MOV THIRD,AX • MOV AX,FIRST+2 • ADC AX,SECOND+2 • MOV THIRD+2,AX • 这条指令对标志位的影响与ADD相同。
⑶一般形式:INC OPRD ; • 功能:OPRD←OPRD+1 • 完成对指定的操作数OPRD加1,然后返回此操作数。此指令主要用于在循环程序中修改地址指针和循环次数等。 • 这条指令执行的结果影响标志位AF、OF、PF、SF和ZF,而对进位标志没有影响。 • 如:INC AL • INC [BX]
2、减法指令 • ⑴SUB OPRD1,OPRD2 ; • 功能:OPRD1←OPRD1-OPRD2 • 例: SUB CX,BX • SUB [BP],CL • ⑵SBB OPRD1,OPRD2 ; • 功能:OPRD1←OPRD1-OPRD2-CF • 本指令对标志位AF、CF、OF、PF、SF和ZF都有影响。 • ⑶一般形式:DEC OPRD ; • 功能:OPRD←OPRD-1 • 指令执行的结果,影响标志AF、OF、PF、SF和ZF.但对CF标志不影响 • 例如: DEC [SI] • DEC CL
⑷NEG OPRD • 功能: 取补 • 例如: NEG AL • (AL=00111100)则取补后为11000100 • 即00000000-00111100=11000100 • 若在字节操作时对-128,或在字操作时对-32768取补,则操作数没变化,但标志OF置位。 • 此指令影响标志AF、CF、OF、PF、SF和ZF • ⑸CMP OPRD1,OPRD2 ; • 功能: OPRD1-OPRD2 结果反映在标志位上,但并不送回结果 • 例: CMP AL,100 • CMP DX,DI • CMP CX,COUHT[BP] • CMP COUNT[SI],AX • 比较两个数之间的关系。比较后,根据ZF标志可判断两者是否相等。
相等的比较: • ①若两者相等,相减以后结果为零,ZF标志为1,否则为0。 • ②若两者不相等,则可在比较指令之后利用其它标志位的状态来确定两者的大小。 • 大小的比较: • 如果是两个无符号数(如CMPAX,BX)进行比较,则可以根据CF标志的状态判断两数大小。若结果没有产生借位(CF=0),显然AX≥BX;若产生了借位(即CF=1),则AX<BX。
3、乘法指令 • (1) 无符号乘法指令MUL • 一般格式: MUL OPRD • 默认的操作数放在AL或AX中,8位数相乘,结果为16位数,放在AX中;16位数相乘结果为32位数,高16位放在DX,低16位放在AX中。注意:源操作数不能为立即数。 • 例:MOV AL,FIRST; • MUL SECOND ;结果为AX=FIRST*SECOND • MOV AX,THIRD; • MUL AX ;结果DX:AX=THIRD*THIRD
(2) 带符号数乘法指令IMUL • 一般格式:IMUL OPRD • 结果放在AX或DX,AX中。当结果的高半部分不是低半部分的符号扩展时,标志位CF和OF将置位。 • 例:(AL)=0FEH,(CL)=11H,求相乘结果 • 无符号数相乘时,MUL CL • 具体运算:1111 1110 • * 0001 0001 =0001 0000 1101 1110 (AX)=10DEH 即(AH)=10H不为零,CF=1,OF=1。 • 有符号运算时 IMUL CL • 执行02H乘11H,有: • (0000 0010)*(0001 0001)=0000 0000 0010 0010 • 取补为:1111 1111 1101 1110,即(AX)=FFDEH。 • (AH)=FFH是(AL)=DEH的符号扩展,故CF=0,OF=0。
4、除法指令 • (1) 无符号数除法指令 DIV • 一般格式:DIV OPRD • (2) 带符号数除法IDIV • 一般格式:IDIV OPRD • IDIV指令认为操作数的最高位为符号位,商的最高位也为符号位。 • 字节运算时被除数在AX中;商在AL中,余数在AH中。字运算时被除数为DX:AX构成的32位数,商在AX中,余数在DX中。 • 例:AX=2000H,DX=200H,BX=1000H • DIV BX执行后,AX=2002H ,DX=0000。
(3) 字节扩展指令CBW • 一般格式:CBW • 将AL寄存器的最高位扩展到AH,即若D7=0,则AH=0;否则AH=0FFH。 • (4) 字扩展指令CWD • 一般格式:CWD • 该指令执行时将AX寄存器的最高位扩展到DX,即若D15=0,则DX=0;否则DX=0FFFFH。 • CBW、CWD指令不影响标志位。
5、十进制调整指令 • 常用BCD码表示十进制数,压缩BCD码:每个字节表示两位BCD数;非压缩BCD码:一个字节表示一位BCD数,高四位为0。 • 例:25D,压缩BCD数为:25H;非压缩BCD数为:0205H,用两字节表示。 • DAA压缩的BCD码加法调整 • DAS压缩的BCD码减法调整 • AAA非压缩的BCD码加法调整 • AAS非压缩的BCD码减法调整 • AAM乘法后的BCD码调整 • AAD除法前的BCD码调整
例如: • ADD AL,BL • DAA • 执行前:AL=28H,BL=68H • 执行ADD后:AL=90H,AF=1 • 执行DAA指令后,AL=96H,CF=0,AF=1。 • MUL BL • AAM • 执行前:AL=07,BL=09 • 执行MUL BL 后,AX=003FH • 执行AAM指令后,AH=06H,AL=03H。 • 注意:BCD码进行乘除法运算时,一律使用无符号数形式,因而AAM 和AAD应固定地出现在MUL之前和DIV之后。
三、 逻辑运算和移位指令 • 1、逻辑运算指令 • (1) 一般格式:NOT OPRD • 功能:对操作数求反,然后送回原处,操作数可以是寄存器或存储器内容。此指令对标志无影响。例如:NOT AL • (2) 一般格式:AND OPRD1,OPRD2 • 功能:对两个操作数进行按位的逻辑“与”运算,结果送回目的操作数。
(3) TEST OPRD1,OPRD2 • 功能:与AND指令的操作相同,结果反映在标志位上,但不送回结果。通常用它进行测试 • 例: 要检测 AL中的最低位是否为1,为1则转移。可用以下指令: • TEST AL,01H • JNZ THERE • …… • THERE:
(4) 一般格式:OR OPRD1,OPRD2 • 功能:对指定的两个操作数进行逻辑“或”运算。结果送回目的操作数。 • AND AL,0FH • AND AH,F0H • OR AL,AH ; 完成拼字的动作 • OR AX,0FFFH ;将AX低12位置1
(5) XOR OPRD1,OPRD2 • 功能:对两个指定的操作数进行“异或”运算,结果送回目的操作数。 • 例:XOR AL,AL ;使AL清0 • XOR SI,SI ;使SI清0 • XOR CL,0FH ;使低4位取反,高4位不变 • NOT的操作数不能为立即数,双操作数逻辑指令中,必须有一个操作数为寄存器寻址方式,它们对标志位的影响情况如下:NOT不影响标志位,其它四种指令使CF=OF=0,AF无定义,而SF、ZF和PF则根据运算结果而定。
2、移位指令 • (1)算术/逻辑移位指令 • 算术左移或逻辑左移指令 • SAL/SHL OPRD,M • 算术右移指令 SAR OPRD,M • 逻辑右移指令 SHR OPRD,M • M是移位次数,可以是1或寄存器CL • 这些指令可以对寄存器操作数或内存操作数进行指定的移位
(2)循环移位指令 • ROL OPRD,M ;左循环移位 • ROR OPRD,M ;右循环移位 • RCL OPRD,M ;带进位左循环移位 • RCR OPRD,M ;带进位右循环移位
左移一位,只要左移以后的数未超出一个字节或一个字的表达范围,则原数的每一位的权增加了一倍,相当于原数乘2。右移—位相当于除以2。左移一位,只要左移以后的数未超出一个字节或一个字的表达范围,则原数的每一位的权增加了一倍,相当于原数乘2。右移—位相当于除以2。 • 经常进行乘10操作。而X*10=X*2+X*8,可采用移位和相加的办法来实现乘10。为保证结果完整,先将AL中的字节扩展为字。 • MOV AH,0 • SAL AX,1 ;X*2 • MOV BX,AX ;送BX暂存 • SAL AX,1 ;X*4 • SAL AX,1 ;X*8 • ADD AX,BX ;X*10
例1 BCD码转换为ASCII码内存中放有若干个用组合BCD码表示的十进制数。把它们转换为ASCII码。高位的BCD码转换后放在高地址单元。 • 分析:转换公式:ASCII=BCD+30H • 算法:源串和目的串的表首分别设两个指针。取BCD转ASCII后存入(先低位,后高位) • MOV SI,OFFSET BCDBUFF;源地址指针 • MOV CX,COUNT ;设计数初值 • MOV DI,OFFSET ASCBUF ;目的指针