第六部分數(shù)據(jù)處理辦法_第1頁
第六部分數(shù)據(jù)處理辦法_第2頁
第六部分數(shù)據(jù)處理辦法_第3頁
第六部分數(shù)據(jù)處理辦法_第4頁
第六部分數(shù)據(jù)處理辦法_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第六部分數(shù)據(jù)處理辦法1串數(shù)據(jù)的處理串?內(nèi)存中的一系列的字節(jié)或者字支持串的操作復制存儲比較查找串操作的特點操作的數(shù)據(jù)單位字節(jié)DB,字DW,雙字DD對奇數(shù)字節(jié)串,選用字節(jié)操作對偶數(shù)字節(jié)串,選用字操作,加快速度寄存器的使用源寄存器:DS:SI目標寄存器:ES:DI通常需要定義擴展段ES,不過也可以如下:MOVAX,@dataMOVDS,AXMOVES,AX操作指令兩種方式:基本指令和標準指令操作基本指令隱含操作數(shù)字節(jié)操作字操作雙字操作MOVEMOVSES:DI,DS:SIMOVSBMOVSWMOVSDLOADLODSAX,DS:SILODSBLODSWLODSDSTORESTOSES:DI,AXSTOSBSTOSWSTOSDCOMPARECMPSDS:SI,ES:DICMPSBCMPSWCMPSDSCANSCASES:DI,AXSCASBSCASWSCASD基本格式指令格式;MOVSBYTE1,BYTE2傳送從BYTE2開始的字節(jié)到開始于BYTE1的字節(jié)。其中操作數(shù)源和目標都采用上表中的寄存器BYTE1,BYTE2操作數(shù)指明傳送的長度注:我們側(cè)重于標準格式重復前綴指令REPREP指令重復執(zhí)行相應指令,例如REPMOVSB重復的次數(shù)由CX定每執(zhí)行一次,CX--,直到CX減為0為止串操作的重復方向:決定了對SI和DI的操作左右:CLD將DF清0字節(jié):SI=SI+1,DI=DI+1字:SI=SI+2,DI=DI+2右左:STD將DF置1字節(jié):SI=SI-1,DI=DI-1字:SI=SI-2,DI=DI-2串傳送MovingMOVSB,MOVSW字節(jié)或者字在內(nèi)存間的拷貝執(zhí)行效果:源寄存器DS:SI和目標寄存器ES:DISI和DI加/減1或2若CX中含有重復操作的次數(shù),REP前綴重復執(zhí)行串數(shù)據(jù)的傳送操作例:串拷貝;Copyarrayatob,assumeES=DS,and10bytesaretobecopied;字節(jié)復制

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

MOVCX,5 ;10bytestocopy MOVDI,OFFSETB ;destination MOVSI,OFFSETA ;source CLD ;lefttoright REPMOVSW例:數(shù)據(jù)遷移;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數(shù)據(jù)拷貝到串相應的字節(jié)或字中拷貝的目標地址由ES:DI指定每完成拷貝,ES:DI指向下一個拷貝的地址上可以結(jié)合REP重復進行操作例:存儲的初始化ARRDW200DUP(?) ;emptywords;tobeinitializedtoA050A050... MOVAX,50A0H MOVDI,OFFSETARR MOVCX,200 ;arraysize CLD REPSTOSWA050A050ARR50A0AXDIAHAL讀取串LoadingLODSB,LODSW將DS:SI地址的數(shù)據(jù)拷貝到

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數(shù)據(jù)和ES:DI地址中的數(shù)據(jù)比較,DI自動加減該指令設置標志寄存器依據(jù)比較的結(jié)果設定標志位在循環(huán)中使用,或者使用帶條件的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是將操作數(shù)1減去操作2,僅限于代數(shù)比較;而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字節(jié)定義DBSAARSIDISAUMLERAONDL<高字定義DW>

2算術(shù)運算(I)

——處理二進制數(shù)據(jù)預備1:有符號數(shù)和無符號數(shù)無符號數(shù):所有位均為數(shù)據(jù)位有符號數(shù):最左邊的位為符號位例如:11111101無符號數(shù)252,而有符號數(shù)為-7格式字節(jié)字雙字Max無符號數(shù)255/28-1216-1232-1Max有符號數(shù)127/27-1215-1231-1預備2:算術(shù)進位算術(shù)進位+1111110100000101000000011CF=1,OF=0+25251無效+-451有效無符號數(shù)有符號數(shù)進位CF的設置,由符號位的運算進位0或1產(chǎn)生的。對于無符號數(shù),產(chǎn)生了數(shù)據(jù)位的進位而無效。預備2:算術(shù)溢出溢出的兩情形:+011110010000101110000100CF=0,OF=1+12111132無效++12111-124有效無符號數(shù)有符號數(shù)情形1:當符號位有進位輸入,而沒有進位輸出時情形2:當進位輸出不是由進位輸入產(chǎn)生時+111101101000100101111111CF=1,OF=1無效++246137127無符號數(shù)有符號數(shù)1+-10-119127無效預備3:擴展字節(jié)字無符號數(shù)有符號數(shù)字雙字無符號數(shù)有符號數(shù)PreparingDividendTodivideawordinAXbyaword,AXmustbeconvertedtoadoublewordinDX:AXIfsigned:CWD(calledsign-extension)Ifunsigned:MOVDX,0Forbyte(inAL)toword(AX)conversionIfsigned:CBW(thesedonotaffectFlags)Ifunsigned:MOVAH,0加減運算溢出對有符號數(shù)的加減運算有影響,應注意。加法減法ADD通常加法SUB通常減法ADC帶進位的加法SBB帶借位的減法雙字值的算術(shù)運算例1:請運算WORD1B:WORD1AWORD2B:WORD2AWORD3B:WORD3AWORD1ADW0BC62HWORD1BDW0123HWORD2ADW553AHWORD2BDW0012HWORD3ADW?WORD3BDW?+程序:MOVAX,WORD1AADDAX,WORD2AMOVWORD3A,AXMOVAX,WORD1BADCAX,WORD2BMOVWORD3B,AX思考:將上述例子擴展,任意長度的字數(shù)據(jù)運算程序CLCMOVCX,02LEASI,WORD1ALEADI,WORD2ALEABX,WORD3AL20:MOVAX,[SI]ADCAX,[DI]MOV[BX],AX

