为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

第五章第二部分

2011-04-01 50页 ppt 1MB 20阅读

用户头像

is_881698

暂无简介

举报
第五章第二部分null8086和8088的指令系统8086和8088的指令系统传送类指令 数据操作类指令 串操作指令 控制类指令本章要求编程与程序调试传 送 类 指 令传 送 类 指 令 传送类指令是指令系统中最活跃的一类指令,也是条数最多的一类指令,主要用于数据的保存及交换等场合。这类指令分为以下四种:   通用数据传送指令   目标地址传送指令   标志位传送指令   输入/输出数据传送指令 小结返 回通用数据传送指令通用数据传送指令 通用数据传送指令主要由以下几部分组成: ...
第五章第二部分
null8086和8088的指令系统8086和8088的指令系统传送类指令 数据操作类指令 串操作指令 控制类指令本章要求编程与程序调试传 送 类 指 令传 送 类 指 令 传送类指令是指令系统中最活跃的一类指令,也是条数最多的一类指令,主要用于数据的保存及交换等场合。这类指令分为以下四种:   通用数据传送指令   目标地址传送指令   标志位传送指令   输入/输出数据传送指令 小结返 回通用数据传送指令通用数据传送指令 通用数据传送指令主要由以下几部分组成: 最基本的传送指令 堆栈操作指令 数据交换指令 查表换码指令返 回特点: 该类指令的执行对标志位不产生影响 最基本的传送指令最基本的传送指令 指令:MOV 目的操作数,源操作数 指令功能:实现CPU内部寄存器之间的数据传送、寄存器和内存之间的数据传送,以及把一个立即数送给CPU的内部寄存器或者内存单元。 示 例返 回MOV指令示例MOV指令示例 MOV ES, DX ; DX中16位数据送ES MOV AX, [BX] ; BX和BX+1所指的两个内存单元的内容送AX MOV [DI], AX ; 累加器的内容送DI和DI+1所指的两个单元 MOV CX, [1000H] ; 将1000H和1001H两单元的内容送CX MOV DX, 5040H ; 立即数5040H送DX MOV WORD PTR[SI], 6070H ; 立即数6070送SI和SI+1所指 的两个单元; 这里的PTR是一个汇编操作符,与前 面的 WORD一起,意思是从SI地址中取一个字; 而不是一个字节一般数据传送指令一般数据传送指令注意: 两操作数字长必须相同 两操作数不允许同时为存储器操作数 两操作数不允许同时为段寄存器 在源操作数是立即数时,目标操作数不能是段寄存器 IP和CS不作为目标操作数,FLAGS一般也不作为操作数在指令中出现一般数据传送指令应用例一般数据传送指令应用例将(*) 的ASCII码2AH送入内存1000H开始的100个 单元中: MOV DI,1000H MOV CX,64H MOV AL,2AH AGAIN:MOV [DI],AL INC DI ;DI+1 DEC CX ;CX-1 JNZ AGAIN ;CX≠0则继续 HLT 上段程序在代码段中的存放形式上段程序在代码段中的存放形式设CS=109EH,IP=0100H,则各条指令存放地址 如下: CS : IP 109E:0100 MOV DI,1000H 109E:0103 MOV CX,64H 109E:0106 MOV AL,2AH 109E:0108 MOV [DI],AL 109E:010A INC DI 109E:010B DEC CX 109E:010C JNZ 0108 109E:010E HLT数据段中的分布 数据段中的分布 送上2AH后数据段中相应存储单元的内容改变如下: DS:1000 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A DS:1010 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A DS:1020 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A DS:1030 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A DS:1040 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A DS:1050 2A 2A 2A 2A 2A 2A 2A 2A-2A 2A 2A 2A 2A 2A 2A 2A DS:1060 2A 2A 2A 2A 00 00 00 00 00 00 00 00 00 00 00 00偏移地址[DI]返 回堆栈操作指令堆栈操作指令指令格式:PUSH 源操作数/POP 目的操作数 实现功能:完成对寄存器的值的保存和恢复 注意事项:使用堆栈操作指令时,应预置堆栈段寄存器SS、堆栈指示器SP的值,使SP指向当前堆栈段的栈顶。在执行PUSH指令时,堆栈指示器SP自动减2;然后,将一个字以源操作数传送至栈顶。POP指令是将SP指出的当前堆栈段的栈顶的一个操作数,传送到目的操作数中,然后,SP自动加2,指向新的栈顶。flash堆栈操作指令堆栈操作指令掌握: 有关堆栈的概念 栈顶、栈首、栈底 堆栈指令的操作原理 执行过程,执行结果堆栈操作的原则后进先出 以字为单位堆栈操作指令堆栈操作指令压栈指令 PUSH 执行过程: (SP)←(SP)-2 (SP)-1←操作数高字节 (SP)-2←操作数低字节出栈指令POP执行过程: (SP) 操作数低字节 (SP)+1 操作数高字节 (SP)←(SP)+2 压栈指令的操作压栈指令的操作设AX=1234H,SP=1200H,执行 PUSH AX 指令后堆栈区的状态: 堆栈段出栈指令的操作出栈指令的操作执行 POP AX 堆栈区的状态:堆栈操作指令说明堆栈操作指令说明指令的操作数必须是16位的 操作数可以是寄存器或存储器两单元,但不能是立即数 不能从栈顶弹出一个字给CS PUSH和POP指令在程序中一般成对出现 PUSH指令的操作方向是从高地址向低地址,而POP指令的操作正好相反堆栈操作指令示例堆栈操作指令示例例:将16位通用寄存器CX的内容压入堆栈,然后,弹出栈顶至CX中,已知:(SS)=0200H, (SP)=0008H, (CX)=12FAH,其示意图如下所示: PUSH CX 指令的操作过程示意图 PUSH CX 指令的操作过程示意图堆栈操作指令示例堆栈操作指令示例 堆栈中的内容是按后进先出的次序进行传送的,因此,保存内容和恢复内容时,要按照对称的次序执行一系列压入指令和弹出指令.例如: PUSH DS PHSH ES …… POP ES POP DS•••返 回数据交换指令数据交换指令指令格式:XCHG 目的,源 指令功能:实现字节、字交换。交换过程可以在CPU的内部寄存器之间进行,也可以在内部寄存器和存储单元之间进行。 注意:不能在两个存储单元之间执行数据交换过程,两操作数必须有一个是寄存器操作数。 不允许使用段寄存器。两操作数应等长。 示 例返 回数据交换指令示例数据交换指令示例 1 XCHG AL, BL ; AL和BL之间进行字节换 2 XCHG BX, CX  ; BX和CX之间进行字交换 3 设(DS)=2000H,(22530H)=88H, (22531H)=66H, 执行指令XCHG [2530H], CX 后(CX)=? CX中的内容和数据段中的2530、2531H两单元的内容交换返 回(CX)=6688H换 码 指 令换 码 指 令指令格式:XLAT 实现功能:它可以使累加器中的一个值变换为内存中的某一个值,一般用来实现编码制的转换。 指令说明:使用换码指令时,要求BX寄存器指向表的首地址,AL中为表中某一项与表格首地址之间的偏移量,指令执行时,会将BX和AL中的值相加,把得到的值作为地址,然后将此地址所对应的单元中的值取到AL中去。 XLAT指令就是通过查表方式来完成翻译功能的,因此,在执行该指令之前,必须建立好一张翻译表,该表的最大容量为256字节。 示 例返 回查表指令例查表指令例数据段中存放有一 张ASCII码转换表, 设首地址为2000H, 现欲查出表中第11 个代码的ASCII码 (设DS=4000H) 查表指令例查表指令例可用如下指令实现: MOV BX,2000H ;(BX)←表首地址 MOV AL,0BH ;(AL)←序号 XALT ; 查表转换 执行后得到:(AL)=42H 换码指令示例换码指令示例 例:将十进制数字(0—9)翻译成七段显示码的译码表,执行XLAT指令通过查表可将任意一个十进制数翻译成七段显示码。其操作步骤如下: (1)将译码表定位到某个逻辑段的一片连续地址中, 并将其表首地址的偏移量置入BX寄存器中; (2)将待翻译的十进制数字送入AL寄存器中; (3)执行XLAT指令。 例如,假设这段数据存放在偏移量地址为2000H开始的内存中 取出“3”所对应的七段码,用如下几条程序助记符即可完成: MOV BX, 2000H MOV AL, 3 XLAT返 回表 表十进制数的七段显示码 表十进制数的七段显示码返 回目标地址传送指令目标地址传送指令这是一类专用于传送地址码的指令,可用来传送操作数的段地址或偏移地址,共包含以下三条指令: 一、取有效地址指令 二、将地址指针装到DS和另一个寄存器的指令 三、将地址指针装到ES和另一个寄存器的指令返 回取有效地址指令LEA取有效地址指令LEA指令格式:LEA 目标,源 指令功能:将存储器地址送到一个寄存器。 说明:LEA指令格式中,要求源操作数必须为内存单元地址,目的操作数必须为一个16位的通用寄存器。LEA常用来使一个寄存器作为地址指针。返 回示 例取有效地址指令示例取有效地址指令示例LEA BX, [BP+SI] ; 指令执行后,BX中的内容 为BP+SI的值 LEA SP, [0428H] ; 使堆栈指针SP为0482H思考:试比较下面两条指令的不同LEA AX, [2728H] MOV AX, [2728H] 将2728H单元的偏移量送AX指令执行后,AX中为2728H 将2728H单元中的内容送到AX中LEA指令LEA指令比较下列指令: LEA SI,DATA1 MOV SI,DATA1 MOV AX,[BX] LEA AX,[BX]符号地址LEA指令在程序中的应用LEA指令在程序中的应用将数据段中首地址为MEM1 的50个字节的数据传送到同一逻辑段首地址为MEM2的区域存放。编写相应的程序段 LEA指令在程序中的应用LEA指令在程序中的应用 开 始取源地址取目标地址送数据块长度到CL传送一个字节修改地址指针修改计数值计数值=0? 结 束NYLEA指令在程序中的应用LEA指令在程序中的应用 LEA SI,MEM1 LEA DI,MEM2 MOV CL,50 NEXT: MOV AL,[SI] MOV [DI],AL INC SI INC DI DEC CL JNZ NEXT HLT 返 回P 133LDS 指 令LDS 指 令指令格式:LDS 目标,源 指令功能:是把四个字节的地址指针(其中包括一个段地址和一个偏移量)传送到两个目的寄存器,其中,地址指针的后两个字节即段地址一定送到DS中。 示例:执行指令 LDS DI, [2130H] 执行该指令后使2130H和2131H这两个单元中的地址偏移量送到DI,2132H和2133H中的段地址值送到DS。LDS指令例LDS指令例例:下列指令执行后结果如何? LDS DI,[1200H] MOV AX,[DI](DS) = 6000H (DI) = 1234H (AX) = 2233H返 回LES 指 令LES 指 令指令格式:LES 目标,源 功能:是把四个字节的地址指针(其中包括一个段地址和一个偏移量)传送到两个目的寄存器,其中,地址指针的后两个字节即段地址一定送到ES中。基本相同,所不同仅在于将源操作数所指的地址指针中的段基址(后两个字节)传送到ES段寄存器,而不是DS段寄存器。思考:LES指令与LDS指令的操作有何不同?LES指令例LES指令例 LES DI,[1200H] MOV AX,[DI]返 回标志位传送指令标志位传送指令 可完成标志位传送的指令共有以下四条: 一、读取标志指令 二、设置标志指令 三、对标志寄存器的压入堆栈和弹出堆 栈指令返 回读取标志指令LAHF读取标志指令LAHF读取标志指令LAHF被执行时,将标志寄存器中的低8位传送到AH中,其指令隐含操作数AH,操作示意图如下所示:返 回LAHF指令的功能示意图设置标志指令SAHF设置标志指令SAHF设置标志指令SAHF被执行时,将AH寄存器的相应位传送到标志寄存器的低8位。其指令隐含操作数AH,操作示意图如下所示:返 回AHFLAGSAHF指令的功能示意图PUSHF和POPF指令PUSHF和POPF指令PUSHF指令: 将标志寄存器的值压入堆栈顶部,同时,栈指针SP的值减2,此指令在执行时标志寄存器的值不变。 POPF指令的功能正好相反。 PUSHF和POPF指令的作用:隐含操作数FLAGS。一般用在子程序和中断处理程序的首尾,起保存主程序标志和恢复主程序标志的作用。返 回输入/输出数据传送指令输入/输出数据传送指令格式:IN 累加器,端口/OUT 端口,累加器 功能:输入/输出指令用来完成累加器AX/AL与 I/O端口之间的数据传送。 说明:执行输入指令IN时,CPU可以从一个8位端口读入一个字节到AL中,也可以从两个连续的8位端口读入一个字到AX中。 执行输出指令OUT时,CPU可以将AL中的一个字节写到一个8位端口中,或者将AX中的一个字写到两个连续的8位端口中。示 例返 回输入/输出数据指令寻址方式输入/输出数据指令寻址方式直接寻址 直接给出8位端口地址,可寻址256个端口(0-FFH) 间接寻址 16位端口地址由DX指定,可寻址64K个端口(0-FFFFH)输入/输出数据传送指令示例输入/输出数据传送指令示例 IN AX, 50H ; 将50H、51H两端口的值读入AX,50H端口的内 容读入AL,51H端口的内容读入AH IN AX, DX ; 从DX和DX+1 所指的两个端口中读取一个字, 低地址端口中的值读入AL中,高地址端口中 的值读入AH中 OUT 44H, AL ;将AL的内容输出到地址为44H的端口 MOV DX,0345H MOV AL, 45H OUT DX, AL返回;将45H输出到地址为0345H的端口指令小结一指令小结一例讲解例题讲解1、假设(SS)=2250H,(SP)=0140H,如果在堆栈中存入5个数据,则栈顶的物理地址为( )H。如果又从堆栈中取出3个数据,则栈顶的物理地址为( )H。 226362263Cnull2、指令 LEA BX,[BX + SI + 0F62H] 执行前(BX)=0400H (SI)=003CH,该指令执行后(BX)=?注意:在此BX寄存器得到的是偏移地址而不是该存储单元 的内容(BX)=0400 + 003C + 0F62 = 139EH例题讲解3、已知指令 LDS SI,[10H] 执行前(DS)=C000H,(C0010H)=80H, (C0011H)=01H, (C0012H)=00H ,(C0013H)=20H, 指令执行后(SI)=? (DS)=?(SI)=0180H,(DS)=2000H返 回数据操作类指令数据操作类指令 此类指令主要包括以下三种:  一、算术运算类指令  二、逻辑运算指令  三、移位指令 四、小结返 回算术运算类指令算术运算类指令8086/8088指令系统中,具有完备的加、减、乘、除算术运算指令,可处理不带符号或带符号的8/16位二进制整数,以及不带符号的装配型/拆开型十进制整数。 一、加法指令 二、减法指令 三、乘法指令 四、除法指令 五、BCD码运算指令返回算术运算指令的执行大多对状态标志位会产生影响加 法 指 令加 法 指 令加法指令有以下三条: 一、不带进位位的加法指令ADD 二、带进位位的加法指令ADC 三、增量指令INC 指令说明…返回不带进位位的加法指令不带进位位的加法指令指令格式:ADD DST, SRC ; (DST) (DST)+(SRC) 指令功能:用来执行2个字或2个字节的相加操作,结果放在原来存放的目的操作数的地方。 例如: ADD AL, 50H ; AL和50H相加,结果放在AL中 ADD AX, [BX+2000H] ; BX+2000H和BX+2001H所指 ;的两单元的内容和AX的内容 ;相加,结果放在AX中。返 回示例注意:ADD指令的执行对全部6个状态标志位都产生影响带进位位的加法指令带进位位的加法指令指令格式: ADC DST, SRC ;(DST) (DST)+(SRC)+CF 指令功能: 指令格式、对操作数的要求、对标志位的影响与ADD指令完全一样,指令执行时,将进位标志CF的值加在和中。 ADC指令多用于多字节数相加,使用前要先将CF清零。示例返回ADD指令例ADD指令例例题: MOV AL,78H ADD AL,99H 指令执行后6个状态标志位的状态标志位状态: CF= SF= AF= ZF= PF= OF=返回ADC和ADD指令示例ADC和ADD指令示例 例:有两个四字节的无符号数相加,这两个数分别放在2000H和3000H开始的存储单元中,低位在前,高位在后,和放在2000H开始的存储单元中: MOV SI, 2000H; MOV AX, [SI]; MOV DI, 3000H; ADD AX, [DI]; MOV [SI], AX; MOV AX, [SI+2]; ADC AX, [DI+2]; MOV [SI+2], AX;返回增 量 指 令增 量 指 令指令格式:INC OPR ; (OPR) (OPR)+1 指令功能:只有一个操作数,操作数内容加1。这条指令一般用在循环程序中修改地址指针和循环次数,但该指令不影响进位标志CF的状态。 例如: INC AL ; 将AL中的内容加1 INC CX; 将CX中的内容加1返回不能是段寄存器或立即数加 法 指 令说 明加 法 指 令说 明在ADD、ADC、INC指令中,除INC指令不影响CF标志位外,它们都影响状态标志位(AF,OF,PF,SF,ZF,CF),其中主要是OF,SF,ZF,CF四种标志位。 ADD、ADC、INC这三条加法指令都可以完成字或字节运算。返回减 法 指 令减 法 指 令减法指令主要有以下五条: 一、不带借位的减法指令SUB 二、带借位的减法指令SBB 三、减量指令DEC 四、取补指令NEG 五、比较指令CMP指令说明…返回不带借位的减法指令不带借位的减法指令指令格式:SUB DST, SRC ; (DST) (DST)-(SRC) 指令功能:完成2个字或2个字节的相减操作。 例如: SUB BX,CX ;将BX中的内容减去CX中的内 ;容,结果在BX中 SUB [BP+2], CL ;将SS段的BP+2所指的单元 ;中的值减去CL中的值,结 ;果放在BP+2所指的单元中返回对标志位的影响与ADD指令同带借位的减法指令带借位的减法指令指令格式: SBB DST, SRC; (DST) (DST)-(SRC)-CF 指令功能: 形式和功能同SUB,指令执行减法运算时,还要减去CF的值。 例如: SBB AX, 2030H ; 将AX的内容减去立即数 ;2030H,并减去进位位CF ;的值返回减 量 指 令减 量 指 令指令格式: DEC OPR ; (OPR) (OPR-1) 指令功能: 只有一个操作数,执行时,将操作数的值减1,再将结果送回操作数。指令对操作数的要求与INC相同,常用于在程序中修改计数值 例如: DEC AX ;将AX的内容减1,再送回AX中 DEC BL ;将BL的内容减1,再将结果送回BL中应用程序例应用程序例 MOV BL,2 NEXT1 : MOV CX,0FFFFH NEXT2: DEC CX JNZ NEXT2 DEC BL JNZ NEXT1 HLT 返回P133 ?取 补 指 令取 补 指 令指令格式: NEG OPR ; (OPR) 0-(OPR) 或 (OPR) 0FFFFH-(OPR)+1 指令功能:对指令中给定的操作数取补码,再将结果送回操作数。 例如: NEG AL ; 将AL中的数取补码,送回AL NEG CX ; 将CX中的内容取补码,送回CX返回取 补 指 令 说 明取 补 指 令 说 明当操作数的值为-128(80H)或-32768(8000H),求补后结果没有变化。 NEG指令影响标志位:AF,OF,PF,SF,ZF,CF,此指令执行时,总是使CF=1,只有操作数为0时,CF=0,因为是0减操作数之故。返回比 较 指 令比 较 指 令指令格式: CMP OPR1, OPR2 ; (OPR1)-(OPR2) 指令功能:比较指令CMP也是执行两个数相减操作,但不送回相减的结果,只是影响标志位。可作为条件转移指令转移的条件。指令对操作数的要求及对标志位的影响同SUB指令。 例如: CMP AX, 2000H ; 将AX的内容和2000H相比较,结 果影响标志位。返回表比 较 指 令比 较 指 令表 CMP指令执行后标志位的状态目的的操作数与源操作数的关系CF ZF SF OF带符号位 的操作数无符号位的操作数 0 1 0 0— 0 1 0— 0 0 1— 0 0 0— 0 1 1 0 1 0 0 1 0 — — 0 0 — —CMP指令CMP指令两个无符号数的比较: CMP AX,BX 若 AX > BX CF=0 若 AX < BX CF=1 两个带符号数的比较 CMP AX,BX 两个数的大小由OF和SF共同决定 OF和SF状态相同 AX > BX OF和SF状态不同 AX < BX CMP指令例CMP指令例 LEA BX,MAX LEA SI,BUF MOV CL,20 MOV AL,[SI] NEXT:INC SI CMP AL,[SI] JNC GOON ;CF=0转 XCHG [SI],AL GOON:DEC CL JNZ NEXT MOV [BX],AL HLT程序功能 ?P133 ?程序功能程序功能找20个数中最大的数,并将其存放在MAX单元中返回减 法 指 令 说 明减 法 指 令 说 明 五条减法指令中,除DEC指令不影响CF标志位外,它们都影响状态标志位。 五条减法指令都可以完成字或字节运算。返回乘 法 指 令乘 法 指 令乘法指令采用隐含寻址,隐含的是存放被乘数的累加器AL或AX及存放结果的AX,DX;将DX寄存器看成是AX寄存器的扩展,当得到16位乘积时,结果放在AX中;当得到32位乘积时,结果放在DX和AX两个寄存器中,DX为乘积的高16位,AX为乘积的低16位。 若运算结果的高位全为0或1,表示其为无效数据,OF=CF=0   一、无符号的乘法指令MUL 二、有符号的乘法指令IMUL返回无符号的乘法指令无符号的乘法指令指令格式: MUL SRC ; 字节操作:(AX) (AL)*(SRC) 字操作:(DX,AX) (AX)*(SRC) 例如: MUL BL ; AX AL*BL MUL CX ; DX+AX AX*CX注意:SRC不能是立即数无符号数乘法指令例无符号数乘法指令例MUL BYTE PTR[BX]┇ BXXXHAL ×XXHAX返回有符号的乘法指令有符号的乘法指令指令格式: IMUL SRC ; 字节操作:(AX) (AL)*(SRC) 字操作:(DX,AX) (AX)*(SRC) 指令说明: 有符号乘法指令IMUL,它在形式上与MUL类似,只是要求两个乘数必须均为有符号数。并且,两个乘法指令影响标志位CF和OF,其余四个标志位无意义。IMUL指令例IMUL指令例设:AL=FEH,CL=11H,求AL与CL的乘积。 若为无符号数,则 MUL CL 结果:AX=10DEH 若将两操作数看作有符号数,则: IMUL CL 指令执行后:AX=FFDEH=-34。 IMUL指令将OPRD视为带符号数,运算时若操作数为负数,要先将操作数求补码,运算后再将结果求补。返回除法指令除法指令执行除法指令时,除数必须为被除数的一半字长。 除法指令相关指令主要有以下四条: 一、 无符号的除法指令DIV 二、 有符号的除法指令IDIV 三、 字节转换指令CBW 四、 字转换指令CWD返回小结除法指令除法指令无符号除法指令 DIV OPRD 有符号除法指令 IDIV OPRD若OPRD是字节数,则执行AX/OPRD 若OPRD是双字节数,则执行 DXAX/OPRD 注意:指令是隐含寻址方式,要求被除数是除数的双倍字长AL=商 AH=余数AX=商 DX=余数返回无符号的除法指令无符号的除法指令指令格式: DIV SRC ; 指令功能:实现两个操作数除法运算。 字节操作时,16位被除数在AX中,8位除数为源操作数,8位商在AL中,8位余数在AH中。表示为: (AL) (AX)/(SRC)的商;(AH) (AX)/(SRC)的余数 字操作时,32位被除数在DX,AX中,其中DX存高16位,AX中存低16位,16位除数为源操作数,16位商在AX中,16位余数在DX中,表示为: (AX) (DX, AX)/(SRC)的商; (AX) (DX, AX)/(SRC)的余数返回有符号的除法指令有符号的除法指令指令格式: IDIV SRC; 指令功能: 功能同无符号除法运算指令。但操作数必须是带符号数。商和余数也为带符号数,且和被除数符号相同。返回乘法和除法小结乘法和除法小结 乘法操作小结除法操作小结返回字位扩展指令 字位扩展指令 将符号数的符号位扩展到高位 指令为零操作数指令,采用隐含寻址,隐含的操作数为AX及AX,DX 无符号数的扩展规则为在高位补0字节到字的扩展指令字节到字的扩展指令格式: CBW 操作:将AL内容扩展到AX,将AL寄存器 中的符号位扩展到AH中 规则:若最高位=1,则执行后AH=FFH 若最高位=0,则执行后AH=00H 示例:MOV AL,8EH CBW (AX)=FF8EH字到双字的扩展指令字到双字的扩展指令格式: CWD 操作:将AX内容扩展到DX AX;将AX寄存 器中的符号位扩展到DX中, 规则:若最高位=1,则执行后DX=FFFFH 若最高位=0,则执行后DX=0000H 示例:MOV AX,43FFH CWD (DX:AX)=000043FFHCBW & CWDCBW & CWD字节扩展指令和字扩展指令用在什么场合?举例说明。答:遇到两个字节或字相除时,要预先执行CBW或CWD指令,产生一个双倍长度的被除数。特别注意这两条指令只能对AL,AX进行扩展。例如: MOV BL,3 MOV AL,-12 CBW ;扩展AL中符号位至AH IDIV BL 或: MOV BX,3 MOV AX,-12 CWD ;扩展AX中符号位至DX IDIV BX 返回BCD码运算指令BCD码运算指令BCD码:是一种用二进制编码的十进制数。 分类: 压缩BCD码(组合BCD码):即用一个字节表示两位BCD码; 非压缩BCD码(非组合BCD码):即用一个字节表示一位BCD码,高四位为零。为什么使用BCD码调整?BCD码运算指令返回为什么使用BCD码调整?为什么使用BCD码调整?例一:8+7=15。用组合的BCD码表示,运算结果为: 即结果为0FH。在BCD码中,只允许0~9这10个数字出现,0FH不代表任何BCD 码,因此要对它进行变化。BCD码应该是逢10进1,但计算机在这里是逢16进1。因此,可以在个位上补一个6,让其产生进位,而此进位作为十位数出现。 结论:如果一位BCD码所对应的4位二进制超过9,那就应该补上一个6产生进位来进行调整。BCD码调整例题BCD码调整例题9+9=18,用组合BCD码表示运算过程为:错误的原因是:计算机在运算时,遇到低四位往高四位产生进位时是按照逢16进1的规则进行的,但BCD 码要求逢10进1,可见,BCD码运算时只要产生了进位,就会丢失一个6。因此,在出现进位时要进行调整。 结论:对BCD码进行运算时,只要AF变为1就要在低6位进行调整。结果为12调整原理调整原理总结: 凡是遇上某4位二进制码对应的BCD码大于9时,则加6进行调整;凡是遇上低4位产生了进位时,则加6进行调整。 当对多个字节进行BCD码运算时,如果低位字节往高位字节产生进位则CF=1,而当一个字节的低4位往高4位产生进位时,AF=1。十进制调整指令会根据CF和AF的值判断是否进行“加6调整”,并进行具体的调整操作。然后,程序再对高位字节进行运算,再进行十进制调整。返回BCD码调整指令BCD码调整指令共6条,均为隐含寻址方式,隐含的操作数是 AL或AL、AH; 不能单独使用,要紧跟在相应的算术运算指令 之前后; 执行结果为压缩BCD码或扩展BCD码表示的十进制数。BCD码运算指令BCD码运算指令 BCD码运算指令主要有以下四种: 压缩的BCD码调整指令: DAA —— 加法十进制调整指令 DAS —— 减法十进制调整指令 非压缩的BCD码调整指令: AAA —— 加法的ASCII调整指令 AAS —— 减法的ASCII调整指令 AAM —— 乘法的ASCII调整指令 AAD —— 除法的ASCII调整指令返回非组合BCD码加法十进制调整指令非组合BCD码加法十进制调整指令指令格式: AAA 指令功能: 实现两个非组合BCD码相加结果的和存放到AL寄存器中的调整,指令把AL调整到非压缩的BCD码格式,AH中存放调整产生的进位值。 指令说明: 指令影响标志位:AF和CF,而PF,SF,ZF,OF无意义。加法指令应用例加法指令应用例 计算2658+3619=? 结果存放在SUM单元 设被加数和加数的每一位都以ASCII码形式存放在内存中,低位在前,高位在后。加法指令应用例加法指令应用例 LEA SI,STRING1 LEA DI,STRING2 LEA BX,SUM MOV CX,4 CLC NEXT: MOV AL,[SI] ADC AL,[DI] AAA MOV [BX],AL INC SI INC DI INC BX DEC CX JNZ NEXT返回调整规则?BCD加法示例BCD加法示例 ADD AL,BL DAA 如指令执行前,(AL)=28,(BL)=68 执行ADD指令后(AL)=90,CF=0,AF=1 执行DAA指令时,因为AF=1而做 (AL) (AL)+06 得(AL)=96,CF=0,AF=1 结果正确返回调整规则?组合BCD码加法十进制调整指令组合BCD码加法十进制调整指令指令格式: DAA 指令功能: 实现两个组合BCD码相加结果的和存放到AL寄存器中的调整,指令把AL调整到压缩的BCD码格式。 指令说明: 指令影响标志位:AF,CF,PF, SF,ZF, 而OF无意义。返回示 例BCD减法示例BCD减法示例SUB AL,AH DAS 如指令执行前(AL)=86, (AH)=07 执行SUB指令后(AL)=7FH,CF=0,AF=1 执行DAS指令时,因为AF=1,需要 (AL) (AL)-06 而得(AL)=79,CF=0,AF=1 结果正确返回调整规则?非组合BCD码减法十进制调整指令非组合BCD码减法十进制调整指令指令格式: AAS 指令功能: 实现两个非组合BCD码相减结果的差存放到AL寄存器中的调整,指令把AL调整到非压缩的BCD码格式,AH中存放调整产生的借位值。 指令说明: 指令影响标志位:AF和CF,而PF,SF,ZF,OF无意义。返回组合BCD码减法十进制调整指令组合BCD码减法十进制调整指令指令格式: DAS 指令功能: 实现两个组合BCD码相减结果的差存放到AL寄存器中的调整,指令把AL调整到压缩的BCD码格式。 指令说明: 指令影响标志位:AF,CF,PF, SF,ZF,而OF无意义。返回示 例BCD码乘法十进制调整指令BCD码乘法十进制调整指令指令格式: AAM 指令功能: 实现两个非组合BCD码相乘结果的乘机存放到AL寄存器中的调整,指令把AL调整到非压缩的BCD码格式。调整为:把AL内容除0AH,商放在AH寄存器中,余数保存在AL寄存器中。根据AL寄存器的内容确定标志位。 指令说明: 指令影响标志位:SF,ZF,PF,而OF,CF,AF无意义返回调整规则?BCD码除法十进制调整指令BCD码除法十进制调整指令指令格式: AAD 指令功能: 指令把AX寄存器中存放的二位非组合BCD码,AH中存放十位数,AL中存放个位数,除数是一位非组合BCD数,在相除以前用AAD指令把AX中的被除数调整成二进制数并存放在AL寄存器中的调整,完成操作是: (AL) 10*(AH)+(AL) (AH) 0 指令说明: 该指令只提供对非组合BCD码除法调整,并是在进行除法之前。指令影响标志位:SF,ZF,PF,而OF,CF,AF无意义。返回调整规则?指令小结二指令小结二逻辑运算类指令逻辑运算类指令逻辑运算指令主要由以下几部分组成: 一、逻辑与指令AND 二、逻辑或指令OR 三、逻辑异或指令XOR 四、逻辑测试指令TEST 五、逻辑非指令NOT返回说明…逻辑与指令逻辑与指令指令格式: AND OPRD1,OPRD2 用途: 两操作数相“与”,结果送OPRD1,一般用来对某些位清零,其它位不变,在操作数不变的情况下使CF和OF清零 例如: AND AL, 0FH ;指令实现对高4位清零。 返回逻辑或指令逻辑或指令指令格式: OR OPRD1,OPRD2 用途:两操作数相“或”,结果送目标地址。一般用来对一个指定位置1。在不改变操作数的情况下使OF=CF=0 例如: OR AL, 02H ;指令实现对累加器中的D1位置1返回“或”指令的应用例“或”指令的应用例OR AX,[DI] OR CL,0FH OR AX,AX OR AL,AL JPE GOON OR AL,80H GOON:….偶校验转移(PF=1)将一个二进制数9变为字符‘9’?逻辑异或指令逻辑异或指令指令格式: XOR OPRD1,OPRD2 用途:两操作数相“异或”,结果送目标地址。用来对某一寄存器清零,用于初始化寄存器。 例如:XOR AX, AX ; 使累加器AX清零。 返回逻辑测试指令逻辑测试指令指令格式: TEST OPRD1,OPRD2 用途:一般用来检测指定位是1还是0,而这个指定位往往对应一个物理量。 例如:TEST AL, 01 通过对ZF的判断来了解最低位是否为1。如果ZF=1,说明结果为0,即最低位为0;如果ZF=0,说明结果不为0,即最低位不为0。“测试”指令例“测试”指令例从地址为38F0H的端口中读入一个字节数,如果该数的bit1位为1,则可从38FEH端口将DATA为首地址的一个字输出,否则就不能进行数据传送。请编写相应的程序段。“测试”指令例“测试”指令例“测试”指令例“测试”指令例 LEA SI,DATA MOV DX,38F0H WATT: IN AL,DX TEST AL,02H JZ WATT ;ZF=1转移 MOV DX,38FEH MOV AX,[SI] OUT DX,AX返回逻辑非指令逻辑非指令指令格式: NOT OPR ; (OPR) (!OPR) 操作:操作数按位取反再送回原地址 用途:常用来将某个数据取成反码,再加上1,便得到补码。指令中的操作数不能是立即数。指令的执行对标志位无影响 例:NOT BYTE PTR[BX]返回逻辑运算指令说明逻辑运算指令说明五种逻辑运算指令中,NOT指令不允许使用立即数,其它四条指令除非源操作数是立即数,否则至少有一个操作数必须存放在寄存器中,另一操作数则可以用任意寻址方式。“非”运算指令要求操作数不能是立即数 NOT指令不影响标志位,其它四种指令将使CF和OF为0,AF位无定义,而SF,ZF和PF则根据运算结果设置。例题讲解例题讲解 设( CH)= 0111 1001 , TESTVAL =1110 0011. 下列操作分别执行时,各指令执行后(CH)=?OR CH, TESTVALAND CH, TESTVALXOR CH, TESTVALTEST CH, 0000 0100BXOR CH, 1111 1111BOR(或)运算OR(或)运算TESTVALAND与运算AND与运算XOR异或运算XOR异或运算TESTVALTEST命令的使用TEST命令的使用0111 1001 0000 01000000 0000TESTCH=0111 1001CF=OF=0 SF=0 ZF=1TEST 和 AND指令TEST 和 AND指令设( CH) = 10111101B, 比较下面两指令的操作区别。返回移位指令移位指令移位指令主要由以下两大类指令组成: 一、非循环移位指令 二、循环移位指令返回说明…非循环移位指令非循环移位指令此类指令主要实现对寄存器或内存单元中的8位或16位操作数进行移位。它分逻辑移位指令和算术移位指令,共四条。 一、算术左移指令SAL 二、逻辑左移指令SHL 三、算术右移指令SAR 四、逻辑右移指令SHR返回算术左移指令算术左移指令指令格式: SAL OPR, CNT ; 指令功能: OPR可以是除立即数以外的任何寻址方式。移位次数由CNT决定,CNT可以是1或CL。注意如移位次数大于1,则可在该指令之前把移位次数置于CL寄存器中。返回逻辑左移指令逻辑左移指令指令格式: SHL OPR, CNT ; 指令功能: 说明: (1)SHL指令和SAL指令功能相同,可实现有符号数和无符号数乘2,如果左移后,最高位和CF不同,则溢出标志OF为1。 (2)根据OF的值判断左移操作是否造成了溢出。返回算术右移指令算术右移指令指令格式: SAR OPR, CNT ; 指令功能: 说明:右移时,最高位保持不变。 用途:用于带符号数除2。 返回逻辑右移指令逻辑右移指令指令格式: SHR OPR, CNR ; 指令功能: 说明:逻辑右移时,最高位补零。 用途:用于无符号数除2。返回示例: 设 (AH) = 10101101, 指令 SHR AH, 1 执行后, (AH) =01010110CF = 1循环移位指令循环移位指令循环移位指令主要由以下四条指令组成: 一、不带进位的循环左移指令ROL 二、不带进位的循环右移指令ROR 三、带进位的循环左移指令RCL 四、带进位的循环右移指令RCR 返回不带进位的循环左移指令不带进位的循环左移指令指令格式: ROL OPR, CNT ; 指令功能:返回不带进位的循环右移指令不带进位的循环右移指令指令格式: ROR OPR, CNT ; 指令功能:返回示例 : 设 (AH) = 10101101 ,指令ROR AH, 1执行后 (AH) =11010110CF = 1带进位的循环左移指令带进位的循环左移指令指令格式: RCL OPR, CNT ; 指令功能:返回示例 : 设(AH) = 10101101 , CF = 0, 指令 RCL AH, 1执行后 (AH) = 若执行指令 RCR AH, 1后, (AH)= 01011010CF = 101010110CF = 1带进位的循环右移指令带进位的循环右移指令指令格式: RCR OPR, CNT ; 指令功能: 返回移位指令说明移位指令说明所有移位指令影响标志位:CF,OF,PF,SF,ZF,无AF。 如果要移动若干位,则必须在CL中指出移动位数,若移动一位,可在指令中直接给出。 可对字节或字操作,操作数可以是寄存器或内存单元。程序例程序例 MOV SI,1000H MOV DI,3000H MOV CX,4 BBB:MOV AL,[SI] MOV BL,AL AND AL,0FH OR AL,30H MOV [DI],AL INC DI MOV AL,BLP
/
本文档为【第五章第二部分】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索