1 / 104

第 4 章 80x86 微处理器的指令系统

第 4 章 80x86 微处理器的指令系统. 本章内容 Intel 80x86 的寻址方式 Intel 80x86 指令系统. 4.1 Intel 80x86 的寻址方式. 本章主要介绍 8086/8088 的指令系统以及在指令中为取得操作数地址所使用的寻址方式。. 汇编指令:. 操作码 操作数. 操作码 :指令操作类型; 操作数 :指令所需操作数或操作数的地址;操作数可以有一个,也可以有两个,一个源操作数,一个目的操作数。 例: MOV AX , CX ;将 CX 的内容送入 AX 中。.

stacy
Download Presentation

第 4 章 80x86 微处理器的指令系统

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. 第4章 80x86微处理器的指令系统

  2. 本章内容 • Intel 80x86的寻址方式 • Intel 80x86指令系统

  3. 4.1 Intel 80x86的寻址方式 本章主要介绍8086/8088的指令系统以及在指令中为取得操作数地址所使用的寻址方式。 汇编指令: 操作码 操作数 操作码:指令操作类型; 操作数:指令所需操作数或操作数的地址;操作数可以有一个,也可以有两个,一个源操作数,一个目的操作数。 例: MOV AX,CX ;将CX的内容送入AX中。

  4. 4.1 Intel 80x86的寻址方式 • 寻址 • 根据指令内容确定操作数地址的过程,称为寻址。 • 有效地址 • 根据寻址方式计算所得到的地址叫做有效地址EA,也就是段内偏移地址。有效地址还需要与相应的段基地址组合才是20位的物理地址,该工作由CPU完成。 • 寻址方式在两种方式下被涉及: • 操作数的寻址方式和对调用或转移指令的寻址方式。 本讲只介绍对操作数的寻址!!!

  5. 操作数 寻址方式 立即数 立即数寻址 寄存器数 寄存器寻址 直接寻址 寄存器间接寻址 变址寻址 存储器数 基址变址寻址 串操作寻址 直接寻址 端口寻址 寄存器间接寻址 4.1 Intel 80x86的寻址方式 • 计算机中操作数按存放的方法分为: • 立即数(指令中) • 寄存器数 • 存储器数 • I/O端口

  6. 4.1.1 立即寻址 • 操作数紧跟在操作码后面,与操作码一起存放在一个代码段区域中,可以是8位也可以是16位。 • 例如:MOV AX,2345H MOV AL,80H 存储器 AH AL 立即数 代码段 AX 23H 45H 操作码 45H 23H

  7. 4.1.2 寄存器寻址 • 操作数存放在指定的寄存器中,寄存器包括8位或16位通用寄存器和段寄存器。可使用的16位寄存器:AX、BX、CX、DX、SI、DI、SP、BP;其中:AX、BX、CX、DX可分成两8位使用。 • 例如:MOV DS,AX MOV AL,BH AH AL DS 23H 45H

  8. 4.1.3 存储器操作数寻址方式 • 段寄存器使用的基本约定

  9. BP----数据在堆栈段(段寄存器SS) BX • 基地址 SI----源地址 DI----目的地址 • 变址量 4.1.3 存储器操作数寻址方式 • 任何存储单元物理地址(PA)都由两部分组成:段基址+段内偏移地址(此单元与段基址的距离) • 段基值:是由某个段寄存器提供,由指令隐含给出。 • 段内的偏移地址又称为有效地址(EA),EA由三个地址分量组合而成。 • 位移量----8/16位二进制数;常以符号地址形式(变量或标号)出现在指令中 数据默认在数据段(DS); 可用段前缀指定(改变)

  10. .... A1H 00H 代码段 AH AL 30H 34H 12H AX .... 13000H 13001H 数据段 12H 34H 1、直接寻址 • 有效地址EA由指令直接给出,紧跟在操作码之后。 • 物理地址PA = 10H  (DS) + EA 例如:MOV AX,[3000H] 假设(DS)=1000H PA=1000H 10H+3000H=13000H 可使用段跨越前缀改变数据所在段地址。 例如:MOV AX,ES :[2000H] * 适于处理单个变量

  11. (BX) (SI) (DI) 2、寄存器间接寻址 • 操作数存放在存储器中,操作数的有效地址EA存放在寄存器BX 、SI、DI 或BP之一中。 • BX,SI,DI  操作数在数据段(DS) • BP  操作数在堆栈段(SS) • 物理地址 = 10H  (SS) + (BP) • 物理地址 = 10H  (DS) +

  12. .... 操作码 代码段 AH AL .... 35H 12H AX 31000H 31001H 数据段 12H 35H 2、寄存器间接寻址 例如:MOV AX,[SI] 假设(DS)=3000H, (SI)=1000H PA=3000H 10H+1000H=31000H 可以段跨越改变数据所在的段: MOVES:[BX],AX

  13. (BX) (BP) (SI) (DI) 8位 16位 位移量 + 有效地址 EA= 3、变址寻址(寄存器相对寻址) • EA是两个地址分量----基址寄存器或变址寄存器的内容与指令中给出的位移量(8/16位)之和 • 隐含段地址:SI、DI、BX为DS;BP为SS。可用段跨越。

  14. AH AL 86H 12H AX 42020H 42021H 数据段 12H 86H 3、变址寻址(寄存器相对寻址) 例如:MOV AX,DATA[BX]或 MOV AX,[DATA+BX] 假设(DS)=4000H,(BX)=2000H,DATA=0020H PA=4000H 10H+2000H+0020H=42020H .... * 一个地址分量在程序执行过程中可进行修改,适于数组、字符串、表格的处理 操作码 20H 代码段 00H ....

  15. 8位 16位 (BX) (BP) (SI) (DI) 有效地址 EA= + + 位移量 4、相对基址变址寻址 • EA是三个地址分量----基址寄存器和变址寄存器的内容与指令中给出的位移量(8/16位)之和 例如:MOV AX, [BX][SI]DATA 或 MOV AX,[BX+SI] DATA 假设(DS)=4000H,(BX)=2000H, (SI)=2000,DATA=0100H PA=4000H 10H+2000H+2000H+0100H=44100H

  16. 基址 变址 (BX) (BP) (SI) (DI) + 有效地址 EA= 5、基址变址寻址 • 若位移量为0----基址变址寻址方式 例如:MOV AX, [BX][DI] 假设(DS)=4000H,(BX)=2000H,(DI)=2000,PA=4000H 10H+2000H+2000H+0100H=44100H *因为有两个地址分量可在程序执行过程中进行修改,适用于访问二维数组。 注意:必须是一个基址寄存器和一个变址寄存器的组合,不可同为基址寄存器(BX、BP)或同为变址寄存器(SI、DI)

  17. 4.2 Intel 80x86指令系统 • 指令:控制计算机完成指定操作的命令 • 指令系统:所有指令的集合 • 8086/8088指令系统共包含92种基本指令 • 8086指令按照功能分为6大类: • 数据传送指令 14条 • 算术运算指令 20条 • 逻辑运算和移位指令 13条 • 串操作指令 13条 • 控制转移指令 28条 • 处理器控制指令 12条

  18. 4.2.1 数据传输指令 说明: ·表示运算结果影响标志位, - 表示运算结果不影响标志位。

  19. (一)通用数据传输指令 • 通用数据传送指令包括: 1.传送指令MOV 2.数据交换指令XCHG 3.查表转换指令 XLAT 4. 堆栈操作指令PUSH和POP 1.最基本的传送指令MOV • MOV指令是形式最简单、用得最多的指令。它可以实现CPU内部寄存器之间的数据传送、寄存器和内存之间的数据传送,还可以把一个立即数送给CPU的内部寄存器或内存单元。 • 语句格式:MOV OPD,OPS • 功能:将源操作数传送入目的地址,源地址内容不变。即(OPS)→OPD。 • 对标志位的影响:无

  20. (一)通用数据传输指令 例如: • MOV AL,BL • MOV ES,DX • MOV AX,[BX] • MOV [DI],AX • MOV CX,[1000] • MOV BL,40 • MOV DX,5040 • MOV WORD PTR[SI],6070

  21. (一)通用数据传输指令 注意: (1)双操作数指令不允许两个操作数同时为段寄存器或存储器操作数 MOV seg ,seg ;错误 MOV mem ,mem ;错误 (2)立即数不能传送到段寄存器中。 MOV seg ,imm ; 错误 (3)目的操作数不允许使用CS段寄存器。 (4)指令指针IP,不能作为MOV指令的操作数 (5)dest与src必须类型匹配,即同时是字节或字类型。 (6)MOV指令不影响标志寄存器的值。

  22. (一)通用数据传输指令 例:错误的MOV 指令如下所示: • MOV AX,BL • MOV DS,1000H • MOV [BX],[SI] • MOV ES,CS • MOV CS,AX 例:设B是已定义的字节变量,判断指令的正确性。 • MOV AX,B • MOV AL,0 ;类型不匹配 ;不允许立即数送段寄存器 ;不允许内存操作数之间传送 ;不允许段寄存器之间传送 ; CS不能作为目的操作数 ;错误,类型不匹配 ;正确,MASM可以判断出要送字节0

  23. (一)通用数据传输指令 2.堆栈操作指令 • 堆栈概念:存储器的一段区域,按“先进后出”的原则进行存出操作。8086/8088系统,堆栈位于堆栈段,其段地址由SS指示,SP寄存器作为指针,SP内容始终指向栈顶所在存储单元。 • 作用:在调用一个过程时,保存返回地址;暂时存放寄存器或存储器单元操作数的内容 • 语句格式: • 进栈 PUSH SRC • 操作:(SP)(SP)-2;((SP)+1,(SP))(SRC) • 出栈 POP DST • 操作:(DST)((SP)+1,(SP));(SP)(SP)+2 • 注意: (1)以上两个指令只能对字操作 (2)不能 POP CS

  24. (一)通用数据传输指令 例如:将16位通用寄存器CX的内容压入堆栈,然后,弹出栈顶至CX中 已知:(SS)=0200H,(SP)=0008H,(CX)=12FAH

  25. (一)通用数据传输指令 8086/8088系统的堆栈具有如下特点: • 堆栈是在内存的堆栈段中,具有“先进后出”的特点; • 堆栈只有一个出入口,即当前栈顶为空时,栈顶和栈底指向同一内存单元; • 堆栈有两个基本操作:PUSH(进栈)和POP(出栈)。PUSH操作使栈顶向低地址方向移动,而POP操作则刚好相反; • 堆栈操作只能作字操作; • SS:SP在任何时候都指向当前的栈顶。

  26. (一)通用数据传输指令 3.交换指令 • 交换指令XCHG可以实现字节交换,也可以实现字交换。 • 语句格式:XCHG DEST,SRC • 功能:将源操作数与目的操作数的内容互换 • 注意: (1)dst与src不能同时为内存单元; (2)不能使用CS、IP作为操作数。 (3)不影响标志位 例如: XCHG AL,BL ;AL和BL之间进行字节交换   XCHG BX,CX ;BX和CX之间进行字交换   XCHG [2530],CX ;CX中的内容和2530,2531两单元的内容交换

  27. (一)通用数据传输指令 4.查表指令 • XLAT是一条完成字节翻译功能的指令,它可以使累加器中的一个值变换为内存表格中的某一个值,一般用来实现编码制的转换。 • 语句格式:XLAT • 功能:将(BX)为首地址(AL)为位移量的字节存储单元中的数据送AL寄存器。即([BX+AL])→AL。 • 使用换码指令时,要求BX寄存器指向表的首地址,AL的内容为表中某一项与表格首地址之间的偏移量,指令执行时,会将BX和AL中的值相加,把得到的值作为地址,然后将此地址所对应的单元中的值取到AL中去。

  28. (一)通用数据传输指令 下图表示了换码指令的功能。XLAT指令就是通过查表方式来完成翻译功能的,因此,在执行该指令之前,必须建立好一张翻译表,该表的最大容量为256字节。

  29. (二)地址传送指令 这是一类专用于传送地址码的指令,可用来传送操作数的段地址或偏移地址,共包含以下3条指令:LEA、LDS、LES 1.取有效地址指令 • 语句格式:LEA OPD,OPS • 功能:LEA的功能是将存储器地址送到一个寄存器,主存按源地址的寻址方式计算偏移地址,将偏移地址送入指定寄存器。 • LEA指令格式中,要求源操作数必须为内存单元地址,目的操作数必须为一个16位的通用寄存器。这条指令常用来使一个寄存器作为地址指针。 • 例如: LEAAX,[2728] ;将2728单元的偏移量送AX,指令执行后,AX中 为2728 LEABX,[BP+SI] ;指令执行后,BX中的内容为BP+SI的值  LEASP,[0482]  ;使堆栈指针SP为482 问题:LEA指令与MOV指令有何区别?

  30. (二)地址传送指令 LEA 指令与MOV 指令的区别: LEA SI,BUFF指令是将标号BUFF的偏移地址送入寄存器中; MOV SI,BUFF指令是将标号BUFF所指存储单元的内容送入SI。 0 LEA SI,BUFF; 执行后:(SI)=0002H 段起始地址 1 BUFF = 2 48 3 00 MOV SI,BUFF; 执行后:(SI)=0048H 4 FE 5 FF

  31. 13 57 24 68 DS (二)地址传送指令 2.将地址指针装到DS和另一个寄存器的指令 • 语句格式:LDS OPD,OPS • 功能:LDS指令的功能是把4个字节的地址指针(其中包括一个段地址和一个偏移量)传送到两个目的寄存器,其中,地址指针的后两个字节即段地址一定送到DS中。 例:(DS)=C000H,(C2480H)=1357H,(C2482H)=2468H LDS SI,[2480] DS:2480H 57H DS:2481H 13H DS:2482H 68H SI DS:2483H 24H

  32. (二)地址传送指令 3.将地址指针装到ES和另一个寄存器的指令 • 语句格式:LES OPD,OPS • LES指令与LDS指令的操作基本相同,所不同仅在于将源操作数所指向地址指针中的段基址(后两个字节)传送到ES段寄存器,而不是DS段寄存器。

  33. (三)标志传送指令 1.读取标志指令 • 语句格式:LAHF • 功能:将标志寄存器的低8位送入AH寄存器。 • 该指令的执行对标志位无影响。 2.设置标志指令SAHF • 语句格式:SAHF • 功能:将AH的内容送入标志寄存器的低8位,高8位不变。从该指令功能可看出,SAHF为LAHF的逆过程。

  34. (三)标志传送指令 3.对标志寄存器的压入堆栈指令和弹出堆栈指令 • PUSHF指令将标志寄存器的值压入堆栈顶部,同时,堆栈指针SP的值减2,此指令在执行时标志寄存器的值不变。 • POPF指令的功能正好相反,此指令在执行时从堆栈中弹出一个字送到标志寄存器中,同时堆栈指针SP的值加2。 • PUSHF和POPF指令一般用在子程序和中断处理程序的首尾,起保存主程序标志和恢复主程序标志的作用。

  35. (四)输入/输出指令 1.输入指令IN • 输入指令用来从指定的外设端口寄存器取信息送入累加器。它有四种形式: (1)语句格式:IN AL,PORT 功能:(PORT)→AL (2)语句格式:IN AX,PORT 功能:(PORT)→AX (3)语句格式:IN AL,DX 功能:([DX])→AL (4)语句格式:IN AX,DX 功能:([DX])→AX • PORT指端口号,即端口寄存器地址。

  36. (四)输入/输出指令 2. 输出指令 • 输出指令用来把累加器的内容送往指定的外设端口寄存器,它有四种形式: (1)语句格式:OUT PORT,AL 功能:(AL)→PORT (2)语句格式:OUT PORT,AX 功能:(AX)→PORT (3)语句格式:OUT DX,AL 功能:(AL)→[DX] (4)语句格式:OUT DX,AX 功能:(AX)→[DX]

  37. (四)输入/输出指令 直接IN指令(口地址只能 8 位) IN AL ,50H IN AX ,80H 间接IN指令(口地址是16 位,也可8 位) MOV DX,0FFF2H IN AL ,DX 直接OUT指令(口地址只能 8 位) OUT 44H , AL OUT 70H , AX 间接OUT指令(口地址是16 位,也可8 位) MOV DX,87FEH MOV DX ,80H MOV AL ,40H OUT DX ,AL OUT DX ,AL

  38. 4.2.2 算术运算指令 1.加法指令 • 不带进位的加法 ADD 格式:ADD DEST,SRC 功能:DEST+SRC DEST • 带进位的加法 ADC 格式:ADC DEST,SRC 功能:DEST+SRC+CF DEST • 加 1 指令 INC 格式:INC DEST 功能:DEST+1 DEST (不影响CF) 说明: • SRC:立即数、通用REG、M三种寻址方式,DEST:通用REG、M两种寻址方式。 • 立即数不能做目的操作数,DEST,SRC不能同为存储器寻址方式, 类型要一致,段寄存器不能做操作数。 • 这三条指令运算结果将影响状态标志位,但是INC指令不影响标志CF。

  39. 4.2.2 算术运算指令 例如: ADDAL,50H  ; AL和50H相加,结果放在AL中 ADDDI,SI  ; DI和SI的内容相加,结果放在DI中  ADD [BX+DI],AX ; BX+DI和BX+DI+1两个存储单元的内容和AX ; 中的内容相加,结果放在BX+DI和BX+DI+1所 ;指的存储单元中 例如: ADCAX,SI  ; AX和SI中的内容以及CF的值相加,结果放在AX中 ADCDX,[SI] ; SI和SI+1所指的存储单元的内容和DX的内容          ;以及CF的值相加,结果放在DX中

  40. 4.2.2 算术运算指令 例如: INCAL     ; 将AL中的内容加1 INCCX        ; 将CX中的内容加1 INCBYTE PTR[BX+DI+500] ; 将BX+DI+500所指的存储单元的内容加1 2.减法指令 • 不带借位减法 SUB 格式:SUB DEST,SRC; 功能:DEST - SRC DEST • 带借位减法SBB 格式:SBB DEST,SRC; 功能:DEST - SRC - CF DEST • 减 1 指令DEC 格式:DEC DEST ; 功能:DEST - 1 DEST • 求补指令NEG 格式:NEG DEST; 功能:0 - DEST DEST • 比较指令 CMP 格式:CMP DEST,SRC; 功能:DEST - SRC(只影响标志位,不回送结果,所影响的标志位见课本65页)

  41. 4.2.2 算术运算指令 例如: SUBBX,CX ; 将BX中的内容减去CX中的内容,结果放在BX中 SUB[BP+2],CL ; 将SS段的BP+2所指的单元中的值减去CL ; 中的值,结果放在BP+2所指的堆栈单元中 SUBAL,20  ; AL中的数减去20,结果放在AL中 SUBWORD PTR [DI],1000H ;DI和DI+1所指的两单元中的数减去1000H, ;结果放在DI和DI+1所指的单元中 例如: SBBAX,2030H ; 将AX的内容减去立即数2030H,并减去进位位CF的值         SBBWORD PTR [DI+2],1000H ; 将DI+2和DI+3所指的   ;两单元的内容减去立即数1000H,并减去CF           ;的值,结果放在DI+2和DI+3所指的单元中

  42. 4.2.2 算术运算指令 例如: DECAX  ;将AX的内容减1,再送回AX中   DECBL  ;将BL的内容减1,结果送回BL中   DECBYTE PTR [DI+2] ;将DI+2所指的单元的内容减1,结果送回此单元 例如: NEGAL ; 将AL中的数取相反数,送回AL NEGCX ; 将CX中的数取相反数,送回CX 例如: CMPAX,2000H ; 将AX的内容和2000H相比较,结果影响标志位 CMPAL,50H  ; 将AL中的数和50H比较,结果影响标志位 CMPAX,[BX+DI+100] ; 将累加器和两个存储单元的数相比, ;单元地址由BX+DI+100和BX+DI+101指出 CMPDX,DI ; 将DX和DI的内容相比

  43. 4.2.2 算术运算指令 3.乘法指令 • 乘法运算是双操作数运算,但是,在指令中却只指定一个操作数,另一个操作数是隐含规定的。 • 其中的操作数可以是寄存器操作数或存储器操作数,而隐含的为AL或AX。 • 指令格式: 无符号数乘法MUL SRC ;(AX) (AL)*(SRC)字节乘法 ;(DX,AX) (AX)*(SRC)字乘法 带符号数乘法IMUL SRC;操作同上 • 进行字节运算时,目的操作数必须是累加器AL,乘积在寄存器AX中。 • 进行字运算时,目的操作数必须是累加器AX,乘积在寄存器DX,AX中。

  44. 4.2.2 算术运算指令 • 注意: • 乘法指令运算结果只影响状态标志CF、OF。 • SRC只能是通用REG或M寻址,不能是立即数。 • 只能是字节乘字节或字乘字。 • 存储器寻址时加类型说明,如 MUL BYTE PTR [BX], • MUL WORD PTR [BX] • 例如: • MOV AL,0A3H ;(AL)=0A3H • MOV BL, 11H ;(BL)=11H • MUL BL ;(AX)=0AD3H

  45. 4.2.2 算术运算指令 4.除法指令 • 指令格式: 无符号数除法DIV SRC 带符号数除法IDIV SRC • 在除法运算中,如果除数是8位的,则要求被除数是16位的;如果除数是16位的,则要求被除数是32位的。

  46. 符号扩展指令: 字节扩展到字 CBW;将寄存器AL中的符号位扩展到寄存器AH 字扩展到双字 CWD;将寄存器AX中的符号位扩展到寄存器DX 7 AH 0 7 AL 0 CBW 0 15 DX 0 15 AX CWD 4.2.2 算术运算指令 • 注意: • 当除数是字节数据时,被除数必须放在AX中;当除数是字数据时,被除数必须放在DX,AX中。 • 除法指令运算结果对状态标志无定义。 • 8086/8088规定IDIV指令运算结果余数的符号与被除数相同。 • 当被除数位数不够时,需扩展到所需的位数,带符号数需进行符号位扩展。 • 若商超出字或字节表示的范围,自动产生 0 号中断

  47. 19 压缩BCD: 0001 1001 + 08 + 0000 1000 27 0010 0001 + 110 (0010 0111)BCD AF=1 4.2.2 算术运算指令 5.十进制(或BCD码)运算调整指令 BCD码:用二进制编码的十进制数,又称二--十进制数 压缩的BCD码:用4位二进制数表示1位十进制数 例:(59)10 =(0101 1001)BCD 非压缩的BCD码:用8位二进制数表示1位十进制数 例:(59)10 =(0000 0101 0000 1001)BCD 问题的提出:

  48. 4.2.2 算术运算指令 (1)压缩BCD码十进制调整指令 加法十进制调整指令 DAA(Decimal Adjust Addition) 功能:用于对两个压缩型BCD码相加之后的和(和必须放在AL中)进行调整,从而得到正确的压缩型BCD码。 • 调整方法: • 若(AL)低4位>9或AF=1,则(AL)+06H→(AL),并使AF=1 • 若(AL)高4位>9或CF=1,则(AL)+60H→(AL),并使CF=1 注意: *隐含的操作寄存器为AL *紧接在加法指令之后使用 * 影响除OF外的其余5个标志位

  49. 0101 1001 59 +)0110 1000 68 1100 0001 C1 +)0110 0110 66 10010 0111 127 4.2.2 算术运算指令 例:进行BCD码加法运算59+68=127 MOV AL,59H MOV BL,68H ADD AL,BL DAA 加法运算结果为C1, AF=1,高4位大于9 加66H进行压缩BCD调整,AF=1,CF=1 减法十进制调整指令DAS 功能:用于对两个压缩型BCD码相减之后的结果(和必须放在AL中)进行调整,从而得到正确的压缩型BCD码。 调整方法:减法十进制调整方法与加法十进制调整方法类同,只是将加变为减。

  50. 4.2.2 算术运算指令 (2)非压缩BCD码十进制调整指令 加法十进制调整AAA 功能:对两个非压缩BCD码相加之后的和(和必须放在AL中)进行调整 • 调整方法: • 若(AL)低4位>9或AF=1,则(AL)+06H→(AL),(AH)+1,并使AF=1; • 屏蔽掉(AL)高4位,即(AL)←(AL)∧0FH; • CF←AF 注意: *隐含的操作寄存器为AL *紧接在加法指令之后使用 * 只影响AF和CF两个状态标志位

More Related