INCSIINCSIINCDIINCDIINCBXINCBXLOOPL20乘法指令有符號數(shù)乘法 IMULsource無符號數(shù)乘法 MULsourcesource

:寄存器或內(nèi)存地址(但不能為常數(shù))格式字節(jié)×字節(jié)AX=AL*source字×字DX:AX=AX*source

CF=OF1若乘積的長度>操作數(shù)的長度0反之SF,ZF,AF,和PF無定義AH(不管)AL被乘數(shù)AX乘積DX(不管)AX被乘數(shù)乘積例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+字×字節(jié)MULTCANDW2521HDW3206HMULTPLRDW6400HPRODUCTDW0,0,0;lowerbyte*multplrMOVAX,MULTCANMULMULTPLRMOVPRODUCT,AXMOVPRODUCT+2,DX;higherbyte*multplrMOVAX,MULTCAN+2MULMULTPLR;addtwopartADDPRODUCT+2,AXADCPRODUCT+4,DX雙字乘法——雙字×雙字利用上述的思想,拆分為四次字乘法,將各個乘積加到相應的位置上,即可。被乘數(shù)AB乘數(shù)CDB×CB×DA×CB×D依次錯一個字節(jié)相加(進位加法)乘積占用4個字左移運算做乘法SHL左移一次,相當于×2運算左移代替乘法,好處:加快運算速度例如;SHLAX,01SHLWORDVAL,3除法指令有符號除法 IDIVdivisor無符號除法

DIVdivisordivisor

為寄存器或者內(nèi)存地址(非常數(shù))格式字除以字節(jié)AL=AX/divisorAH=AX%divisor雙字除以字AX=DX:AX/divisorDX=DX:AX%divisor所有的標記位沒有定義AX

被除數(shù)AH余數(shù)AL商除前除后DX

被除數(shù)AX余數(shù)商除前除后思考:若出現(xiàn)字節(jié)除以字節(jié),字除以字怎么辦?例DIV數(shù)據(jù):BYTE1DB80HBYTE2DB16HWORD1DW2000HWORD2DW0010HWORD3DW1000H例1:MOVAX,WORD1DIVBYTE1例2:MOVZXBYTE1DIVBYTE2例3:MOVDX,WORD2MOVAX,WORD3DIVWORD1例4:MOVAX,WORD1SUBDX,DXDIVWORD3例IDIV數(shù)據(jù):BYTE1DB80HBYTE2DB16HWORD1DW2000HWORD2DW0010HWORD3DW1000H例1:MOVAX,WORD1IDIVBYTE1例2:MOVZXBYTE1IDIVBYTE2例3:MOVDX,WORD2MOVAX,WORD3IDIVWORD1例4:MOVAX,WORD1CWDDIVWORD3除法溢出溢出發(fā)生在當字除以字節(jié)時:商超過一個字節(jié)當雙字除以字時:商超過一個字除法溢出,非法錯誤終止程序運行簡單的判斷溢出發(fā)生的方法:字除以字節(jié)時:AH>=divisor雙字除以字時:DX>=divisor防止除法溢出CMPAH,DIVBYTEJNBL20DIVDIVBYTEL20:……簡單的判斷溢出發(fā)生的方法:字除以字節(jié)時:AH>=divisor雙字除以字時:DX>=divisor;溢出處理

3算術(shù)運算(II)

——處理ASCII和BCD數(shù)據(jù)提要ASCII和BCD格式數(shù)據(jù)格式的運算格式間的轉(zhuǎn)換BCD和ASCII某數(shù)采用ASCII十進制數(shù)表示,每個字節(jié)存儲一個ASCII數(shù)字Binary-codeddecimal(BCD)數(shù)字采用4位二進制數(shù)表示各個十進制數(shù)一個十進制數(shù)采用非壓縮的BCD表示,低4位為相應的十進制數(shù)字符號,高4位為0一個十進制數(shù)采用壓縮的BCD表示,只用4位為相應的十進制數(shù)字符號例:5678ASCII: 4字節(jié) 35363738非壓縮的BCD: 4字節(jié) 05060708壓縮的BCD: 2字節(jié)5678AAA指令AAA(ASCIIadjustafteraddition)該指令對ADD或ADC指令的二進制結(jié)果進行調(diào)整使得在AL中的結(jié)果和ASCII數(shù)字表示相一致。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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論