第六部分数据处理办法_第1页
第六部分数据处理办法_第2页
第六部分数据处理办法_第3页
第六部分数据处理办法_第4页
第六部分数据处理办法_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六部分数据处理办法1串数据的处理串?内存中的一系列的字节或者字支持串的操作复制存储比较查找串操作的特点操作的数据单位字节DB,字DW,双字DD对奇数字节串,选用字节操作对偶数字节串,选用字操作,加快速度寄存器的使用源寄存器:DS:SI目标寄存器:ES:DI通常需要定义扩展段ES,不过也可以如下:MOVAX,@dataMOVDS,AXMOVES,AX操作指令两种方式:基本指令和标准指令操作基本指令隐含操作数字节操作字操作双字操作MOVEMOVSES:DI,DS:SIMOVSBMOVSWMOVSDLOADLODSAX,DS:SILODSBLODSWLODSDSTORESTOSES:DI,AXSTOSBSTOSWSTOSDCOMPARECMPSDS:SI,ES:DICMPSBCMPSWCMPSDSCANSCASES:DI,AXSCASBSCASWSCASD基本格式指令格式;MOVSBYTE1,BYTE2传送从BYTE2开始的字节到开始于BYTE1的字节。其中操作数源和目标都采用上表中的寄存器BYTE1,BYTE2操作数指明传送的长度注:我们侧重于标准格式重复前缀指令REPREP指令重复执行相应指令,例如REPMOVSB重复的次数由CX定每执行一次,CX--,直到CX减为0为止串操作的重复方向:决定了对SI和DI的操作左右:CLD将DF清0字节:SI=SI+1,DI=DI+1字:SI=SI+2,DI=DI+2右左:STD将DF置1字节:SI=SI-1,DI=DI-1字:SI=SI-2,DI=DI-2串传送MovingMOVSB,MOVSW字节或者字在内存间的拷贝执行效果:源寄存器DS:SI和目标寄存器ES:DISI和DI加/减1或2若CX中含有重复操作的次数,REP前缀重复执行串数据的传送操作例:串拷贝;Copyarrayatob,assumeES=DS,and10bytesaretobecopied;字节复制

MOVCX,10 ;10bytestocopy MOVDI,OFFSETB ;destination MOVSI,OFFSETA ;source CLD ;lefttoright REPMOVSB;字复制

MOVCX,5 ;10bytestocopy MOVDI,OFFSETB ;destination MOVSI,OFFSETA ;source CLD ;lefttoright REPMOVSW例:数据迁移;shiftbytesofa3bytestoright MOVCX,7 ;bytestocopy MOVDI,OFFSETA+9 ;destination MOVSI,OFFSETA+9-3;source STD ;copyfromrighttoleft REPMOVSBDIASI例:复制PATTERN DB "!@#*" ;duplicatedata DB (100-4)DUP(?) ;spaceMOV CX,100-4 ;96bytestocopy MOVSI,OFFSETPATTERNMOVDI,OFFSETPATTERN+4CLD ;destructiveoverlapREPMOVSB!@#*DIaSI串存入StoringSTOSB,STOSW将

AL或AX数据拷贝到串相应的字节或字中拷贝的目标地址由ES:DI指定每完成拷贝,ES:DI指向下一个拷贝的地址上可以结合REP重复进行操作例:存储的初始化ARRDW200DUP(?) ;emptywords;tobeinitializedtoA050A050... MOVAX,50A0H MOVDI,OFFSETARR MOVCX,200 ;arraysize CLD REPSTOSWA050A050ARR50A0AXDIAHAL读取串LoadingLODSB,LODSW将DS:SI地址的数据拷贝到

AL或AX每完成一次读取,DS:SI指向下一读取的单位例:串处理;arrayB=toUpper(arrayA) MOVDI,OFFSETB ;dest MOVSI,OFFSETA ;source MOVCX,30 ;arraysize CLD ;lefttorightprocessingLP: LODSB ;getnextbyte ANDAL,0DFh ;touppercase STOSB ;storeatnextlocation LOOPLP串扫描ScanningSCASB,SCASW将AL或AX数据和ES:DI地址中的数据比较,DI自动加减该指令设置标志寄存器依据比较的结果设定标志位在循环中使用,或者使用带条件的REPREPZ/REPE:

