还剩45页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
4ARTHIMETICANDLOGICALINSTRUCTIONSANDPROGRAMS
4.1USINGADDITIONANDSUBTRATION
4.
1.1AdditionofunsignednumbersTheformoftheADD/ADCinstructionis:adddestsource;dest=dest+sourceadcdestsource;dest=dest+source+CFTheinstructionsADDandADCareusedtoaddtwooperands.Thedestinationoperandcanbe:aregisterinmemoryThesourceoperandcanbe:aregisterinmemoryorimmediateRememberthatmemory-to-memoryoperationareNEVERallowedin80x86assemblylanguage.TheinstructioncouldchangeanyoftheZFSFAFCForPFbitoftheflagregisterdependingontheoperandsinvolved.Example:Showhowtheflagregisterisaffectedby:moval0f5haddal0bhSolution:F511110101+0B00001011---------------10000000000AftertheadditiontheALregisterdestinationcontains00Handtheflagsareasfollows:CF=1sincethereisacarryoutfromd7SF=0thestatusofd7oftheresultPF=1thenumberof1siszerozeroisanevennumberAF=1thereisacarryoutfromd3tod4ZF=1theresultoftheadditioniszerofor8bits
4.
1.
1.1Case1:AdditionofindividualbyteandworddataExample1:Writeaprogramtocalculatethetotalof5bytesofdata.Thedecimaldataisasfollow:12523519791and
48.titleprog3-1Aadding5bytes.modelsmall.stack64;----------------------------------.datacountequ05data1db1252351979148org0008hsumdw;----------------------------------.codemainprocfarmovax@datamovdsaxmovcxcount;CXistheloopcountermovsioffsetdata1;SIisthedatapointermovax00;AXwillbeholdthesumback:addal[si];addthenextbytetoALjncover;ifnocarrycontinueincah;elseaccumulatethecarryinAHover:incsi;incrementthedatapointerdeccx;decrementtheloopcounterjnzback;ifnotfinishedgoaddnextbytemovsumax;storesummovah4chint21h;gobacktoDOSmainendpendmainCodesegmentDatasegmentandstacksegmentExample2:Writeaprogramtocalculatethetotalsumof5wordsofdata.Thedecimaldataisasfollow:27345285212853330105and32375titleprog3-1Badding5words.modelsmall.stack64;----------------------------------.datacountequ05data2dw2734528521285333010532375org0010hsumdw2dup;----------------------------------.codemainprocfarmovax@datamovdsaxclc;clearcarrybeforefirstadditionmovcxcount;CXistheloopcountermovsioffsetdata2;SIisthedatapointermovax00;AXwillholdthesummovbxax;BXwillholdthecarriesback:addax[si];addthenextbytetoAXadcbx0;addcarrytoBXincsi;incrementthedatapointerincsi;twicetopointtonextworddeccx;decrementtheloopcounterjnzback;ifnotfinishedcontinueaddingmovsumax;storesummovsum+2bx;storethecarriesmovah4chint21h;gobacktoDOSmainendpendmain
4.
1.
1.2Case2:AdditionofmultiwordnumbersExample:Writeaprogramthataddsthefollowingtwomultiwordnumbersandsavestheresult:data1=548FB9963CE7Handdata2=3FCD4FA23B8DHtitleprog3-2multiwordaddition.modelsmall.stack64;----------------------------------.datadata1dq548FB9963CE7Horg0010hdata2dq3FCD4FA23B8DHorg0020hdata3dq;----------------------------------.codemainprocfarmovax@datamovdsaxclc;clearcarrybeforefistadditionmovsioffsetdata1;SIispointerforoperand1movdioffsetdata2;DIispointerforoperand2movbxoffsetdata3;BXispointerforthesummovcx04;CXistheloopcounterback:movax[si];movethefirstoperandtoAXadcax[di];addthesecondoperandtoAXmov[bx]ax;storethesumincsi;pointtonextwordofoperand1incsiincdi;pointtonextwordofoperand2incdiincbx;pointtonextwordofsumincbxloopback;ifnotfinishedcontinueaddingmovah4chint21h;gobacktoDOSmainendpendmainThereisanewinstructionintheprogram“LOOPXXXX”whichreplacesthe“DECCX”and“JNZXXXX”.TheformatofLOOPinstructionis:looptarget;loopuntilCX=0DecrementsCXby1thenjumpstotheoffsetindicatedbytheoperandifCXisnotzerootherwisecontinueswiththenextinstructionbelowtheLOOP.
4.
1.2Subtractionofunsignednumbers
4.
1.
2.1Subtractsubdestsource;dest=dest-sourceInsubtractionthe80x86microprocessorsusethe2’scomplementmethod.AlthougheveryCPUcontainsaddercircuitryitwouldbetoocumbersomeandtaketoomanytransistorstodesignseparatesubtractioncircuitry.Forthisreasonthe80x86usesinternaladdercircuitrytoperformthesubtractioncommand.Assumingthatthe80x86isexecutingsimplesubtractinstructiononecansummarizedthestepsofthehardwareoftheCPUinexecutingtheSUBinstructionforunsignednumbersasfollows:1Takethe2’scomplementofthesubtrahendsourceoperand2Addittotheminuenddestinationoperand3InvertthecarryThesethreestepsareperformedforeverySUBinstructionbytheinternalhardwareofthe80x86CPUregardlessofthesourceanddestinationoftheoperandsaslongastheaddressingmodeissupported.Itisafterthesethreestepsthattheresultisobtainedandtheflagareset.Example1:Showthestepsinvolvedinthefollowing:moval3fh;loadAL=3FHmovbh23h;loadBH=23Hsbbalbh;subtractBHfromALplaceresultinALSolution:AL 3F 00111111 00111111-BH-23-00100011+110111012’scomplement--------------1C100011100CF=0step3Theflagswouldbesetasfollows:CF=0ZF=0AF=1PF=0andSF=
0.AftertheexecutionofSUBifCF=0theresultispositive;ifCF=1theresultisnegativeandthedestinationhasthe2’scomplementoftheresult.Example2:Analyzethefollowingprogram;fromthedatasegmentdata1db4chdata2db6ehdata3db;fromthecodesegmentmovdhdata1;loadDHwithdata1value4Csubdhdata2;subtractdata26EfromDH4Cjncnext;ifCF=0jumptonexttargetnotdh;ifCF=1thentake1’scomplementincdh;andincrementto2’scomplementnextmovdata3dh;savetheDHindata3Solution:Followingthethreestepsfor“SUBDHDATA2” 4C01001100 01001100-6E011011102’scomplement+ 10010010 --------------220 11011110CF=1step3notdh 00100001incdh 00100010TheformatoftheNOTinstruction:notdest;dest=dest1’scomplementofdest(逐位求反)Eachbitisinverted.求反加1就是求补码
4.
1.
2.2Subtractwithborrowsbbdestsource;dest=dest–CF-sourceThisinstructionisusedformultibytemultiwordnumbersandwilltakecareoftheborrowoftheloweroperand.Ifthecarryflagis0SBBworkslikeSUB.Ifthecarryis1SBBsubtract1fromtheresult.Example:Analyzethefollowingprogram:data_add62562fahdata_bdd412963bhresultdd...movaxwordptrdata_a;AX=62FAsubaxwordptrdata_b;sub963BfromAXmovwordptrresultax;savetheresultmovaxwordptrdata_a+2;AX=0625sbbaxwordptrdata_b+2;sub0412withborrowmovwordptrresult+2ax;savetheresultSolution:AftertheSUBAX=62FA–963B=CCBFandthecarryflagisset.SinceCF=1whenSBBisexecutedAX=0625–0412–1=
212.ThereforethevaluestoredinRESULTis0212CCBF.ThePTRpointerdataspecifierdirectiveiswidelyusedtospecifythesizeoftheoperandwhenitdiffersfromthedefinedsize.Format:byteptrwordptrdwordptrqwordptr
4.2UNSIGNEDMULTIPLICATIONANDDIVISIONInmultiplyingordividingtwonumbersin80x86microprocessortheuseofregistersAXALAHandDXisnecessary.
4.
2.1MultiplicationofunsignednumbersFormat:mulsource;AX=source× ALor;DX:AX=source× AXAffectedflags:OFCF.Unpredictable:SFZFAFPFALr8/m8×ALAHAX×r16/m16AXDX图4‑1IllustrationofthemultiplicationIndiscussingmultiplicationthefollowingcaseswillbeexamined:bytetimesbytewordtimeswordwordtimesbyte
4.
2.
1.1Case1:byte×byteInbytebybytemultiplicationoneoftheoperandmustbeintheALregisterandthesecondoperandcanbeeitherinaregisterorinmemory.AfterthemultiplicationtheresultisinAX.;fromthedatasegment:data1db25hdata2db65hresult1dw;fromthecodesegment:;--------registeraddressingmode------------------movaldata1;abyteismovedtoALmovbldata2;abyteismovedtoBLmulbl;AX=25Hx65Hmovresult1ax;theresultissaved;--------directaddressingmode--------------------movaldata1muldata2movresult1ax;--------registerindirectaddressingmode---------movaldata1movsioffsetdata2mulbyteptr[si]movresult1ax
4.
2.
1.2Case2:word×wordInthewordbywordmultiplicationoneoperandmustbeinAXandthesecondoperandcanbeinaregisterormemory.AfterthemultiplicationregistersAXandDXwillcontaintheresult.;fromthedatasegment:data3dw2378hdata4dw2f79hresult2dw2dup;fromthecodesegment:movaxdata1;loadfirstoperandtoAXmuldata4;multiplyitbyethesecondoperandmovresult2ax;storethelowerwordresultmovresult2+2dx;storethehigherwordresult
4.
2.
1.3Case3:word×byteThisissimilartowordbywordmultiplicationexceptthatALcontainsthebyteoperandandAHmustbesettozero.;fromthedatasegment:data5db6bhdata6dw12C3hresult3dw2dup;fromthecodesegment:movaldata5;ALholdbyteoperandsubahah;AHmustbeclearedmuldata6;byteinALmultipliedby;wordoperandmovbxoffsetresult3;bxpointstothestorages;forproductmov[bx]ax;AXholdslowerwordmov[bx]+2dx;DXholdshigherword表4‑1UnsignedMultiplicationSummaryMultiplicationOperand1Operand2Resultbyte×byteALregisterormemoryAXword×wordAXregisterormemoryDXAXword×byteAL=byteAH=0registerormemoryDXAX
4.
2.2DivisionofunsignednumbersFormat:divsource;divideAXbysourceor;divideDX:AXbysourceUnpredictableflags:OFSFZFAFPFCF.DX÷ALAHr8/m8÷DXAXr16/m16AXAXquotientremainder图4‑2Illustrationofthedivision
4.
2.
2.1Case1:byte/byteIndividingabytebyabytethenumeratormustbeintheALregisterandAHmustbesetitzero.Thedenominatorcannotbeimmediatebutcanbeinaregisterorinmemory.AftertheDIVinstructionisperformedthequotientisinALandtheremainderisinAH.;fromthedatasegment:data7db95data8db10quot1dbremain1db;fromthecodesegment:;-----------------------------------------;usingimmediateaddressingmodewillgivenanerrormovaldata7;movedataintoALsubahah;clearAHdiv10;NOTALLOWED!;-----------------------------------------;allowablemodesincludes:;-----------------------------------------;usingdirectmodemovaldata7;ALholdsnumeratorsubahah;AHmustbecleareddivdata8;divideAXbydata8movquot1al;quotient=AL=09movremain1ah;remainder=AH=05;-----------------------------------------;usingregistermodemovaldata7;ALholdsnumeratorsubahah;AHmustbeclearedmovbhdata8;movedenominatortoregisterdivbh;divideAXbybhmovquot1al;quotient=AL=09movremain1ah;remainder=AH=05;-----------------------------------------;usingregisterindirectmodemovaldata7;ALholdsnumeratorsubahah;AHmustbeclearedmovbxoffsetdata8;BXholdstheoffsetofdata8divbyteptr[bx];divideAXbydata8movquot1al;quotient=AL=09movremain1ah;remainder=AH=
054.
2.
2.2Case2:word/wordInthiscasenumeratorisinAXandDXmustbecleared.Thedenominatorcanbeinaregisterormemory.AftertheDIVAXwillhavethequotientandremainderwillbeinDX.movax10050;AXholdsnumeratorsubdxdx;DXmustbeclearedmovbx100;BXholdsdenominatordivbxmovquot2ax;quotient=AX=64H=100movrenaim2dx;remainder=DX=32H=
504.
2.
2.3Case3:word/byteAgainnumeratorisinAXandthedenominatorcanbeinaregisterormemory.AftertheDIVinstructionALwillcontainsthequotientandAHwillcontainstheremainder.ThemaximumquotientisFFH.movax2055;AXholdsnumeratormovcl100;BXholdsdenominatordivclmovquot3al;ALholdsthequotientmovrenaim3ah;AHholdstheremainder
4.
2.
2.4Case4:doubleword/wordThenumeratorisinAXandDXwiththemostsignificantwordinDXandtheleastsignificantwordinAX.thedenominatorcanbeinaregisterorinmemory.AftertheDIVinstructionthequotientwillinAXtheremainderinDX.ThemaximumquotientisFFFFH.;fromthedatasegmentdata9dd105432data10dw10000quto4dwremain4dw;fromthecodesegmentmovaxwordptrdata9;AXholdslowerwordmovdxwordptrdata9+2;DXholdshigherworddivdata2movquot4ax;AXholdsquotientmovremain4dx;DXholdsremainderHowdoestheCPUknowthatismustbethedoublewordinDX:AXforthenumeratorThe8086/88automaticallyusesDX:AXasthenumeratoranytimethedenominatorisawordinsize.表4‑2UnsignedDivisionSummaryDivisionNumerator分子Denominator分母QuotientRemainderbyte÷byteAL=byteAH=0registerormemoryALAHword÷wordAX=wordDX=0registerormemoryAXDXword÷byteAX=wordregisterormemoryALAHdoubleword÷wordDXAX=doublewordregisterormemoryAXDX
4.3LOGICALINSTRCUTIONANDSAMPLEPRGROM
4.
3.1ANDLogicalAND.Format:anddestsource;dest=destANDsourceFunction:PerformalogicalANDontheoperandbitbybitstoringtheresultinthedestination.Thedestinationoperandcanbearegisterorinmemory.Thesourceoperandcanbearegisterinmemoryorimmediate.Flags:Affected:CF=0OF=0SFZFPF.Unpredictable:AF.
4.
3.2ORLogicalOR.Format:ordestsourceFunction:PerformalogicalORonthebitsoftwooperandbitbybitreplacingthedestinationwiththeresult.Oftenusedtoturnabiton.Thedestinationoperandcanbearegisterorinmemory.Thesourceoperandcanbearegisterinmemoryorimmediate.Flags:Affected:CF=0OF=0SFZFPF.Unpredictable:AF.
4.
3.3XORExclusiveXOR.Format:xordestsourceFunction:PerformalogicalexclusiveORonthebitsoftwooperandbitbybitandputstheresultinthedestination.Flags:Affected:CF=0OF=0SFZFPF.Unpredictable:AF.
4.
3.4CompareofunsignednumbersFormat:cmpdestsource;setflagasif”subdestsource”Function:Comparestwooperandsofthesamesize.Thesourceandthedestinationoperandsarenotaltered.PerformscomparisonbysubtractingthesourceoperandfromthedestinationandsetsflagsasifSUBwereperformed.Flags:Affected:OFSFZFAFPFCF.Therelevantflagsasfollows:表4‑3RelevantflagsofCMPCFZFSFOFdestsource000SFdest=source010SFdestsource101inverseofSFExample1Assumethatthereisaclassof5peoplewiththefollowinggrades:
6987964575.Findthehighestgrade.;Thefollowingprogramfindsthehighestamong5gradesTITLEPROG3-3EXECMPEXAMPLE.MODELSMALL.STACK64;--------------.DATAGRADESDB6987964575ORG0008HIGHESTDB;--------------.CODEMAINPROCFARMOVAX@DATAMOVDSAXMOVCX5;setuploopcounterMOVBXOFFSETGRADES;BXpointstoGRADEdataSUBALAL;ALholdshighestgrade;foundsofarAGAIN:CMPAL[BX];comparenextgradetohighestJANEXT;jumpifALstillhighestMOVAL[BX];elseALholdsnewhighestNEXT:INCBX;pointtonextgradeLOOPAGAIN;continuesearchMOVHIGHESTAL;storehighestgradeMOVAH4CHINT21H;gobacktodosMAINENDPENDMAINExample2:TITLEPROG3-4EXELOWERCASETOUPPERCASECONVERSION.MODELSMALL.STACK64;--------------.DATADATA1DBmYNAMEISjASONORG0020HDATA2DB16DUP;--------------.CODEMAINPROCFARMOVAX@DATAMOVDSAXMOVSIOFFSETDATA1;SIpointstooriginaldataMOVBXOFFSETDATA2;BXpointstouppercasedataMOVCX16;CXisloopcounterBACK:MOVAL[SI];getnextcharacterCMPAL61H;iflessthanaJBOVER;thennoneedtoconvertCMPAL7AH;ifgreaterthanzJAOVER;thennoneedtoconvertANDAL11011111B;maskd5toconverttouppercaseOVER:MOV[BX]AL;storeuppercasecharacterINCSI;incrementpointertooriginalINCBX;incrementpointerto;uppercasedataLOOPBACK;continueloopingifCX0MOVAH4CHINT21H;gobacktodosMAINENDPENDMAIN
4.
3.5IBMBIOSmethodofconvertingfromlowercasetouppercase2357;--CONVERTANYLOWERCASETOUPPERCASE2358EBFB2359K60:;LOWERTOUPPEREBFB3C612360CMPAL’a’;FINDOUTIFALPHABETICEBFD72062361JBK61;NOT_CAPS_STATEEBFF3C7A2362CMPAL’z’EC0177022363JAK61;NOT_CAPS_STATEEC032C202364SUBAL’a’-’A’;CONVERTTOUPPERCASEEC052365K61:EC058B1E1C002366MOVBXBUFFER_TAIL;GETTHEENDPOINTER;TOTHEBUFFER
4.
3.6TestbitsFormat:testdestsource;performdestANDsourceFunction:PerformsalogicalANDontwooperandssettingflagsbutleavingthecontentsofbothdestinationandsourceoperandunchanged.WhiletheANDinstructionchangesthecontentsofbothdestinationandsourceandtheflagbitstheTESTinstructionchangesonlytheflagbits.Flags:Affected:OFSFZFPFCF.Unpredictable:AF.Example:AssumethatD0andD1ofport27indicateconditionAandBrespectivelyiftheyarehighandonlyoneofthemcanbeinhighatagiventime.TheTESTinstructioncanbeusedasfollows:movalport_27testal00000001b;checktheconditionAjnzcase_a;jumptoindicateconditionAtestal00000010b;checktheconditionAjnzcase_b;jumptoindicateconditionB...case_a:......case_b......
4.4BCDANDASCIIOPERANDSANDINSTRUCTIONS
4.
4.1BCDnumbersystemBCDstandsforbinarycodeddecimal.BCDisneededbecausehumanbeginsusethedigits0to9fornumbers.Binaryrepresentationof0to9iscalledBCD.IncomputerliteratureoneencounterstwotermsforBCDnumbers:unpackedBCDpackedBCD
4.
4.2UnpackedBCDInunpackedBCDthelower4bitsofthenumberrepresenttheBCDnumberandtherestofthebitsare
0.Example:“00001001”and“00000101”areunpackedBCDfor9and
5.InthecaseofunpackedBCDittakes1byteofmemorylocationoraregisterof8bitstocontainit.
4.
4.3PackedBCDInthecaseofthepackedBCDasinglebytehastwoBCDnumbersinitoneinthelower4bitsandoneintheupperbits.Forexample“01011001”ispackedBCDfor59ittakes1byteofmemorytostorethepackedBCDoperands.
4.
4.4ASCIInumberInASCIIkeyboardswhenkey“0”isactivatedforexample“0110000”30Hisprovidedtothecomputer.表4‑4ASCIIandBCDKeyASCIIhexBinaryBCDunpacked
0300110000000000001310110001000000012320110010000000103330110011000000114340110100000001005350110101000001016360110110000001107370110111000001118380111000000010009390111001000010014.
4.5ASCIItounpackedBCDconversionExample1:;fromthedatasegmentASCdb’9562481273’UNPACKdb10dup;fromthecodesegmentMOVCX5;CXisloopcounterMOVBXOFFSETASC;BXpointstoASCIIdataMOVDIOFFSETUNPACK;DIpointstounpackedBCDdataAGAIN:MOVAX[BX];movenext2ASCIInumberstoAXANDAX0F0FH;removeASCII3sMOV[DI]AX;storeunpackedBCDADDDI2;pointtonextunpackedBCDdataADDBX2;pointtonextASCIIdataLOOPAGAINNoticethatalthoughthedatawasdefinedasDBitwasaccessedinword-sizechunks.Thisisworkableapproach;howeverusingthePTRdirectiveasshowninthefollowingprogrammakesthecodemorereadableforprogrammers.Example2:;fromthedatasegmentASCdb’9562481273’UNPACKdb10dup;fromthecodesegmentMOVCX5;CXisloopcounterMOVBXOFFSETASC;BXpointstoASCIIdataMOVDIOFFSETUNPACK;DIpointstounpackedBCDdataAGAIN:MOVAXWORDPTR[BX];movenext2ASCIInumberstoAXANDAX0F0FH;removeASCII3sMOVWORDPTR[DI]AX;storeunpackedBCDADDDI2;pointtonextunpackedBCDdataADDBX2;pointtonextASCIIdataLOOPAGAINExample3:;fromthedatasegmentASCdb’9562481273’UNPACKdb10dup;fromthecodesegmentMOVCX10;loadthecounterSUBBXBX;clearBXAGAIN:MOVALASC[BX];movetoALcontentof;mem[BX+ASC]ANDAL0FH;masktheuppernibbleMOVUNPACK[BX]AL;movetomem[BX+UNPACK]theALINCBX;makethepointertopoint;atnextbyteLOOPAGAIN;loopuntilitisfinishedThisprogramusesthebasedaddressingmodesinceBX+ASCisusedaspointer.ASCisthedisplacementaddtoBX.
4.
4.6ASCIItopackedBCDconversionToconversionASCIItopackedBCDitisfirstconvertedtounpackedBCDtogetridofthe3andthecombinedtomakepackedBCD.Example:org0010hval_ascdb’47’val_bcddb;reminder:theDBwillput34Hin0010Hlocationand37Hin0011Hmovaxwordptrval_asc;AH=37HAL=34Handax0f0fh;mask3togetunpackedBCDxchgahal;swapAHandALmovcl4;toshift4timesshlahcl;AH=40Horalah;ORthemtogetpackedBCDmovval_bcdal;savetheresult�andax0f0fhxchgahalmovcl4shlahcloralahmovval_bcdal0011010000110111AHAL000001000000011100000111movaxwordptrval_asc00000100000001110100000001000111010000000100011101000000val_bcddbDataSegment3734DS:0010DS:0011DS:0012val_ascdb’47’图4‑3IllustrationoftheconversionfromASCIItoBCD
4.
4.7PackedBCDtoASCIIToconvertpackedBCDtoASCIIitmustfirstbeconvertedtounpackedandthentheunpackedBCDistaggedwith011000030H.Example:org0010hval_bcddb47Hval_ascdw;------------------------------------movalval_bcdmovahal;copyALtoAHnowAH=AL=47Handax0f00fh;mask4fromAHand7fromALmovcl04;CL=4forshiftshrahcl;shiftrightAHtogetunpackedBCDorax3030h;combinewith30HtogetASCIIxchgahal;swapforASCIIstorageconventionmov[di]ax;storeASCIIdata�movalval_bcdval_bcddb47HDataSegment-37-3447DS:0012val_ascdwandax0f00fhxchgahalmovcl4shrahclorax3030hmovval_ascax01000111AHAL00110100DS:0010DS:001100110111010001110000011101000000000001110000010000110111001101000011010000110111movahal01000111图4‑4IllustrationoftheconversionfromBCDtoASCII
4.
4.8BCDadditionandcorrectionThereisaproblemwithaddingBCDnumbers.Lookatthisexample:moval17haddal28haddingthemgives00111111B3FHwhichisnotBCD!TheDAAdecimaladjustforadditioninstructionin80x86microprocessorsisprovidedexactlyforthepurposeofcorrectingtheproblemassociatedwithBCDaddition.Format:DAAFunction:ThisinstructionisusedafteradditionofBCDnumberstoconverttheresultbacktoBCD.Itadds6tothelower4bitsofALifitisgreaterthan9orifAF=
1.Thenitadds6toupper4bitsofALifitisgreaterthen9orifCF=
1.Flags:Affected:SFZFAFPFCFOF Hex BCD 29 00101001+18+ 00011000--------------- 41 01000001AF=1+ 6+ 0110becauseAF=1DAAwilladd6tothelowernibble--------------- 47 01000111thefinalresultisBCDExample:ThefollowingprogramdemonstratestheuseofDAAafteradditionofmultibytespackedBCDnumbers.TwosetofASCIIdatahavecomeformthekeyboard.Writeaprogramto:ConvertfromASCIItopackedBCDAddthemultibytespackedBCDandsaveitConvertthepackedBCDresultintoASCIITITLEPROG3-6EXEASCIITOBCDCONVERSIONANDADDITION.MODESMALL.STACK64;--------------.DATADATA1_ASCDB0649147816ORG0010HDATA2_ASCDB0072687188ORG0020HDATA3_BCDDB5DUPORG0028HDATA4_BCDDB5DUPORG0030HDATA5_ADDDB5DUPORG0040HDATA6_ASCDB10DUP;--------------.CODEMAINPROCFARMOVAX@DATAMOVDSAXMOVBXOFFSETDATA1_ASC;BXpointstofirstASCIIdataMOVDIOFFSETDATA3_BCD;DIpointstofirstBCDdataMOVCX10;CXholdsnumberbytes;toconvertCALLCONV_BCD;convertASCIItoBCDMOVBXOFFSETDATA2_ASC;BXpointstosecondASCIIdataMOVDIOFFSETDATA4_BCD;DIpointstosecondBCDdataMOVCX10;CXholdsnumberbytes;toconvertCALLCONV_BCD;convertASCIItoBCDCALLBCD_ADD;addtheBCDoperandsMOVSIOFFSETDATA5_ADD;SIpointstoBCDresultMOVDIOFFSETDATA6_ASC;DIpointstoASCIIresultMOVCX05;CXholdscountforconvertCALLCONV_ASC;convertresulttoASCIIMOVAH4CHINT21H;gobacktoDOSMAINENDP;---------------;THISSUBROUTINECONVERTSASCIITOPACKEDBCDCONV_BCDPROCAGAIN:MOVAX[BX];BX=pointerforASCIIdataXCHGAHALANDAX0F0FH;maskASCII3sPUSHCX;savethecounterMOVCL4;shiftAHleft4bitsSHLAHCL;togetreadyforpackingORALAH;combinetomakepackedBCDMOV[DI]AL;DI=pointerforBCDdataADDBX2;pointtonext2ASCIIbytesINCDI;pointtonextBCDdataPOPCX;restoreloopcounterLOOPAGAINRETCONV_BCDENDP;---------------;THISSUBROTINEADDSTWOMULTIBYTEPACKEDBCDOPERANDSBCD_ADDPROCMOVBXOFFSETDATA3_BCD;BX=pointerforoperand1MOVDIOFFSETDATA4_BCD;DI=pointerforoperand2MOVSIOFFSETDATA5_ADD;SI=pointerforsumMOVCX05CLCBACK:MOVAL[BX]+4;getnextbyteofoperand1ADCAL[DI]+4;addnextbyteofoperand2DAA;correctforBCDadditionMOV[SI]+4AL;savesumDECBX;pointtonextbyteofoperand1DECDI;pointtonextbyteofoperand2DECSI;pointtonextbyteofsumLOOPBACKRETBCD_ADDENDP;---------------;THISSUBROUTINECONVERTSFROMPACKEDBCDTOASCIICONV_ASCPROCAGAIN2:MOVAL[SI];SI=pointerforBCDdataMOVAHAL;duplicatetounpackANDAX0F00FH;unpackPUSHCX;savecounterMOVCL04;shiftright4bitstounpackSHRAHCL;theuppernibbleORAX3030H;makeitASCIIXCHGAHAL;swapforASCIIstorageconventionMOV[DI]AX;storeASCIIdataINCSI;pointtonextBCDdataADDDI2;pointtonextASCIIdataPOPCX;restoreloopcounterLOOPAGAIN2RETCONV_ASCENDPENDMAIN
4.
4.9BCDsubtractionandcorrectionWhensubtractingpackedBCDoperandstheDASdecimaladjustaftersubtractioninstructionisputaftertheSUBorSBBinstruction.Format:DASFunction:ThisinstructionisusedaftersubtractionofBCDnumberstoconverttheresultbacktoBCD.Ifthelower4bitsofALrepresentanumbergreaterthen9orifAF=1then6issubtractfromthelowernibble.Iftheupper4bitsofALisnowgreaterthen9orifCF=16issubtractfromtheuppernibble.Flags:Affected:SFZFAFPFCF.UnpredictableOF
4.
4.10ASCIIadditionandsubtractionASCIInumberscanbeusedasoperandsinaddandsubtractinstructionsthewaytheyarewithoutmaskingthetagged011usingtheinstructionsAAAandAAS.
4.
4.
10.1AAAACSIIadjustafteradditionFormat:AAAFunction:ThisinstructionisusedafteranADDinstructionhasaddedtwodigitsinASCIIcode.ThisismakesitispossibletoaddASCIInumberswithoutmaskingofftheuppernibble“3”.TheresultwillbeunpackedBCDinALwithcarryflagsetifneeded.ThisinstructionadjustsonlyontheALregister.AHisincrementedifthecarryflagisset.Flags:Affected:AFCF.Unpredictable:OFSFZFPFExample1:moval31h;AL=31theASCIIcodefor1addal37h;add37ASCIIfor7toALAL=68Haaa;AL=08HandCF=0Example2:moval’9’;AL=39Haddal’5’;add35HtoALthenAL=6EHaaa;nowAL=04HCF=1oral30h;convertresulttoASCIIExample3:InthefollowingprogramtheDBdirectiveisusedtodefineASCIIvaluesthismakestheLSDleastsignificantdigitbelocatedatthehighestmemorylocationofthearrayinVALUE137ASCIIfor7isinmemorylocation0009;thereforeBXmustbepointedtothatandthendecremented.TITLEPROG3-7EXEADDINGASCIINUMBERSSTSEGSEGMENTDB64DUPSTSEGENDS;--------------DTSEGSEGMENTVALUE1DB0659478127ORG0010HVALUE2DB0779563678ORG0020HRESULT1DB10DUPORG0030HRESULT2DB10DUPDTSEGENDS;--------------CDSEGSEGMENTMAINPROCFARASSUMECS:CDSEGDS:DTSEGSS:STSEGMOVAXDTSEGMOVDSAXCALLASC_ADD;callASCIIadditionsubroutineCALLCONVERT;callconverttoasciisubroutineMOVAH4CHINT21H;gobacktoDOSMAINENDP;---------------;THISSUBROUTINEADDSTHEASCIINUMBERSANDMAKESTHERESULTUNPACKED.ASC_ADDPROCCLC;clearthecarryMOVCX10;setuploopcounterMOVBX9;pointtoLSDBACK:MOVALVALUE1[BX];movenextbyteofoperand1ADCALVALUE2[BX];addnextbyteofoperand2AAA;adjusttomakeitunpackedBCDMOVRESULT1[BX]AL;storeBCDsumDECBX;pointtonextbyteLOOPBACKRETASC_ADDENDP;---------------;THISSUBROUTINECONVERTSUNPACKEDBCDTOASCIICONVERTPROCMOVBXOFFSETRESULT1;BXpointstounpackedBCDdataMOVSIOFFSETRESULT2;SIpointstoASCIIdataMOVCX05;CXisloopcounterBACK2:MOVAXWORDPTR[BX];getnext2ASCIIbytesORAX3030H;insertASCII3sMOVWORDPTR[SI]AX;storeASCIIADDBX2;incrementBCDpointerADDSI2;incrementASCIIpointerLOOPBACK2RETCONVERTENDPCDSEGENDSENDMAIN
4.
4.
10.2AASACSIIadjustaftersubtractionFormat:AASFunction:AfterthesubtractionoftwoASCIIdigitsthisinstructionisusedtoconverttheresultinALtounpackedBCD.OnlyALisadjusted;thevalueinAHwillbedecrementedifthecarryisset.Flags:Affected:AFCF.Unpredictable:OFSFZFPFExample4:moval’2’;AL=32Hmovdh37H;DH=37HASCIIfor7subaldh;AL-DH=32-37=FBHwhichis-5in2’scomplement;CF=1indicatingaborrowaas;nowAL=05andCF=
14.
4.11UnpackedBCDmultiplicationanddivisionTheretwoinstructionsdesignedspecificallyformultiplicationanddivisionofunpackedBCDoperands.
4.
4.
11.1AAMASCIIadjustaftermultiplicationFormat:AAMFunction:ThisinstructionisusedaftertheMULinstructionhasmultipliedtwounpackedBCDnumbers.ItconvertsAXfrombinarytounpackedBCD.AAMadjustonlyALandanydigitsgreaterthan9arestoredinAH.AbetternameforthiswouldbeBCDtobinaryconversionaftermultiplication.Flags:Affected:AFCF.Unpredictable:OFSFZFPFExample:moval’5’;AL=35Handal0fh;AL=05unpackedBCDfor5movbl’4’;BL=34Handbl0fh;BL=04unpackedBCDfor4mulbl;AX=0014H=20decimalaam;AX=0020orax3030h;AX=3230HASCIIfor
204.
4.
11.2AADASCIIadjustbeforedivisionFormat:AADFunction:UsedbeforetheDIVinstructiontoconverttwounpackedBCDdigitsinALandAHtobinary.ThisallowsdivisionofASCIInumbers.BeforetheAADinstructionisexecutedtheASCIItag3mustbemaskedfromtheuppernibbleofAHandAL.AbetternameforthiswouldbeBCDtobinaryconversionbeforedivision.Flags:Affected:SFZFPF.Unpredictable:OFAFCFExample:movax3435h;AL=3435HtheASCIIfor45andax0f0fh;AX=0405HunpackedBCDfor45aad;AX=002DHhexfor45movdl07h;DL=07divdl;2DH/07HgivesAL=06HAH=03Horax3030h;AL=36H=quotientandAH=33H=remainder
4.5BITWISEOPERATIONS
4.
5.1Shiftinstructions
4.
5.
1.1ShiftrightFormat:shrdestnFunction:Thisinstructionisusedforunsignednumber.TheoperandisshiftedrightbitbybitandforeveryshifttheLSBleastsignificantwillgotothecarryflagandtheMSBmostsignificantisfilledwith
0.Theoperandcanbeinaregisterorinmemory.Note:“n”mustbe1orCL.Flags:Affected:OFSFZFPFCF.Unpredictable:AF.CFMSBLSB0图4‑5IllustrationofSHR
4.
5.
1.2ShiftleftFormat:shldestnFunction:Thisinstructionisusedforunsignednumber.TheoperandisshiftedleftbitbybitandforeveryshifttheMSBmostsignificantwillgotothecarryflagandtheLSBleastsignificantisfilledwith
0.Theoperandcanbeinaregisterorinmemory.Note:“n”mustbe1orCL.Flags:Affected:OFSFZFPFCF.Unpredictable:AF.CFMSBLSB0图4‑6IllustrationofSHL
4.
5.
1.3ShiftarithmeticrightCFMSBLSB图4‑7IllustrationofSAR
4.
5.
1.4ShiftarithmeticleftCFMSBLSB0图4‑8IllustrationofSAL
4.
5.2Rotateinstructions
4.
5.
2.1RotaterightFormat:rordestn;rotatedest.rightnbitpositionsFunction:Rotatesthebitsofawordorabyteindicatedbythesecondoperandright.ThebitsrotatedoutofthewordorbytearerotatedbackintothewordorbyteattheMSB.Theoperandcanbeinaregisterorinmemory.Note:“n”mustbe1orCL.Flags:Affected:OFCF.CFMSBLSB图4‑9IllustrationofROR
4.
5.
2.2RotateleftFormat:roldestn;rotatedest.leftnbitpositionsFunction:Rotatesthebitsofawordorabyteindicatedbythesecondoperandleft.ThebitsrotatedoutofthewordorbytearerotatedbackintothewordorbyteattheLSB.Theoperandcanbeinaregisterorinmemory.Note:“n”mustbe1orCL.Flags:Affected:OFCF.CFMSBLSB图4‑10IllustrationofROLExample:Writeaprogramfindthenumberof1sinabyte.;Fromthedatasegment:DATA1DB97HCOUNTDB;Fromthecodesegment:SUBBLBL;clearBLtokeepthenumberof1sMOVDL8;rotatetotalof8timesMOVALDATA1AGAIN:ROLAL1;rotateitonceJNCNEXT;checkfor1INCBL;ifCF=1thenaddonetocountNEXT:DECDL;gothroughthis8timesJNZAGAIN;ifnotfinishedgobackMOVCOUNTBL;savethenumberof1s
4.
5.
2.3RotaterightthroughcarryFormat:rcrdestn;rotatedest.rightnbitpositionsFunction:Rotatesthebitsoftheoperandright.ThebitsrotatedoutoftheoperandarerotatedbackintotheCFandtheCFisrotatedintotheMSBofthewordorbyte.Theoperandcanbeinaregisterorinmemory.Note:“n”mustbe1orCL.Flags:Affected:OFCF.CFMSBLSB图4‑11IllustrationofRCR
4.
5.
2.4RotateleftthroughcarryFormat:rcldestn;rotatedest.leftnbitpositionsFunction:Rotatesthebitsoftheoperandleft.ThebitsrotatedoutoftheoperandarerotatedbackintotheCFandtheCFisrotatedintotheLSBofthewordorbyte.Theoperandcanbeinaregisterorinmemory.Note:“n”mustbe1orCL.Flags:Affected:OFCF.CFMSBLSB图4‑12IllustrationofRCL
4.6SIGNEDNUMBERARITHMETICOPERATIONS
4.
6.1ConceptofsignednumbersincomputesThemostsignificantbitMSBissetasideforthesign+or-andtherestofthebitsareusedforthemagnitude.Thesignisrepresentedby0forpositive+numbersand1fornegative-numbers.
4.
6.
1.1Byte-sizednumbersInsignedbyteoperandsD7MSBisthesignandD0toD6aresetasideforthemagnitudeofthenumber.�magnitude�sign�D7D6D5D4D3D2D1D0图4‑13Illustrationofbyte-sizednumbersPositivenumbersIfD7=0theoperandispositiveandifD7=1itisnegative.Therangeofpositivenumbersthatcanberepresentedbytheformataboveis0to+
127.
1.000001015in8-bitbinary
2.11111010inverteachbit
3.11111011add1hex=FBHThisisthesignednumberrepresentationin2’scomplementfor-
5.Example:Show-34HasitisrepresentedinternallySolution:
1.0011010034in8-bitbinary
2.11001011inverteachbit
3.11001100add1hex=CCHExample:Showtherepresentationfor-128Solution:
1.10000000128in8-bitbinary
2.01111111inverteachbit
3.10000000add1hex=FFHNoticethat10000000isnotnegativezero-0Therangeofbyte-sizednegativenumbersis-1to-
128.Thefollowinglistsbyte-sizedsignednumbersranges:DecimalBinaryHex-1281000000080-1271000000181-
4.
6.
1.2Word-sizednumbersIn80x86computersawordis16bitsinlength.SettingasidetheMSBD15forthesignleavesatotalof15bitsD14–D0forthemagnitude.�D15D14D13D12D11D10D9D8D7D6D5D4D3D2D1D0sign�magnitude�图4‑14Illustrationofword-sizednumbersThisgivesarangeof-32768to+
32767.DecimalBinaryHex-3276810000000000000008000-3276710000000000000018001-
4.
6.2OverflowprobleminsignednumberoperationsLookatthefollowingcodeanddatasegment:data1db+96data2db+
70...movaldata1movbldata2addalbl+9601100000+7001000110 ------------+16610100110OF=1SF=1CF=0AccordingtotheCPUthisis-90whichiswrong.WhyThereasonisthattheresultwasmorethenthatwhatALcouldhandle.Likeallother8-bitregistersALcouldonlycontainupto+
127.ThedesignersoftheCPUcreatedtheoverflowflagspeciallyforthepurposeofinformingtheprogrammersthattheresultofthesignednumbersoperationiserroneous.
4.
6.
2.1Whentheoverflowflagissetin8-bitoperationsIn8-bitsignednumberoperationsOFissetto1ifeitherofthefollowingtwoconditionsoccurs:1ThereisacarryfromD6toD7butnocarryoutofD7CF=02ThereisacarryfromD7outCF=1butnocarryfromD6toD
7.Inotherwordstheoverflowflagissetto1ifthereisacarryfromD6toD7orfromD7outbutnoboth.ThismeansthatifthereisacarryfromD6toD7andfromD7outOF=
0.Example:Observetheresultsofthefollowing.moval96movbl70addalbl+9601100000+7001000110 ------------+16610100110OF=1SF=1CF=0AccordingtotheCPUtheresultis-90whichiswrong.TheerrorisindicatedbythefactthatOF=
1.ThereisacarryfromD6toD7butnocarryoutofD7CF=0√ThereisacarryfromD7outCF=1butnocarryfromD6toD
7.×Example:Observetheresultsofthefollowing.movdl-128movch-2adddlch-12810000000+- 211111110--------------13001111110OF=1SF=0CF=1AccordingtotheCPUtheresultis+126whichiswrong.TheerrorisindicatedbythefactthatOF=
1.ThereisacarryfromD6toD7butnocarryoutofD7CF=0×ThereisacarryfromD7outCF=1butnocarryfromD6toD
7.√Example:Observetheresultsofthefollowing.moval-2movcl-5addclal-211111110+-511111011------------711111001OF=0SF=1negativeCF=1AccordingtotheCPUtheresultis-7whichiscorrect.ThereisacarryfromD6toD7butnocarryoutofD7CF=0√ThereisacarryfromD7outCF=1butnocarryfromD6toD
7.√Example:Observetheresultsofthefollowing.movdh+7movbh+18addbhdh+ 700000111++1800010010------------+2500011001OF=0SF=0positiveCF=0AccordingtotheCPUtheresultis+25whichiscorrect.ThereisacarryfromD6toD7butnocarryoutofD7CF=0×ThereisacarryfromD7outCF=1butnocarryfromD6toD
7.×
4.
6.
2.2Whentheoverflowflagissetin16-bitoperationsIna16-bitsignednumberoperationOFissetto1ifeitheroftwocase:3ThereisacarryfromD14toD15butnocarryoutofD15CF=04ThereisacarryfromD15outCF=1butnocarryfromD14toD
15.Example:Observetheresultsofthefollowing.movax6e2fh;28207movcx13d4h;5076addaxcx;=33283isexpectedanswer6e2f011011100010111113d40001001111010100-----------------------82031000001000000011OF=1SF=1CF=0AccordingtotheCPUtheresultis-32253incorrect!TheerrorisindicatedbythefactthatOF=
1.ThereisacarryfromD14toD15butnocarryoutofD15CF=0√ThereisacarryfromD15outCF=1butnocarryfromD14toD
15.×Example:Observetheresultsofthefollowing.movdx8000h;-32768movbxfffeh;-2adddxbx;=-32770isexpectedanswer80001000000000000000fffe1111111111111110-----------------------7ffe0111111111111110OF=1SF=0CF=1AccordingtotheCPUtheresultis-32253incorrect!TheerrorisindicatedbythefactthatOF=
1.ThereisacarryfromD14toD15butnocarryoutofD15CF=0×ThereisacarryfromD15outCF=1butnocarryfromD14toD
15.√Note:TheMOVinstructiondoesnotchangetheflags.
4.
6.
2.3AvoidingerroneousresultsinsignednumberoperationsToavoidtheproblemsassociatedwithsignednumberoperationsonecansign-extendtheoperand.SignextensioncopiesthesignbitD7ofthelowerbyteofaregisterintotheupperbitsoftheregisterorcopiesthesignbitofa16-bitregisterintoanotherregister.CBWconvertsignedbytetosignedwordandCWDconvertsignedwordtosigneddoublewordareusedtoperformsignextension.CBWwillcopyD7toallbitsofAH.D7D0D15AHD8AL图4‑15IllustrationofCBWmoval+96;al=01100000cbw;nowah=00000000ormoval-2;al=11111110cbw;nowah=11111111CWDsignextendsAX.ItcopiesD15ofAXtoallbitsoftheDXregister.D15D0D15D0DXAX图4‑16IllustrationofCWDLookatthefollowingexample:movax+260;ax=0000000100000100cwd;nowdx=0000000000000000Anotherexample:movax-32766ax=1000000000000010cwd;nowdx=1111111111111111Example:Rewritetheprogramofsumming96and70toprovideforhandlingtheoverflowproblem.data1db+96data2db+70resultdw...subahah;ah=0movaldata1movbldata2addalbljnoover;ifOF=0thengotoovermovaldata2;otherwisegetoperand2toalcbw;signextenditmovbxax;saveitinbxmovaldata1;getbackoperand1tocbw;signextenditaddaxbxover:movresultax;saveit
4.
6.3IDIVSignednumberdivisionIDIVmeans“integerdivision”itisusedforsignednumberdivision.Inactualityallarithmeticinstructionsofthe8088/86areforintegernumbersregardlessofwhethertheoperandsaresignedorunsigned.Divisionofsignednumbersisverysimilartodivisionofunsignednumbers.表4‑5SignedDivisionSummaryDivisionNumerator分子Denominator分母QuotientRemainderbyte÷byteAL=byteCBWregisterormemoryALAHword÷wordAX=wordCBDregisterormemoryAXDXword÷byteAX=wordregisterormemoryAL1AHdoubleword÷wordDXAX=doublewordregisterormemoryAX2DXNotes:
1.Divideerrorinterruptif-127AL+
1272.Divideerrorinterruptif-32767AX+32767;------------------------------------------.modelstmall.stack64;------------------------------------------.datasign_datdb+13-10+19+14-18-9+12-9+16org0010haveragedwremainderdw------------------------------------------.codemainprocfarmovax@datamovdsaxmovcx9;loadcountersubbxbx;clearbxusedasaccumulatormovsioffsetsign_dat;setuppointerback:moval[si];movebyteintoalcbw;signextendintoaxaddbxax;addtobxincsi;incrementpointerloopback;loopifnotfinishedmoval9;movecounttoalcbw;signextendintoaxmovcxax;savedenominatorincxmovaxbx;movesumtoaxcwd;signextendthesumidivcx;findtheaveragemovaverageax;storetheaveragequotientmovremainderdx;storetheremaindermovah4chint21h;gobacktodosmainendpendmain
4.
6.4IMULSignednumbermultiplicationSignednumbersmultiplicationisverysimilarinitsoperationtotheunsignednumbersmultiplication.表4‑6SignedMultiplicationSummaryMultiplicationOperand1Operand2Resultbyte×byteALregisterormemoryAXword×wordAXregisterormemoryDXAXword×byteAL=byteCBWregisterormemoryDXAX
4.
6.5SignednumbercompareCMPdestsourceAlthoughtheCMPinstructionisthesameforthebothsignedandunsignednumberstheJconditioninstructionusedtomakeadecisionforthesignednumbersisdifferentfromtheunsignednumbers.WhileinunsignednumbercomparisonsCFandZFarecheckedforconditionsoflargerequalandsmallerinsignednumbercomparisonOFZFandSFarechecked:表4‑7RelevantflagsofCMPCFZFSFOFdestsource000SFdest=source010SFdestsource101inverseofSFtitleprog6-2;findthelowesttemperaturepage60132;--------------.modelsmall.stack64;--------------.datasign_datdb+13-10+19+14-18-9+12-9+16org0010hlowestdb;--------------.codemainprocfarmovax@datamovdsaxmovcx8;loadcounternumberitems-1movsioffsetsign_dat;setuppointermoval[si];alholdslowestvaluefoundsofarback:incsi;incrementpointercmpal[si];comparenextbytetolowestjlesearch;ifalislowestcontinuesearchmoval[si];otherwisesavenewlowestsearch:loopback;loopifnotfinishedmovlowestal;savelowesttemperaturemovah4chint21h;gobacktodosmainendpendmain
4.7STRINGANDTABLEOPERATIONS
4.
7.1UsingofSIandDIDSandESinstringinstructionsForstringoperationstoworkdesignersoftheCPUmustsetasidecertainregistersforspecificfunctions.Theseregistersmustpermanentlyprovidethesourceanddestinationoperands.In8088/86microprocessorstheSIandDIregistersalwayspointtothesourceanddestinationoperandsrespectively.Nowthequestionis:Whichsegmentsaretheycombinedwithtogeneratethe20-bitphysicaladdressTogeneratethephysicaladdressthe8088/86alwaysusesSIastheoffsetoftheDSregisterandDIastheoffsetofES.Thisisthedefaultmode.ItmustbenotedthattheESregistermustbeinitializedforthestringoperationtowork.
4.
7.2ByteandwordoperandsinstringinstructionsThefollowingtableprovidesasummaryofthestinginstructions.表4‑8StringoperandsummaryInstructionMnemonicDestinationSourcePrefixmovestringbyteMOVSBES:DIDS:SIREPmovestringwordMOVSWES:DIDS:SIREPstorestringbyteSTOSBES:DIALREPstorestringwordSTOSWES:DIAXREPloadstringbyteLODSBALDS:SInoneloadstringwordLODSWAXDS:SInonecomparestringbyteCMPSBES:DIDS:SIREPE/REPNEcomparestringwordCMPSWES:DIDS:SIREPE/REPNEscanstringbyteSCASBES:DIALREPE/REPNEscanstringwordSCASWES:DIAXREPE/REPNE
4.
7.3DFthedirectionflagToprocessoperandslocatedinconsecutivememorylocationsrequiresthatthepointerbeincrementedanddecremented.Instringoperationsthisisachievedbythedirectionflag.
4.
7.
3.1CLDCLDcleardirectionflagwillresetputtozeroDFindicatethatthestringinstructionshouldincrementthepointersautomatically.
4.
7.
3.2STDSTDsetdirectionflagperformstheoppositefunctionoftheCLDinstruction.ItsetsDFto1indicatethatthestringinstructionthatthepointersSIandDIshouldbedecrementedthepointersautomatically.
4.
7.4REFprefixTheREPrepeatprefixallowsastringinstructiontoperformtheoperationrepeatedly.HowmanytimesisitrepeatedREPassumesthatCXholdsthenumberoftimesthattheinstructionshouldberepeated.IntheotherwordtheREPprefixtellstheCPUtoperformthestringoperationandthendecrementstheCXregisterautomatically.ThisprocessisrepeateduntilCXbecomeszero.Example:Usingstringinstructionswriteaprogramthattransfersablockof20bytesofdata.Solution:;-----------------------------data1dbABCDEFGHIJKLMNOPQRSTorg30hdata2db20dup;-----------------------------movax@datamovdsaxmovesaxcld;forautoincrementmovsioffsetdata1movdioffsetdata2movcx20REPMOVSB;repeatuntilcxbecomeszeroAnalternativesolutionforthisexamplewouldchangeonlytwolinesofcode:movcx10REPMOVSW数据段1数据段2DSSIESDI传送MOVS
4.
7.5STOSandLODSinstructionsTheSTOSBinstructionstoresthebyteintheALregisterintothememorylocationspointedatbyES:DIandincrementsifDF=0DIonce.IfDF=1thenDIisdecremented.TheSTOSWinstructionstoresthecontentsofAXinmemorylocationsES:DIandES:DI+1ALintoES:DIandAHintoES:DS+1thenincrementsDItwiceifDF=0ifDF=1DIisdecrementedtwice.ESDISTOSAL/AXTheLODSBinstructionloadsthecontentsofmemorylocationspointedatbyDS:SIintoALandincrementsordecrementsSIonceifDF=0orDF=
1.LODSWloadsthecontentsofmemorylocationspointedatbyDS:SIintoALandDS:SI+1intoAH.TheSIisincrementedtwiceifDF=0otherwiseitisdecrementedtwice.LODSisneverusedwithaREPprefix.DSSILODSAL/AXExample:TestingmemoryusingSTOSBandLODSB.UsesSTOSBtostorebyteAAH10101010into100memorylocations.UsesLODSBtotestthecontentsofeachlocationtoseeifAAHwasthere.Ifthetestfailsthesystemshoulddisplaythemessage“badmemory”.AssumingthatESandDShavebeenassignedintheASSUMEdirective.Solution:stsegsegmentstackdb100hdupsstsegendsdtsegsegmentmessagedbBadmemory$org10hmem_areadb100dupdtsegendscdsegsegmentstartprocfarassumecs:cdsegss:stsegds:dtseges:dtsegmovaxdtsegmovdsaxmovesax;putpatternAAAAHinto50wordlocationsmovdioffsetmem_areacld;clearDFforincrementmovcx50movax0aaaahREPSTOSW;repeatuntilcx=0;bringinthepatternandtestitonebyonemovsioffsetmem_areamovcx100again:LODSBxoralah;ispatternthesamejnzover;ifnotthesamethenexitloopagainjmpexitover:movah09;displaymovdxoffsetmessage;themessageint21h;routineexit:movah4chint21hstartendpcdsegendsendstart
4.
7.6TheREPZandREPNZprefixesTheseprefixescanbeusedwiththeCMPSandSCASinstructionsfortestingpurpose.REPZrepeatzerowhichisthesameasREPErepeatequalwillrepeatthestringoperationaslongasthesourceanddestinationoperandsareequalZF=1oruntilCXbecomeszero.REPNZrepeatnotzerowhichisthesameasREPNErepeatnotequalwillrepeatthestringoperationaslongasthesourceanddestinationoperandsarenotequalZF=0oruntilCXbecomeszero.
4.
7.7CMPScomparestringCMPSallowsthecomparisonoftwoarraysofdatapointedatbytheSIandDIregisters.数据段1数据段2DSSI比较ESDICMPSOnecantestfortheequalityorinequalityofdatabyuseoftheREPEorREPNEprefixesrespectively.ThecomparisoncanbeperformedabyteatatimeorawordatatimebyusingCMPSBorCMPSW.Example:dat_dictdbEuropedat_typeddbEuoropemsg1dbThespellingiscorrect.$msg2dbWrongspelling$;fromcodesegmentcldmovsioffsetdat_dictmovdioffsetdat_typedmovcx06REPECMPSBjeovermovdxoffsetmsg2jmpdisplayover:movdxoffsetmsg1display:movah09int21hCMPScanbeusedtotestinequalityoftwoarraysusingREPNECMPSB.Forexamplewhencomparingthefollowingnumbers:320113660201481431224771312592thecomparisonwillcontinuetothelastdigitsincenotwodigitsinthesamepositionarethesame.
4.
7.8SCASscanstringTheSCASBstringinstructioncompareseachbyteofthearraypointedatbyES:DIwiththecontentsoftheALregisteranddependingonwhichprefixofREPEorREPNEisused.ESDISCASAL/AXExample:Replacingthescannedcharacter.Writeaprogramthatscanthename‘Mr.Gones’andreplacedthe‘G’withtheletter‘J’thendisplaythecorrectedname.Solution:titleex6-
16.asm.modelsmall.stack64;------------------------------------------.datadata1dbMr.Gones0AH0DH$lenequ$-data1;------------------------------------------.codereplprocfarmovax@datamovdsaxmovesax;-------------------------------movdxoffsetdata1;setprocedureparametercalldisp;calladisplayprocedure;-------------------------------cld;DF=0forincrementmovdioffsetdata1;ES:DI=arrayoffsetmovcxlen;lengthofarraymovalG;scanningfortheletterGrepnescasb;repeatthescanningifnotequaljneover;oruntilcxiszero.JumpifZF=0decdi;decrementtopointatGmovbyteptr[di]J;replaceGwithJ;-------------------------------over:movdxoffsetdata1calldisp;-------------------------------movah4chint21hreplendp;------------------------------------------dispprocmovah09int21hretdispendp;------------------------------------------endrepl
4.
7.9XLATinstructionandlook-uptablesThereisoftenaneedincomputerapplicationsforatablethatholdssomeimportantinformation.Look-up:Aprocedureinwhichatableofvaluesstoredinacomputerissearcheduntilaspecifiedvalueisfound.Toaccesstheelementsofthetable8088/86microprocessorsprovidetheXLATtranslateinstruction.TounderstandtheXLATinstructiononemustfirstunderstandtables.Assumethatoneneedsatableforthevaluesofx2wherexisbetween0and
9.Thetableisgeneratedandstoredinmemory:squr_tabledb0149162536496481Nowonecanaccessthesquareofanynumberfrom0to9bytheuseofXLAT.TodothattheBXregistermusthavetheoffsetaddressofthetableandthenumberwhosesquareissoughtmustbeintheALregister.ThenaftertheexecutionofXLATtheALregisterwillhavethesquareofthenumber.movbxoffsetsqur_table;loadtheoffsetaddressmoval5;al=5willretrieve6thelementXLAT;pulloutoftabletheelement;andputinALAfterexecutiontheprogramtheALregisterwillhave25thesquareof
5.InactuallyXLATisoneinstructionwhichisequivalenttothefollowingcode:subahah;ah=0movsiax;si=00XX0005moval[bx+si]。