330 likes | 520 Views
第 5 章 86 系列微型计算机的指令系统. 主要内容 86 系列汇编语言及指令的格式与寻址方式 传送类指令 数据操作类指令 串操作指令 控制类指令. 5.2 传送类指令. 传送类指令是指令系统中最活跃的一类指令,也是条数最多的一类指令,主要用于数据的保存及交换等场合。 传送类指令可以分为 4 种: 通用数据传送指令 目标地址传送指令 标志位传送指令 I/O 数据传送指令. 5.2 传送类指令. 说明: · 表示运算结果影响标志位, - 表示运算结果不影响标志位。. 5.2.1 通用数据传送指令. 通用数据传送指令包括: 1 .传送指令 MOV
E N D
第5章 86系列微型计算机的指令系统 主要内容 • 86系列汇编语言及指令的格式与寻址方式 • 传送类指令 • 数据操作类指令 • 串操作指令 • 控制类指令
5.2 传送类指令 • 传送类指令是指令系统中最活跃的一类指令,也是条数最多的一类指令,主要用于数据的保存及交换等场合。 • 传送类指令可以分为4种: • 通用数据传送指令 • 目标地址传送指令 • 标志位传送指令 • I/O数据传送指令
5.2 传送类指令 说明: ·表示运算结果影响标志位, - 表示运算结果不影响标志位。
5.2.1 通用数据传送指令 • 通用数据传送指令包括: 1.传送指令MOV 2.数据交换指令XCHG 3.查表转换指令 XLAT 4. 堆栈操作指令PUSH和POP 1. 最基本的传送指令MOV • MOV指令是形式最简单、用得最多的指令。它可以实现CPU内部寄存器之间的数据传送、寄存器和内存之间的数据传送,还可以把一个立即数送给CPU的内部寄存器或内存单元。 • 语句格式:MOV OPD,OPS • 功能:将源操作数传送入目的地址,源地址内容不变。即(OPS)→OPD。 • 对标志位的影响:无
5.2.1 通用数据传送指令 例如: • 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
5.2.1 通用数据传送指令 说明: (1)双操作数指令不允许两个操作数同时为段寄存器或存储器操作数 MOV seg ,seg ;错误 MOV mem ,mem ;错误 (2)立即数不能传送到段寄存器中。 MOV seg ,imm ; 错误 (3)目的操作数不允许使用CS段寄存器。 (4)指令指针IP,不能作为MOV指令的操作数 (5)dest与src必须类型匹配,即同时是字节或字类型。 (6)MOV指令不影响标志寄存器的值。
5.2.1 通用数据传送指令 例:错误的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
5.2.1 通用数据传送指令 2.交换指令 • 交换指令XCHG可以实现字节交换,也可以实现字交换。 • 格式:XCHG DEST ,SRC; • 功能:将源操作数与目的操作数的内容互换。 • 交换过程可以在CPU的内部寄存器之间进行,也可以在内部寄存器和存储单元之间进行,但不能在两个存储单元之间执行数据交换过程。 • 例如: XCHGAL,BL ;AL和BL之间进行字节交换 XCHGBX,CX ;BX和CX之间进行字交换 XCHG[2530],CX ;CX中的内容和2530,2531两单元的内 容交换
5.2.1 通用数据传送指令 3.换码指令 • XLAT是一条完成字节翻译功能的指令,它可以使累加器中的一个值变换为内存表格中的某一个值,一般用来实现编码制的转换。 • 语句格式:XLAT • 功能:将(BX)为首址(AL)为位移量的字节存储单元中的数据送AL寄存器。即([BX+AL])→AL。 • 使用换码指令时,要求BX寄存器指向表的首地址,AL的内容为表中某一项与表格首地址之间的偏移量,指令执行时,会将BX和AL中的值相加,把得到的值作为地址,然后将此地址所对应的单元中的值取到AL中去。
5.2.1 通用数据传送指令 下图表示了换码指令的功能。XLAT指令就是通过查表方式来完成翻译功能的,因此,在执行该指令之前,必须建立好一张翻译表,该表的最大容量为256字节。
5.2.1 通用数据传送指令 4.堆栈操作指令 堆栈作用: • 在调用一个过程时,保存返回地址; • 暂时存放寄存器或存储器单元操作数的内容。 进栈 PUSH SRC ; 操作: (SP) (SP)-2 ((SP)+1,(SP)) (SRC) 出栈 POP DST ; 操作:(DST)((SP)+1,(SP)) (SP) (SP)+2
5.2.1 通用数据传送指令 • 例如,将16位通用寄存器CX的内容压入堆栈,然后,弹出栈顶至CX中 • 已知:(SS)=0200H, (SP)=0008H, (CX)=12FAH。
5.2.2 目标地址传送指令 这是一类专用于传送地址码的指令,可用来传送操作数的段地址或偏移地址,共包含以下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指令有何区别?
5.2.2 目标地址传送指令 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 5.2.2 目标地址传送指令 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
5.2.2 目标地址传送指令 3.将地址指针装到ES和另一个寄存器的指令 • 语句格式:LES OPD,OPS • LES指令与LDS指令的操作基本相同,所不同仅在于将源操作数所指向地址指针中的段基址(后两个字节)传送到ES段寄存器,而不是DS段寄存器。
5.2.3 标志位传送指令 1.读取标志指令 • 语句格式:LAHF • 功能:将标志寄存器的低8位送入AH寄存器。 • 该指令的执行对标志位无影响。 2.设置标志指令SAHF • 语句格式:SAHF • 功能:将AH的内容送入标志寄存器的低8位,高8位不变。从该指令功能可看出,SAHF为LAHF的逆过程。
5.2.3 标志位传送指令 3.对标志寄存器的压入堆栈指令和弹出堆栈指令 • PUSHF指令将标志寄存器的值压入堆栈顶部,同时,堆栈指针SP的值减2,此指令在执行时标志寄存器的值不变。 • POPF指令的功能正好相反,此指令在执行时从堆栈中弹出一个字送到标志寄存器中,同时堆栈指针SP的值加2。 • PUSHF和POPF指令一般用在子程序和中断处理程序的首尾,起保存主程序标志和恢复主程序标志的作用。
5.2.4 输入/输出数据传送指令 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指端口号,即端口寄存器地址。
5.2.4 输入/输出数据传送指令 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]
5.2.4 输入/输出数据传送指令 直接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
5.3 数据操作类指令 • 86系列 CPU指令系统中,具有完备的加、减、乘、除算术运算指令,可处理不带符号或带符号的8/16位二进制整数,以及不带符号的装配型/拆开型十进制整数。 数据操作类指令包括以下几种类型的指令: • 算术运算指令 • 加法指令 • 减法指令 • 乘法指令 • 除法指令 • BCD码运算(十进制调整)指令 • 逻辑运算和移位指令 • 逻辑运算指令 • 移位指令 • 循环移位指令
5.3.1 算术运算类指令 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。
5.3.1 算术运算类指令 例如: 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中
5.3.1 算术运算类指令 例如: 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(只影响标志位,不回送结果,所影响的标志位见课本123页表5-4) • 以上五条指令均可作字或字节运算,而且除DEC不影响CF外,其他都按一般规则影响状态标志位 。
5.3.1 算术运算类指令 例如: 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所指的单元中
5.3.1 算术运算类指令 例如: 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的内容相比
5.3.1 算术运算类指令 3.乘法指令 • 乘法运算是双操作数运算,但是,在指令中却只指定一个操作数,另一个操作数是隐含规定的。 • 其中的操作数可以是寄存器操作数或存储器操作数,而隐含的为AL或AX。 • 指令格式: 无符号数乘法 MUL SRC ;(AX) (AL)*(SRC)字节乘法 ;(DX,AX) (AX)*(SRC)字乘法 带符号数乘法 IMUL SRC;操作同上 • 进行字节运算时,目的操作数必须是累加器AL,乘积在寄存器AX中。 • 进行字运算时,目的操作数必须是累加器AX,乘积在寄存器DX,AX中。
5.3.1 算术运算类指令 • 注: • 乘法指令运算结果只影响状态标志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
5.3.1 算术运算类指令 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 5.3.1 算术运算类指令 • 注: • 当除数是字节数据时,被除数必须放在AX中;当除数是字数据时,被除数必须放在DX,AX中。 • 除法指令运算结果对状态标志无定义。 • 8086/8088规定IDIV指令运算结果余数的符号与被除数相同。 • 当被除数位数不够时,需扩展到所需的位数,带符号数需进行符号位扩展。 • 若商超出字或字节表示的范围,自动产生 0 号中断
作业: P136 5.4-5.7