当CX不为0,并且ZF为0时,重复操作。当ZF不为0或不相等或CX减到0时,停止重复。REPNZ/REPNE:当CX不为0,并且ZF不为0时,重复操作。当ZF为0或相等或CX减到0时,停止重复。SCASx和CMPSx条件重复语义while(CX!=0){ dostringprimitive; --CX; if(REPNEandZF==1) exitloop; if(REPEandZF==0) exitloop;}重复首先检测CX是否为0检测0标记被设置放在最后——这就决定了,不管一次操作是否退出,SI/DI都要进行加减只有CMPS和SCAS指令影响ZF置位例1:串查找ARRDB'abcdefghijklmnopqrstuvwxyz'MOV DI,OFFSETARRMOV CX,26 ;26bytesCLD ;lefttorightprocessingMOV AL,TARGET ;chtofind REPNESCASB ;searchformatch;makeatmostcxcomparisons JNE NOMATCH ;ZFneverset;matchoccurredatES:[di-1];diisincrementedevenifmatch例2:查找与替换在串中查找*,并用空格替换LENEQU13;datalengthTESTDATADB‘extra*innings’……CLDMOVAL,‘*’MOVCX,LENLEADI,TESTDATAREPNESCASBJNEexitMOVBYTEPTR[DI-1],20H串比较ComparingCMPSB,CMPSW将DS:SIES:DI比较,设置标记位,并且将SI和DI加减通常使用条件的REP指令注意:CMPop1,op2是将操作数1减去操作2,仅限于代数比较;而CMPS是ASCII码比较例:串比较 MOV SI,OFFSETSTR1 MOV DI,OFFSETSTR2 CLD ;lefttorightprocessing MOV CX,12 ;shorterstring REPE CMPSB;cmptil<>orcx=0 JL str1smaller JG str2smaller;thestringsareequal-sofar;ifsizesdifferent,shorterstringisless注意:串以字为单位比较时当以字为单位比较时,例如:SAMUEL和ARNOLD时,ASRASIDISAMUEL高ARNOLD字节定义DBSAARSIDISAUMLERAONDL<高字定义DW>

2算术运算(I)

——处理二进制数据预备1:有符号数和无符号数无符号数:所有位均为数据位有符号数:最左边的位为符号位例如:11111101无符号数252,而有符号数为-7格式字节字双字Max无符号数255/28-1216-1232-1Max有符号数127/27-1215-1231-1预备2:算术进位算术进位+1111110100000101000000011CF=1,OF=0+25251无效+-451有效无符号数有符号数进位CF的设置,由符号位的运算进位0或1产生的。对于无符号数,产生了数据位的进位而无效。预备2:算术溢出溢出的两情形:+011110010000101110000100CF=0,OF=1+12111132无效++12111-124有效无符号数有符号数情形1:当符号位有进位输入,而没有进位输出时情形2:当进位输出不是由进位输入产生时+111101101000100101111111CF=1,OF=1无效++246137127无符号数有符号数1+-10-119127无效预备3:扩展字节字无符号数有符号数字双字无符号数有符号数PreparingDividendTodivideawordinAXbyaword,AXmustbeconvertedtoadoublewordinDX:AXIfsigned:CWD(calledsign-extension)Ifunsigned:MOVDX,0Forbyte(inAL)toword(AX)conversionIfsigned:CBW(thesedonotaffectFlags)Ifunsigned:MOVAH,0加减运算溢出对有符号数的加减运算有影响,应注意。加法减法ADD通常加法SUB通常减法ADC带进位的加法SBB带借位的减法双字值的算术运算例1:请运算WORD1B:WORD1AWORD2B:WORD2AWORD3B:WORD3AWORD1ADW0BC62HWORD1BDW0123HWORD2ADW553AHWORD2BDW0012HWORD3ADW?WORD3BDW?+程序:MOVAX,WORD1AADDAX,WORD2AMOVWORD3A,AXMOVAX,WORD1BADCAX,WORD2BMOVWORD3B,AX思考:将上述例子扩展,任意长度的字数据运算程序CLCMOVCX,02LEASI,WORD1ALEADI,WORD2ALEABX,WORD3AL20:MOVAX,[SI]ADCAX,[DI]MOV[BX],AX

INCSIINCSIINCDIINCDIINCBXINCBXLOOPL20乘法指令有符号数乘法 IMULsource无符号数乘法 MULsourcesource

:寄存器或内存地址(但不能为常数)格式字节×字节AX=AL*source字×字DX:AX=AX*source

