1.04k likes | 1.35k Views
第 4 章 80x86 微处理器的指令系统. 本章内容 Intel 80x86 的寻址方式 Intel 80x86 指令系统. 4.1 Intel 80x86 的寻址方式. 本章主要介绍 8086/8088 的指令系统以及在指令中为取得操作数地址所使用的寻址方式。. 汇编指令:. 操作码 操作数. 操作码 :指令操作类型; 操作数 :指令所需操作数或操作数的地址;操作数可以有一个,也可以有两个,一个源操作数,一个目的操作数。 例: MOV AX , CX ;将 CX 的内容送入 AX 中。.
E N D
本章内容 • Intel 80x86的寻址方式 • Intel 80x86指令系统
4.1 Intel 80x86的寻址方式 本章主要介绍8086/8088的指令系统以及在指令中为取得操作数地址所使用的寻址方式。 汇编指令: 操作码 操作数 操作码:指令操作类型; 操作数:指令所需操作数或操作数的地址;操作数可以有一个,也可以有两个,一个源操作数,一个目的操作数。 例: MOV AX,CX ;将CX的内容送入AX中。
4.1 Intel 80x86的寻址方式 • 寻址 • 根据指令内容确定操作数地址的过程,称为寻址。 • 有效地址 • 根据寻址方式计算所得到的地址叫做有效地址EA,也就是段内偏移地址。有效地址还需要与相应的段基地址组合才是20位的物理地址,该工作由CPU完成。 • 寻址方式在两种方式下被涉及: • 操作数的寻址方式和对调用或转移指令的寻址方式。 本讲只介绍对操作数的寻址!!!
操作数 寻址方式 立即数 立即数寻址 寄存器数 寄存器寻址 直接寻址 寄存器间接寻址 变址寻址 存储器数 基址变址寻址 串操作寻址 直接寻址 端口寻址 寄存器间接寻址 4.1 Intel 80x86的寻址方式 • 计算机中操作数按存放的方法分为: • 立即数(指令中) • 寄存器数 • 存储器数 • I/O端口
4.1.1 立即寻址 • 操作数紧跟在操作码后面,与操作码一起存放在一个代码段区域中,可以是8位也可以是16位。 • 例如:MOV AX,2345H MOV AL,80H 存储器 AH AL 立即数 代码段 AX 23H 45H 操作码 45H 23H
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
4.1.3 存储器操作数寻址方式 • 段寄存器使用的基本约定
BP----数据在堆栈段(段寄存器SS) BX • 基地址 SI----源地址 DI----目的地址 • 变址量 4.1.3 存储器操作数寻址方式 • 任何存储单元物理地址(PA)都由两部分组成:段基址+段内偏移地址(此单元与段基址的距离) • 段基值:是由某个段寄存器提供,由指令隐含给出。 • 段内的偏移地址又称为有效地址(EA),EA由三个地址分量组合而成。 • 位移量----8/16位二进制数;常以符号地址形式(变量或标号)出现在指令中 数据默认在数据段(DS); 可用段前缀指定(改变)
.... 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] * 适于处理单个变量
(BX) (SI) (DI) 2、寄存器间接寻址 • 操作数存放在存储器中,操作数的有效地址EA存放在寄存器BX 、SI、DI 或BP之一中。 • BX,SI,DI 操作数在数据段(DS) • BP 操作数在堆栈段(SS) • 物理地址 = 10H (SS) + (BP) • 物理地址 = 10H (DS) +
.... 操作码 代码段 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
(BX) (BP) (SI) (DI) 8位 16位 位移量 + 有效地址 EA= 3、变址寻址(寄存器相对寻址) • EA是两个地址分量----基址寄存器或变址寄存器的内容与指令中给出的位移量(8/16位)之和 • 隐含段地址:SI、DI、BX为DS;BP为SS。可用段跨越。
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 ....
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
基址 变址 (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)
4.2 Intel 80x86指令系统 • 指令:控制计算机完成指定操作的命令 • 指令系统:所有指令的集合 • 8086/8088指令系统共包含92种基本指令 • 8086指令按照功能分为6大类: • 数据传送指令 14条 • 算术运算指令 20条 • 逻辑运算和移位指令 13条 • 串操作指令 13条 • 控制转移指令 28条 • 处理器控制指令 12条
4.2.1 数据传输指令 说明: ·表示运算结果影响标志位, - 表示运算结果不影响标志位。
(一)通用数据传输指令 • 通用数据传送指令包括: 1.传送指令MOV 2.数据交换指令XCHG 3.查表转换指令 XLAT 4. 堆栈操作指令PUSH和POP 1.最基本的传送指令MOV • MOV指令是形式最简单、用得最多的指令。它可以实现CPU内部寄存器之间的数据传送、寄存器和内存之间的数据传送,还可以把一个立即数送给CPU的内部寄存器或内存单元。 • 语句格式:MOV OPD,OPS • 功能:将源操作数传送入目的地址,源地址内容不变。即(OPS)→OPD。 • 对标志位的影响:无
(一)通用数据传输指令 例如: • 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
(一)通用数据传输指令 注意: (1)双操作数指令不允许两个操作数同时为段寄存器或存储器操作数 MOV seg ,seg ;错误 MOV mem ,mem ;错误 (2)立即数不能传送到段寄存器中。 MOV seg ,imm ; 错误 (3)目的操作数不允许使用CS段寄存器。 (4)指令指针IP,不能作为MOV指令的操作数 (5)dest与src必须类型匹配,即同时是字节或字类型。 (6)MOV指令不影响标志寄存器的值。
(一)通用数据传输指令 例:错误的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
(一)通用数据传输指令 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
(一)通用数据传输指令 例如:将16位通用寄存器CX的内容压入堆栈,然后,弹出栈顶至CX中 已知:(SS)=0200H,(SP)=0008H,(CX)=12FAH
(一)通用数据传输指令 8086/8088系统的堆栈具有如下特点: • 堆栈是在内存的堆栈段中,具有“先进后出”的特点; • 堆栈只有一个出入口,即当前栈顶为空时,栈顶和栈底指向同一内存单元; • 堆栈有两个基本操作:PUSH(进栈)和POP(出栈)。PUSH操作使栈顶向低地址方向移动,而POP操作则刚好相反; • 堆栈操作只能作字操作; • SS:SP在任何时候都指向当前的栈顶。
(一)通用数据传输指令 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两单元的内容交换
(一)通用数据传输指令 4.查表指令 • XLAT是一条完成字节翻译功能的指令,它可以使累加器中的一个值变换为内存表格中的某一个值,一般用来实现编码制的转换。 • 语句格式:XLAT • 功能:将(BX)为首地址(AL)为位移量的字节存储单元中的数据送AL寄存器。即([BX+AL])→AL。 • 使用换码指令时,要求BX寄存器指向表的首地址,AL的内容为表中某一项与表格首地址之间的偏移量,指令执行时,会将BX和AL中的值相加,把得到的值作为地址,然后将此地址所对应的单元中的值取到AL中去。
(一)通用数据传输指令 下图表示了换码指令的功能。XLAT指令就是通过查表方式来完成翻译功能的,因此,在执行该指令之前,必须建立好一张翻译表,该表的最大容量为256字节。
(二)地址传送指令 这是一类专用于传送地址码的指令,可用来传送操作数的段地址或偏移地址,共包含以下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指令有何区别?
(二)地址传送指令 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
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
(二)地址传送指令 3.将地址指针装到ES和另一个寄存器的指令 • 语句格式:LES OPD,OPS • LES指令与LDS指令的操作基本相同,所不同仅在于将源操作数所指向地址指针中的段基址(后两个字节)传送到ES段寄存器,而不是DS段寄存器。
(三)标志传送指令 1.读取标志指令 • 语句格式:LAHF • 功能:将标志寄存器的低8位送入AH寄存器。 • 该指令的执行对标志位无影响。 2.设置标志指令SAHF • 语句格式:SAHF • 功能:将AH的内容送入标志寄存器的低8位,高8位不变。从该指令功能可看出,SAHF为LAHF的逆过程。
(三)标志传送指令 3.对标志寄存器的压入堆栈指令和弹出堆栈指令 • PUSHF指令将标志寄存器的值压入堆栈顶部,同时,堆栈指针SP的值减2,此指令在执行时标志寄存器的值不变。 • POPF指令的功能正好相反,此指令在执行时从堆栈中弹出一个字送到标志寄存器中,同时堆栈指针SP的值加2。 • PUSHF和POPF指令一般用在子程序和中断处理程序的首尾,起保存主程序标志和恢复主程序标志的作用。
(四)输入/输出指令 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指端口号,即端口寄存器地址。
(四)输入/输出指令 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]
(四)输入/输出指令 直接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
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。
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中
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页)
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所指的单元中
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的内容相比
4.2.2 算术运算指令 3.乘法指令 • 乘法运算是双操作数运算,但是,在指令中却只指定一个操作数,另一个操作数是隐含规定的。 • 其中的操作数可以是寄存器操作数或存储器操作数,而隐含的为AL或AX。 • 指令格式: 无符号数乘法MUL SRC ;(AX) (AL)*(SRC)字节乘法 ;(DX,AX) (AX)*(SRC)字乘法 带符号数乘法IMUL SRC;操作同上 • 进行字节运算时,目的操作数必须是累加器AL,乘积在寄存器AX中。 • 进行字运算时,目的操作数必须是累加器AX,乘积在寄存器DX,AX中。
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
4.2.2 算术运算指令 4.除法指令 • 指令格式: 无符号数除法DIV SRC 带符号数除法IDIV SRC • 在除法运算中,如果除数是8位的,则要求被除数是16位的;如果除数是16位的,则要求被除数是32位的。
符号扩展指令: 字节扩展到字 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 号中断
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 问题的提出:
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个标志位
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码。 调整方法:减法十进制调整方法与加法十进制调整方法类同,只是将加变为减。
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两个状态标志位