运算程序设计及应用举例.ppt
运算程序设计及应用运算程序设计及应用举例举例算术指令:算术指令:加法指令加法指令 ADD、ADC、INC 减法指令减法指令 SUB、SBB、DEC、NEG、CMP 乘法指令乘法指令 MUL、IMUL 除法指令除法指令 DIV、IDIV 十进制调整指令十进制调整指令 DAA、DAS、AAA、AAS、AAM、AAD 加法指令加法指令 加法指令:加法指令:ADD DST,SRC 执行操作:执行操作:(DST)(SRC)+(DST)带进位加法指令:带进位加法指令:ADC DST,SRC 执行操作:执行操作:(DST)(SRC)+(DST)+CF 加加1指令:指令:INC OPR 执行操作:执行操作:(OPR)(OPR)+1注意注意:*除除INC指令不影响指令不影响CF标志外,均对条件标志位有影响。标志外,均对条件标志位有影响。加法指令对加法指令对条件标志位条件标志位的影响的影响CF 位表示位表示 无符号数无符号数 相加的溢出。相加的溢出。OF 位表示位表示 带符号数带符号数 相加的溢出。相加的溢出。1 结果为负结果为负0 否则否则SF=1 结果为结果为00 否则否则ZF=1 和的最高有效位和的最高有效位 有有 向高位的进位向高位的进位0 否则否则CF=1 两个操作数符号相同,而结果符号与之相反两个操作数符号相同,而结果符号与之相反0 否则否则OF=举例举例:n=8 bit 带符号数带符号数(-128127),无符号数无符号数(0255)0 0 0 0 0 1 0 0 +0 0 0 0 1 0 1 1 0 0 0 0 1 1 1 1带:带:(+4)+(+11)=+15 OF=0无:无:4+11=15 CF=0带符号数和无符号数都不溢出带符号数和无符号数都不溢出 0 0 0 0 1 0 0 1 +0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 1 带带:(+9)+(+124)=-123 OF=1 无无:9+124=133 CF=0带符号数溢出带符号数溢出无符号数溢出无符号数溢出 0 0 0 0 0 1 1 1 +1 1 1 1 1 0 1 1 1 0 0 0 0 0 0 1 0带:带:(+7)+(-5)=+2 OF=0无:无:7+251=2 CF=1带符号数和无符号数都溢出带符号数和无符号数都溢出 1 0 0 0 0 1 1 1 +1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 0 0带:带:(-121)+(-11)=+124 OF=1无:无:135+245=124 CF=1例:双精度数的加法例:双精度数的加法 (DX)=0002H (AX)=0F365H (BX)=0005H (CX)=8100H 指令序列指令序列 ADD AX,CX ;(1)ADC DX,BX ;(2)(1)执行后,执行后,(AX)=7465H CF=1 OF=1 SF=0 ZF=0 (2)执行后,执行后,(DX)=0008H CF=0 OF=0 SF=0 ZF=0 减法指令减法指令减法指令:减法指令:SUB DST,SRC 执行操作:执行操作:(DST)(DST)-(SRC)带借位减法指令:带借位减法指令:SBB DST,SRC 执行操作:执行操作:(DST)(DST)-(SRC)-CF减减1指令:指令:DEC OPR 执行操作:执行操作:(OPR)(OPR)-1求补指令:求补指令:NEG OPR 执行操作:执行操作:(OPR)-(OPR)比较指令:比较指令:CMP OPR1,OPR2 执行操作:执行操作:(OPR1)-(OPR2)注意注意:*除除DEC指令不影响指令不影响 CF标志外,均对条标志外,均对条 件标志位有影响。件标志位有影响。减法指令对条件标志位(减法指令对条件标志位(CF/OF/ZF/SF)的影响:)的影响:CF 位表示位表示 无符号数无符号数 减法的溢出。减法的溢出。OF 位表示位表示 带符号数带符号数 减法的溢出。减法的溢出。1 被减数的最高有效位被减数的最高有效位 有有 向高位的借位向高位的借位0 否则否则CF=1 两个操作数符号相反,而结果的符号与减数相同两个操作数符号相反,而结果的符号与减数相同0 否则否则OF=1 减法转换为加法运算时减法转换为加法运算时 无无 进位进位0 否则否则CF=或或NEG 指令对指令对CF/OF的影响的影响0 操作数为操作数为01 否则否则CF=1 操作数为操作数为-128(字节运算)(字节运算)或或 操作数为操作数为-32768(字运算)(字运算)0 否则否则OF=0 0 0 1 1 1 1 0 +0 0 0 1 1 1 1 1NEG 指令对指令对CF/OF的影响的影响0 操作数为操作数为01 否则否则CF=1 操作数为操作数为-128(字节运算)(字节运算)或或 操作数为操作数为-32768(字运算)(字运算)0 否则否则 OF=0 0 0 0 1 1 1 1 +0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 1 1 +0 0 0 1 1 0 0 0例:例:x、y、z 均为双精度数,分别存放在地址为均为双精度数,分别存放在地址为X,X+2;Y,Y+2;Z,Z+2的存储单元中,用指令序列实现的存储单元中,用指令序列实现 w x+y+24-z,并用,并用W,W+2单元存放单元存放wMOV AX,XMOV AX,XMOV DX,X+2MOV DX,X+2ADD AX,YADD AX,YADC DX,Y+2 ;x+yADC DX,Y+2 ;x+yADD AX,24ADD AX,24ADC DX,0 ;x+y+24ADC DX,0 ;x+y+24SUB AX,ZSUB AX,ZSBB DX,Z+2 ;x+y+24-zSBB DX,Z+2 ;x+y+24-zMOV W,AXMOV W,AXMOV W+2,DX ;MOV W+2,DX ;结果存入结果存入W,W+2W,W+2单元单元 乘法指令乘法指令 无符号数乘法指令:无符号数乘法指令:MUL SRC 带符号数乘法指令:带符号数乘法指令:IMUL SRC 执行操作:执行操作:字节操作数字节操作数 (AX)(AL)*(SRC)字操作数字操作数 (DX,AX)(AX)*(SRC)注意注意:*AL(AX)为隐含的乘数寄存器。为隐含的乘数寄存器。*AX(DX,AX)为隐含的乘积寄存器。为隐含的乘积寄存器。*SRC不能为立即数。不能为立即数。*除除CF和和OF外,对条件标志位无定义。外,对条件标志位无定义。乘法指令对乘法指令对 CF/OF 的影响:的影响:例:例:(AX)=16A5H,(BX)=0611H (1)IMUL BL ;(AX)(AL)*(BL);A5*11 5B*11=060B F9F5 ;(AX)=0F9F5H CF=OF=1 (2)MUL BX ;(DX,AX)(AX)*(BX);16A5*0611=0089 5EF5 ;(DX)=0089H (AX)=5EF5H CF=OF=100 乘积的高一半为零乘积的高一半为零11 否则否则MUL指令指令:CF,OF=00 乘积的高一半是低一半的符号扩展乘积的高一半是低一半的符号扩展11 否则否则 IMUL指令指令:CF,OF=1010 01010101 1011 除法指令除法指令 无符号数除法指令:无符号数除法指令:DIV SRC 带符号数除法指令:带符号数除法指令:IDIV SRC 执行操作:执行操作:字节操作字节操作 (AL)(AX)/(SRC)的商的商 (AH)(AX)/(SRC)的余数的余数 字操作字操作 (AX)(DX,AX)/(SRC)的商的商 (DX)(DX,AX)/(SRC)的余数的余数注意注意:*AX(DX,AX)为隐含的被除数寄存器。为隐含的被除数寄存器。*AL(AX)为隐含的商寄存器。为隐含的商寄存器。*AH(DX)为隐含的余数寄存器。为隐含的余数寄存器。*SRC不能为立即数。不能为立即数。*对所有条件标志位均无定义。对所有条件标志位均无定义。如何判别结果有效?如何判别结果有效?例:例:x,y,z,v 均为均为16位带符号数,计算位带符号数,计算 (v-(x*y+z 540)/xMOV AX,X MOV AX,X IMUL Y ;x*y IMUL Y ;x*y(DX,AXDX,AX)MOV CX,AXMOV CX,AXMOV BX,DXMOV BX,DXMOV AX,ZMOV AX,ZCWD CWD ;Z Z(DXDX,AXAX)ADD CX,AXADD CX,AXADC BX,DX ;x*y+z ADC BX,DX ;x*y+z(BXBX,CXCX)SUB CX,540 SUB CX,540 SBB BX,0 ;x*y+z-540SBB BX,0 ;x*y+z-540MOV AX,VMOV AX,VCWD CWD ;V V(DXDX,AXAX)SUB AX,CXSUB AX,CXSBB DX,BX ;v-(x*y+z-540)SBB DX,BX ;v-(x*y+z-540)IDIV X ;(v-(x*y+z-540)/xIDIV X ;(v-(x*y+z-540)/x(AXAX)余数余数(DXDX)十进制调整指令十进制调整指令BCD码:用二进制编码的十进制数,码:用二进制编码的十进制数,又称又称二二-十进制数十进制数压缩的压缩的BCD码:用码:用 4 位二进制数表示位二进制数表示 1 位十进制数位十进制数 例:例:(59)10(0101 1001)BCD非压缩的非压缩的BCD码:用码:用 8 位二进制数表示位二进制数表示 1 位十进制数位十进制数 例:例:(59)10(0000 0101 0000 1001)BCD数字的数字的 ASCII 码是一种码是一种 非压缩的非压缩的 BCD 码码 DIGIT ASCII BCD030H0011 0000131H0011 0001232H0011 0010 939H0011 1001例:写出例:写出(3590)10的压缩的压缩 BCD 码和非压缩码和非压缩BCD码,并分码,并分 别别 把它们存入数据区把它们存入数据区 PAKED 和和 UNPAK压缩压缩BCD:(3590)10(0011 0101 1001 0000)BCD非压缩非压缩BCD:(3590)10(00000011 00000101 00001001 00000000)BCD PAKED 90H 35H UNPAK 00H 09H 05H 03H问题的提出:问题的提出:十进制调整指令十进制调整指令19 压缩压缩BCD:0001 1001 27 0010 0001 +110 +08 +0000 1000 (0010 0111)BCD AF=1(1)压缩的)压缩的BCD码调整指令码调整指令 DAA 加法的十进制调整指令加法的十进制调整指令 DAS 减法的十进制调整指令减法的十进制调整指令 (2)非压缩的)非压缩的BCD码调整指令码调整指令 AAA 加法的加法的ASCII码调整指令码调整指令 AAS 减法的减法的ASCII码调整指令码调整指令 AAM 乘法的乘法的ASCII码调整指令码调整指令 AAD 除法的除法的ASCII码调整指令码调整指令逻辑指令:逻辑指令:逻辑运算指令逻辑运算指令 AND、OR、NOT、XOR、TEST 移位指令移位指令 SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR逻辑指令:逻辑指令:AND“与与”运算运算两个对应位同时为两个对应位同时为1,运算结果的对应位为,运算结果的对应位为1,否则为,否则为0。OR“或或”运算运算两个对应位同时为两个对应位同时为0,运算结果的对应位为,运算结果的对应位为0,否则为,否则为1。XOR“异或异或”运算运算两个对应位相同时,运算结果的对应位为两个对应位相同时,运算结果的对应位为0,否则为,否则为1。NOT“非非”运算运算将原操作数的各位取反,即将原操作数的各位取反,即“1”变为变为“0”,“0”变为变为“1”ABA AND BA OR BA XOR BNOT A000001010111100110111100逻辑与指令:逻辑与指令:AND DST,SRC执行操作:执行操作:(DST)(DST)(SRC)逻辑或指令:逻辑或指令:OR DST,SRC执行操作:执行操作:(DST)(DST)(SRC)异或指令:异或指令:XOR DST,SRC执行操作:执行操作:(DST)(DST)(SRC)测试指令:测试指令:TEST OPR1,OPR2执行操作:执行操作:(OPR1)(OPR2)逻辑非指令:逻辑非指令:NOT OPR *OPR不能为立即数不能为立即数执行操作:执行操作:(OPR)(OPR)*不影响标志位不影响标志位 CF OF SF ZF PF AF 0 0 *无定义无定义 根据运算结果设置根据运算结果设置 逻辑运算指令逻辑运算指令例:屏蔽例:屏蔽AL的第的第0、1两位两位 AND AL,0FCH例:置例:置AL的第的第5位为位为1 OR AL,20H 例:使例:使AL的第的第0、1位变反位变反 XOR AL,3例:测试某些位是例:测试某些位是0是是1 TEST AL,1 JZ EVEN *OR 0 0 1 0 0 0 0 0 *1*0 1 XOR 0 0 0 0 0 0 1 1 *1 0 *AND 1 1 1 1 1 1 0 0 *0 0 *AND 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0*逻辑左移逻辑左移 SHL OPR,CNT逻辑右移逻辑右移 SHR OPR,CNT算术左移算术左移 SAL OPR,CNT(同逻辑左移)(同逻辑左移)算术右移算术右移 SAR OPR,CNT CF 0 0 CFCF 移位指令移位指令循环左移循环左移 ROL OPR,CNT循环右移循环右移 ROR OPR,CNT带进位循环左移带进位循环左移 RCL OPR,CNT带进位循环右移带进位循环右移 RCR OPR,CNTCF CFCFCF注意注意:*OPR可用除立即数以外的任何寻址方式可用除立即数以外的任何寻址方式*CNT=1,SHL OPR,1 CNT1,MOV CL,CNT SHL OPR,CL ;以以SHL为例为例*条件标志位:条件标志位:CF=移入的数值移入的数值 1 CNT=1时,最高有效位的值发生变化时,最高有效位的值发生变化 0 CNT=1时,最高有效位的值不变时,最高有效位的值不变 移位指令:移位指令:SF、ZF、PF 根据移位结果设置,根据移位结果设置,AF无定义无定义 循环移位指令:循环移位指令:不影响不影响 SF、ZF、PF、AFOF=带进位的循环左移指令带进位的循环左移指令例:将例:将32位数位数12345678H算术左移一位。算术左移一位。MOV AX,5678HMOV DX,1234HSAL AX,1RCL DX,1结果为结果为(AX)=0ACF0H,(DX)=2468H例:例:(AX)=0012H,(BX)=0034H,把它们装配成,把它们装配成(AX)=1234H 例:例:(BX)=84F0H (1)(BX)为无符号数,求为无符号数,求(BX)/2 SHR BX,1SHR BX,1 ;(BX)=4278H(BX)=4278H (2)(BX)为带符号数,求为带符号数,求(BX)2 SAL BX,1SAL BX,1 ;(BX)=09E0H,OF=1(BX)=09E0H,OF=1 (3)(BX)为带符号数,求为带符号数,求(BX)/4 MOV CL,2 MOV CL,2 SAR BX,CL ;(BX)=0E13CH SAR BX,CL ;(BX)=0E13CHMOV CL,8MOV CL,8ROL AX,CLROL AX,CLADD AX,BXADD AX,BXMOV CH,4 ;MOV CH,4 ;循环次数循环次数MOV CL,4 ;MOV CL,4 ;移位次数移位次数NEXT:NEXT:ROL BX,CLROL BX,CLMOV AX,BXMOV AX,BXAND AX,0FHAND AX,0FHPUSH AXPUSH AXDEC CHDEC CHJNZ NEXTJNZ NEXT00080004000F 0000 (SP)(3)(BX)=84F0H(BX)=84F0H,把把(BX)(BX)中的中的 16 16 位数每位数每 4 4 位压入堆栈位压入堆栈第第4章章 8086指令系统及寻址方式指令系统及寻址方式4.5 表达式与操作符表达式与操作符常量、变量、标号常量、变量、标号常量常量v字符串常量字符串常量w用单引号用单引号、或者双引号、或者双引号“”括起来的一个或多括起来的一个或多个个ASC字符,如字符,如A1、B、5、GOODw汇编程序把字符串常量表示成一个字节序列,汇编程序把字符串常量表示成一个字节序列,一个字节对应一个字符,并把该字符翻译成它一个字节对应一个字符,并把该字符翻译成它的的ASC码值进行存储。码值进行存储。w如如5转换成转换成ASC码值就是码值就是273527H串处理指令:串处理指令:设置方向标志指令设置方向标志指令 CLD、STD 串处理指令串处理指令 串重复前缀串重复前缀 MOVSB /MOVSW REP STOSB /STOSW REPE /REPZ LODSB /LODSW REPNE /REPNZ CMPSB /CMPSW SCASB /SCASW 与与 REP 配合工作的配合工作的 MOVS/STOS/LODS REP 执行操作:执行操作:(1)如如(CX)=0 则退出则退出 REP,否则转,否则转(2)(2)(CX)(CX)-1(3)执行执行 MOVS/STOS/LODS(4)重复重复(1)(3)MOVS 串传送指令:串传送指令:MOVS DST,SRCMOVSB (字节)(字节)MOVSW (字)(字)例:例:MOVS ES:BYTE PTR DI,DS:SI 执行操作:执行操作:(1)(DI)(SI)(2)字节操作:字节操作:(SI)(SI)1,(DI)(DI)1 字操作:字操作:(SI)(SI)2,(DI)(DI)2 方向标志方向标志 DF=0 时用时用+,DF=1 时用时用-。REP MOVS:将数据段中的整串数据传送到附加段中。:将数据段中的整串数据传送到附加段中。源串(数据段)源串(数据段)目的串(附加段)目的串(附加段)执行执行 REP MOVS 之前,应先做好:之前,应先做好:(1)源串首地址(末地址)源串首地址(末地址)SI(2)目的串首地址(末地址)目的串首地址(末地址)DI(3)串长度串长度 CX(4)建立方向标志建立方向标志 (CLD 使使 DF=0,STD 使使 DF=1)(SI)(DI)DF=0DF=1数据段数据段 附加段附加段(SI)(DI)data segmentdata segment mess1 db personal_computer mess1 db personal_computerdata endsdata endsextra segmentextra segment mess2 db 17 dup(?)mess2 db 17 dup(?)extra endsextra endscode segmentcode segment mov ax,data mov ax,data mov movds,axds,ax mov movax,extraax,extra mov es,ax mov es,ax lea si,mess1 lea si,mess1 lea di,mess2 lea di,mess2 mov cx,17 mov cx,17 cld cld rep movsb rep movsb code endscode endslea si,mess1+16lea si,mess1+16lea di,mess2+16lea di,mess2+16mov cx,17mov cx,17stdstdrep movsbrep movsbdata segmentdata segment mess1 db personal_computer mess1 db personal_computer mess2 db 17 dup(?)data endsdata endscode segmentcode segment mov ax,data mov ax,data mov movds,ads,ax mov es,ax mov es,ax lea si,mess1 lea si,mess1 lea di,mess2 lea di,mess2 mov cx,17 mov cx,17 cld cld rep movsb rep movsb code endscode endsSTOS 存入串指令:存入串指令:STOS DSTSTOSB (字节)(字节)STOSW (字)(字)执行操作:执行操作:字节操作:字节操作:(DI)(AL),(DI)(DI)1 字操作:字操作:(DI)(AX),(DI)(DI)2例:把例:把 附加段附加段 中的中的 10 个字节缓冲区置为个字节缓冲区置为 20Hlea di,mess2lea di,mess2mov al,20Hmov al,20Hmov cx,10mov cx,10cldcldrep stosbrep stosblea di,mess2lea di,mess2mov ax,2020Hmov ax,2020Hmov cx,5mov cx,5cldcldrep stoswrep stoswLODS 从串取指令:从串取指令:LODS SRC LODSB (字节)(字节)LODSW (字)(字)执行操作:执行操作:字节操作:字节操作:(AL)(SI),(SI)(SI)1 字操作:字操作:(AX)(SI),(SI)(SI)2注意注意:*LODS 指令一般不与指令一般不与 REP 联用联用*源串一般在数据段中(允许使用段跨越前缀来修改),源串一般在数据段中(允许使用段跨越前缀来修改),目的串必须在附加段中目的串必须在附加段中*不影响条件标志位不影响条件标志位与与 REPE/REPZ(REPNE/REPNZ)配合工作的)配合工作的 CMPS 和和 SCAS REPE/REPZ REPNE/REPNZ 执行操作:执行操作:(1)如如(CX)=0 或或 ZF=0(ZF=1)则退出串操作,则退出串操作,否则转否则转(2)(2)(CX)(CX)-1 (3)执行执行 CMPS/SCAS (4)重复重复(1)(3)CMPS 串比较指令:串比较指令:CMPS SRC,DST CMPSB (字节)(字节)CMPSW (字)(字)执行操作:执行操作:(1)(SI)-(DI)根据比较结果置条件标志位:相等根据比较结果置条件标志位:相等 ZF=1 不等不等 ZF=0 (2)字节操作:字节操作:(SI)(SI)1,(DI)(DI)1 字操作:字操作:(SI)(SI)2,(DI)(DI)2SCAS 串扫描指令:串扫描指令:SCAS DST SCASB (字节)(字节)SCASW (字)(字)执行操作:执行操作:字节操作:字节操作:(AL)-(DI),(DI)(DI)1 字操作:字操作:(AX)-(DI),(DI)(DI)2例:从一个字符串中查找一个指定的字符例:从一个字符串中查找一个指定的字符 mess db COMPUTER mess db COMPUTER lea di,mess lea di,mess mov al,T mov al,T mov cx,8 mov cx,8 cld cld repne scasb repne scasbC CO OM MP PU UT TE ER R(didi)(didi):相匹配字符的下一个地址:相匹配字符的下一个地址(cxcx):剩下还未比较的字符个数:剩下还未比较的字符个数(didi)(CX)=2例:比较两个字符串,找出它们不相匹配的位置例:比较两个字符串,找出它们不相匹配的位置例:反向传送例:反向传送lea si,mess1lea si,mess1lea di,mess2lea di,mess2mov cx,8mov cx,8cldcldrepe cmpsbrepe cmpsblea si,mess1+7lea si,mess1+7lea di,mess2+7lea di,mess2+7mov cx,8mov cx,8STdSTdrep movsbrep movsb