CF=OF1若乘积的长度>操作数的长度0反之SF,ZF,AF,和PF无定义AH(不管)AL被乘数AX乘积DX(不管)AX被乘数乘积例1IMULMOVBL,0FEhMOVAL,0E5hIMULBLBL-2,AL-27IMUL运算后AX0036h(54d)CF=OF=0(resultstillfitsinbyte)SF,AF,PF,ZF无定义例2MULMOVBL,0FEhMOVAL,0E5hIMULBLBL254,AL229MUL运算后AX0E336h(58166d)CF=OF=1(resultrequiresaword)SF,AF,PF,和ZF无定义例3IMULMOVAWORD,-136MOVAX,6784IMULAWORDAWORD0FF78h,AX1A80hIMUL运算后DX:AX0FFF1EC00h(-922624d)CF=OF=1(resultrequiresadoubleword)例4MULMOVAWORD,-136MOVAX,6784MULAWORDAWORD0FF78h(65400d),AX1A80hMUL运算后DX:AX1A71EC00h(443673600d)CF=OF=1(resultrequiresadoubleword)例5IMULMOVAX,-1MOVDX,2IMULDXAX0FFFFh,BX0002hIMUL运算后DX:AX0FFFFFFFEh(-2d)CF=OF=0(resultstillfitsinaword)双字乘法——双字×1312156×6512780×00+=1638032062521H6400H

?

×类似上述的算法32066400×25216400×0E80E400138A58000E80E400138A5800+字×字节MULTCANDW2521HDW3206HMULTPLRDW6400HPRODUCTDW0,0,0;lowerbyte*multplrMOVAX,MULTCANMULMULTPLRMOVPRODUCT,AXMOVPRODUCT+2,DX;higherbyte*multplrMOVAX,MULTCAN+2MULMULTPLR;addtwopartADDPRODUCT+2,AXADCPRODUCT+4,DX双字乘法——双字×双字利用上述的思想,拆分为四次字乘法,将各个乘积加到相应的位置上,即可。被乘数AB乘数CDB×CB×DA×CB×D依次错一个字节相加(进位加法)乘积占用4个字左移运算做乘法SHL左移一次,相当于×2运算左移代替乘法,好处:加快运算速度例如;SHLAX,01SHLWORDVAL,3除法指令有符号除法 IDIVdivisor无符号除法

DIVdivisordivisor

为寄存器或者内存地址(非常数)格式字除以字节AL=AX/divisorAH=AX%divisor双字除以字AX=DX:AX/divisorDX=DX:AX%divisor所有的标记位没有定义AX

被除数AH余数AL商除前除后DX

被除数AX余数商除前除后思考:若出现字节除以字节,字除以字怎么办?例DIV数据:BYTE1DB80HBYTE2DB16HWORD1DW2000HWORD2DW0010HWORD3DW1000H例1:MOVAX,WORD1DIVBYTE1例2:MOVZXBYTE1DIVBYTE2例3:MOVDX,WORD2MOVAX,WORD3DIVWORD1例4:MOVAX,WORD1SUBDX,DXDIVWORD3例IDIV数据:BYTE1DB80HBYTE2DB16HWORD1DW2000HWORD2DW0010HWORD3DW1000H例1:MOVAX,WORD1IDIVBYTE1例2:MOVZXBYTE1IDIVBYTE2例3:MOVDX,WORD2MOVAX,WORD3IDIVWORD1例4:MOVAX,WORD1CWDDIVWORD3除法溢出溢出发生在当字除以字节时:商超过一个字节当双字除以字时:商超过一个字除法溢出,非法错误终止程序运行简单的判断溢出发生的方法:字除以字节时:AH>=divisor双字除以字时:DX>=divisor防止除法溢出CMPAH,DIVBYTEJNBL20DIVDIVBYTEL20:……简单的判断溢出发生的方法:字除以字节时:AH>=divisor双字除以字时:DX>=divisor;溢出处理

3算术运算(II)

——处理ASCII和BCD数据提要ASCII和BCD格式数据格式的运算格式间的转换BCD和ASCII某数采用ASCII十进制数表示,每个字节存储一个ASCII数字Binary-codeddecimal(BCD)数字采用4位二进制数表示各个十进制数一个十进制数采用非压缩的BCD表示,低4位为相应的十进制数字符号,高4位为0一个十进制数采用压缩的BCD表示,只用4位为相应的十进制数字符号例:5678ASCII: 4字节 35363738非压缩的BCD: 4字节 05060708压缩的BCD: 2字节5678AAA指令AAA(ASCIIadjustafteraddition)该指令对ADD或ADC指令的二进制结果进行调整使得在AL中的结果和ASCII数字表示相一致。TheCarryvalue,ifanyendsupinAH例:Add'8'and'2'MOV AH,0MOV AL,'8' ;AX=0038hADD AL,'2' ;AX=006AhAAA ;AX=0100h(adjustresult)OR AX,3030h ;AX=3130h='10'AAS指令AAS(ASCIIadjustaftersubtraction)该指

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论