1 / 163

第 一节 8086 指令系统 1

第 一节 8086 指令系统 1. Intel 8086 的寻址方式 重点: 立即寻址、直接寻址、寄存器寻址、寄存器间接寻 址 、变址寻址、基址加变址寻址 , 有效地址的计 算 掌握数据传送类指令的使用方法。. 指令的一般格式. 1 、指令格式. 指令:计算机提供给用户的硬件命令。 指令系统 ( 集 ) :指令的集合 。. 操作码:指计算机所要执行的操作,即指出操作类型,是一种助记符。 操作数:指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其它有关操作数的信息。

Download Presentation

第 一节 8086 指令系统 1

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第 一节 8086指令系统1 • Intel 8086的寻址方式 • 重点: 立即寻址、直接寻址、寄存器寻址、寄存器间接寻 址 、变址寻址、基址加变址寻址 ,有效地址的计 算 • 掌握数据传送类指令的使用方法。

  2. 指令的一般格式 1、指令格式 • 指令:计算机提供给用户的硬件命令。 • 指令系统(集):指令的集合。

  3. 操作码:指计算机所要执行的操作,即指出操作类型,是一种助记符。操作码:指计算机所要执行的操作,即指出操作类型,是一种助记符。 • 操作数:指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其它有关操作数的信息。 • 寻址方式:就是指令中用于说明操作数所在地址的方法,或者说是寻找操作数有效地址的方法。

  4. 2、操作数寻址方式 • 立即数寻址 • 寄存器寻址 • 直接寻址 • 寄存器间接寻址 • 寄存器相对寻址 • 基址变址寻址 • 相对基址变址寻址

  5. (1)立即数寻址方式

  6. 说明: • 立即数可以是8位或16位的。如果是16位立即数,则高8位放在高地址,低8位放在低地址。 • 使用场合:由于立即数用来表示常数,所以立即数寻址方式经常用于给寄存器赋初值。 • 它只能用于源操作数字段,不能用于目的操作数字段。 • 由于立即数可以从指令中直接取得,因此CPU不需要另外占用总线周期去取操作数,故立即数寻址方式显著的特点就是速度快。

  7. (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; • 这种寻址方式因为操作数在寄存器中,不需要访问存储器,所以运算速度较高。

  8. (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]的内存单元。

  9. (4)寄存器间接寻址方式 操作数的偏移地址(有效地址EA)放在寄存器中只有SI、DI、BX和BP可作间址寄存器 例: MOV AX, [BX] MOV CL, CS:[DI] • 若选择BX或SI或DI寄存器提供的间址,则操作数一般在数据段区域中,用DS提供段基址。 • 若选择BP寄存器提供的间址,则操作数在堆栈段区域中,用SS提供段基址。 • 用SI、DI、BX、BP作为间接寻址时允许使用段跨越前缀,从而实现对其它段中数据的存取。 • 用途:这种寻址方法适用于数组、字符串、表格的处理。

  10. (5)寄存器相对寻址

  11. (6)基址+变址寻址 例:MOV AX,[BX][SI] (DS)=3200H,(BX)=0456H (SI)=1094H EA=0456H+1094H=14EAH 物理地址=32000H+14EAH=334EAH 若选择BP寄存器提供基地址,则操作数在堆栈段区域中,用SS提供段基址

  12. (7)相对基址+变址寻址

  13. 8086/8088 指令系统 8086/8088的指令系统可以分为以下六个功能组。 1、数据传送(Data Transfer) 2、算术运算(Arithmetic) 3、逻辑运算(Logic) 4、串操作(String menipulation) 5、程序控制(Program Control) 6、处理器控制(Processor Control)

  14. 一、数据传送指令 主要MOV,XCHG、堆栈和地址传送指令。 1、数据传送MOV指令 一般格式:MOV OPRD1,OPRD2 MOV 是操作码,OPRD1目的操作数、OPRD2源操作数。 功能:完成数据传送 具体来说,一条数据传送指令能实现: ⑴CPU内部寄存器之间数据的任意传送(除了代码段寄存器CS和指令指针IP以外)。 • MOV AL,BL;字节传送 • MOV CX,BX;字传送 • MOV DS,BX

  15. ⑵立即数传送至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

  16. ⑷ 能实现用立即数给存储单元赋值 • 例:MOV [2000H],25H • 注意: • ①存储器传送指令中,不允许对CS和IP进行操作; • ②两个操作数中,除立即寻址之外必须有一个为寄存器寻址方式,即两个存储器操作数之间不允许直接进行信息传送;如需要把存储单元AREA1的内容送至同一段内AREA2中去,传送过程如下: • MOV AL,AREA1 • MOV AREA2,AL • ③两个段寄存器之间不能直接传送信息,也不允许用立即寻址方式为段寄存器赋初值; • 如:MOVAX,0;MOVDS,AX • ④目的操作数,不能用立即寻址方式。

  17. 2、堆栈指令 入栈(PUSH)、出栈(POP) 仅能进行字传送。 • ⑴ 入栈指令PUSH • 一般格式:PUSH OPRD • 例如:PUSH BX • 执行过程为: • SP=SP-1,[SP]=BH; • SP=SP-1,[SP]=BL

  18. ⑵ 出栈指令POP • 一般格式:POP OPRD • 功能:将数据弹出堆栈 • 对指令执行的要求同入栈指令。 • 例如:POP AX • POP [BX] • POP DS

  19. 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中的内容传送到一个输出端口。

  20. ⑶ XLAT指令 • 一般格式:XLAT ; ( AL)=(DS)×16+((BX)+(AL)) • 功能:完成一个字节的查表转换。 • 寄存器AL的内容作为一个表的下标;表的基地址放在BX中;转换后的结果存放在AL中. • 例如:MOV BX,OFFSET TABLE • IN AL,1 • XLAT ;查表 • OUT 1,AL ;(AL)= AAH • 本指令可用在数制转换、函数表查表、代码转换等场合。

  21. 5、地址传送指令 • ⑴ LEA (Load Effective Address) • 一般格式: LEA OPRD1,OPRD2 • 功能:把源操作数OPRD2的地址偏移量传送至目的操作数OPRD1。 • 要求:①源操作数必须是一个内存操作数②目的操作数必须是一个16位的通用寄存器。例:LEA BX,BUFR;把变量BUFR的地址偏移量送BX

  22. ⑵ LDS (Load pointer into DS) • 一般格式: LDS OPRD1,OPRD2 • 功能:完成地址指针的传送。 • 将段地址送DS,偏移量部分 • 送入一个16位的指针寄存器 • 或变址寄存器。 • 要求:源操作数是一个内存 • 操作数,目的操作数是一个通 • 用寄存器/变址寄存器。 • 例如:LDS SI,[BX] ;把BX所指的32位地址指针的段地址送DS,偏移量送SI。

  23. ⑶ LES (Load pointer into ES) • 一般格式: LES OPRD1,OPRD2 • 这条指令除将地址指针的段地址部分送入ES外,与LDS类似 • 例: LES DI,[BX+COUNT]

  24. 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) • 将栈顶的一个字,送标志寄存器,影响标志位。

  25. 习题: • 设有关寄存器及存储单元的内容如下: • (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]

  26. 第二节 8086/8088 指令系统2 重点:了解指令的功能,掌握算术运算、逻辑运算和移位指令的功能和应用 二、算术运算指令

  27. 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有影响。

  28. ⑵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相同。

  29. ⑶一般形式:INC OPRD ; • 功能:OPRD←OPRD+1 • 完成对指定的操作数OPRD加1,然后返回此操作数。此指令主要用于在循环程序中修改地址指针和循环次数等。 • 这条指令执行的结果影响标志位AF、OF、PF、SF和ZF,而对进位标志没有影响。 • 如:INC AL • INC [BX]

  30. 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

  31. ⑷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标志可判断两者是否相等。

  32. 相等的比较: • ①若两者相等,相减以后结果为零,ZF标志为1,否则为0。 • ②若两者不相等,则可在比较指令之后利用其它标志位的状态来确定两者的大小。 • 大小的比较: • 如果是两个无符号数(如CMPAX,BX)进行比较,则可以根据CF标志的状态判断两数大小。若结果没有产生借位(CF=0),显然AX≥BX;若产生了借位(即CF=1),则AX<BX。

  33. 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

  34. (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。

  35. 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。

  36. (3) 字节扩展指令CBW • 一般格式:CBW • 将AL寄存器的最高位扩展到AH,即若D7=0,则AH=0;否则AH=0FFH。 • (4) 字扩展指令CWD • 一般格式:CWD • 该指令执行时将AX寄存器的最高位扩展到DX,即若D15=0,则DX=0;否则DX=0FFFFH。 • CBW、CWD指令不影响标志位。

  37. 5、十进制调整指令 • 常用BCD码表示十进制数,压缩BCD码:每个字节表示两位BCD数;非压缩BCD码:一个字节表示一位BCD数,高四位为0。 • 例:25D,压缩BCD数为:25H;非压缩BCD数为:0205H,用两字节表示。 • DAA压缩的BCD码加法调整 • DAS压缩的BCD码减法调整 • AAA非压缩的BCD码加法调整 • AAS非压缩的BCD码减法调整 • AAM乘法后的BCD码调整 • AAD除法前的BCD码调整

  38. 例如: • 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之后。

  39. 三、 逻辑运算和移位指令 • 1、逻辑运算指令 • (1) 一般格式:NOT OPRD • 功能:对操作数求反,然后送回原处,操作数可以是寄存器或存储器内容。此指令对标志无影响。例如:NOT AL • (2) 一般格式:AND OPRD1,OPRD2 • 功能:对两个操作数进行按位的逻辑“与”运算,结果送回目的操作数。

  40. (3) TEST OPRD1,OPRD2 • 功能:与AND指令的操作相同,结果反映在标志位上,但不送回结果。通常用它进行测试 • 例: 要检测 AL中的最低位是否为1,为1则转移。可用以下指令: • TEST AL,01H • JNZ THERE • …… • THERE:

  41. (4) 一般格式:OR OPRD1,OPRD2 • 功能:对指定的两个操作数进行逻辑“或”运算。结果送回目的操作数。 • AND AL,0FH • AND AH,F0H • OR AL,AH ; 完成拼字的动作 • OR AX,0FFFH ;将AX低12位置1

  42. (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则根据运算结果而定。

  43. 2、移位指令 • (1)算术/逻辑移位指令 • 算术左移或逻辑左移指令 • SAL/SHL OPRD,M • 算术右移指令 SAR OPRD,M • 逻辑右移指令 SHR OPRD,M • M是移位次数,可以是1或寄存器CL • 这些指令可以对寄存器操作数或内存操作数进行指定的移位

  44. (2)循环移位指令 • ROL OPRD,M ;左循环移位 • ROR OPRD,M ;右循环移位 • RCL OPRD,M ;带进位左循环移位 • RCR OPRD,M ;带进位右循环移位

  45. 左移一位,只要左移以后的数未超出一个字节或一个字的表达范围,则原数的每一位的权增加了一倍,相当于原数乘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

  46. 例1 BCD码转换为ASCII码内存中放有若干个用组合BCD码表示的十进制数。把它们转换为ASCII码。高位的BCD码转换后放在高地址单元。 • 分析:转换公式:ASCII=BCD+30H • 算法:源串和目的串的表首分别设两个指针。取BCD转ASCII后存入(先低位,后高位) • MOV SI,OFFSET BCDBUFF;源地址指针 • MOV CX,COUNT ;设计数初值 • MOV DI,OFFSET ASCBUF ;目的指针

More Related