




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1从程序到可执行代码
汇编(2)
5次课2ProcedureCall3BasicConceptTerminologyCallerCalleef()g()call-1h()call-2call-1Caller:fCallee:gcall-2Caller:gCallee:h4Procedure/FunctionImplementationInvokecalleeReturntocallerPassingdataRegistersLocalvariable5Procedure/FunctionImplementationInvokecallee:call(newinstructions)ReturntocallerPassingdataRegistersLocalvariable6InvokeCalleeInstructioncalllabel(direct)call*operand
(indirect)Behaviordescription(byhardware)SavereturnaddressinthestackJumptotheentry
ofcallee call=push+jmppushretaddrjmp
callee7Procedure/FunctionImplementation
Invokecallee:call(newinstructions)Returntocaller:ret(newinstructions)PassingdataRegistersLocalvariable8ReturntoCallerInstructionretBehaviordescription(byhardware)PopreturnaddressfromstackJumptoreturnaddress
incaller
ret=pop+jmppopretaddrjmp
retaddr9Procedure/FunctionImplementation
Invokecallee:call(newinstructions)
Returntocaller:ret(newinstructions)Passingdata:stack,registerRegistersLocalvariable10StackFrameStructureTheportionofstackallocatedforaprocedureAstackframeisdelimitedbyTheframepointer%ebpThestackpointer%espThestackpointercanmovewhentheprocedureisexecuting(dynamic)TheframepointerisstaticFrame%ebp%esp11StackFrameStructurecall:savereturnaddressinthestackret:popreturnaddressfromstackTheendofcaller’sstackframeCallee
Frame%ebp%espretaddrCaller
Frame12FrameChainPointers(%ebp/%esp)onlydelimittopmost
frameFramesarechained%ebp%esp1.callcallee13FrameChainPointers(%ebp/%esp)onlydelimittopmost
frameFramesarechainedretaddr%ebp%esp
1.callcalleecallee:2.push%ebp3.mov%esp,%ebpretaddr%ebp14FrameChainPointers(%ebp/%esp)onlydelimittopmost
frameFramesarechained%ebp%esp
1.callcalleecallee:
2.push%ebp3.mov%esp,%ebpretaddrold%ebp15FrameChainPointers(%ebp/%esp)onlydelimittopmost
frameFramesarechained%ebp%esp
1.callcalleecallee:
2.push%ebp3.mov%esp,%ebpretaddrold%ebp16FrameChainPointers(%ebp/%esp)onlydelimittopmost
frameFramesarechained%ebp%esp
1.callcalleecallee:2.push%ebp3.mov%esp,%ebp ...n-2.mov%ebp,%espn-1.pop%ebpn.retretaddrold%ebp17FrameChainPointers(%ebp/%esp)onlydelimittopmost
frameFramesarechained%ebp%esp
1.callcalleecallee:
2.push%ebp3.mov%esp,%ebp ...n-2.mov%ebp,%espn-1.pop%ebpn.retretaddrold%ebp18FrameChainPointers(%ebp/%esp)onlydelimittopmost
frameFramesarechained%ebp%esp
1.callcalleecallee:
2.push%ebp3.mov%esp,%ebp ...n-2.mov%ebp,%espn-1.pop%ebpn.retretaddrold%ebp19FrameChainPointers(%ebp/%esp)onlydelimittopmost
frameFramesarechained%ebp%esp
1.callcalleecallee:
2.push%ebp3.mov%esp,%ebp ...n-2.mov%ebp,%espn-1.pop%ebp
n.ret20FrameChainPointers(%ebp/%esp)onlydelimittopmost
frameFramesarechainedold%ebpold%ebpold%ebp%ebp%esp21MemoryLayoutUserstack
argumentN22PassingData:ArgumentspushargumentN%ebp%espCaller
Frameargument1......argumentN23PassingData:ArgumentspushargumentN...pushargument1%ebp%espCaller
Frameargument1......argumentN24PassingData:ArgumentspushargumentN...pushargument1callcallee%ebp%espretaddrCaller
FramepushargumentN...pushargument1callcalleepush%ebp%ebpargument1......argumentN25PassingData:Arguments%ebp%espretaddrCaller
FrameCallee
Frameold%ebpargument1......argumentN26PassingData:ArgumentspushargumentN...pushargument1callcalleepush%ebpmov%esp,%ebp...%ebp%esp/retaddrCaller
FrameCallee
Frameargument1......argumentN27PassingData:ArgumentsPushedbyCallerSavedincallerframeJustuponofreturnaddressFromNthto1st(fromrighttoleft)UsedbyCalleeRelativeto%ebpOffset:4+4*i+%ebpCallee
Frame%ebp%espretaddrCaller
Frame28PassingData:ReturnValueSpecificregistertokeepthereturnvalue%eaxisusedtopasstheresultofcalleetocaller29Procedure/FunctionImplementation
Invokecallee:call(newinstructions)
Returntocaller:ret(newinstructions)
Passingdata:stack,registerRegisters:callingconventionLocalvariable30CallingConventionRegistersactasasingleresourcesharedbyalloftheproceduresOnly1procedurecanbeactivePartitionregistersbetweencallerandcalleeSaller-saveregisterCallee-saveregisterOnlyconsidertheregistersusedbytheprocedure31CallingConventionCaller-saveregisters%eax,%edx,%ecxSavedbycallerCalleecanusetheseregistersfreelyThecontentsintheseregistersmaybechangedafterreturnCallermustrestorethemifittriestousethemaftercallingSaved%eaxargument1......argumentN32Caller-saveRegisterspush%eaxpushargumentN...pushargument1callcallee%ebp%espretaddrCaller
Frame33CallingConventionCallee-saveregisters%ebx,%esi,%ediSavedbycalleeCallercanusetheseregistersfreelyCalleemustsavethembeforeusingCalleemustrestorethembeforereturn34Callee-saveRegisterscallcalleepush%ebpmov%esp,%ebppush%ebx...Old%ebpSaved%ebxCallee
Frame%ebp%espretaddr35Procedure/FunctionImplementation
Invokecallee:call(newinstructions)
Returntocaller:ret(newinstructions)
Passingdata:stack,register
Registers:callingconventionLocalvariable:stack36LocalVariableWhynotstorelocalvariablesinregisters?NoenoughregistersArrayandstructures(e.g.,a[2])Needaddress(e.g.,&a)Old%ebpLocalvariableSavedregs37LocalVariableAllocationBelowsavedregsorold%ebpmove/sub%esp,(e.g.,subl$4,%esp)De-allocationmove/add%esp,(e.g.,addl$4,%esp)UsageRelativeto%esp/%ebp,(e.g.,movl%eax,8(%esp))Callee
Frame%ebp%espretaddr38PutitTogetherCaller
Frame%ebp%espcaller-saveregisters39PutitTogether1.Savecaller-saveregisters
(%eax,%edx,%ecx)Caller
Frame%ebp%esparguments(n~1)caller-saveregisters40PutitTogether1.Savecaller-saveregisters
(%eax,%edx,%ecx)2.Pushactualarguments
fromrighttoleftCaller
Frame%ebp%esparguments(n~1)caller-saveregisters41PutitTogether1.Savecaller-saveregisters
(%eax,%edx,%ecx)2.Pushactualarguments
fromrighttoleft3.CallinstructionSavereturnaddressTransfercontroltocalleeretaddrCaller
Frame%ebp%esparguments(n~1)42PutitTogether4.Savecaller%ebpcaller-saveregisters%ebpretaddrCaller
Frame%ebp%esparguments(n~1)43PutitTogether4.Savecaller%ebp5.Setcallee%ebpcaller-saveregistersold%ebpretaddrCaller
Frame%esp/%ebparguments(n~1)44PutitTogether4.Savecaller%ebp5.Setcallee%ebp6.Savecallee-saveregisters
(%ebx,%edi,%esi)caller-saveregistersold%ebpretaddrCaller
Framecallee-saveregisters%ebp%esparguments(n~1)45PutitTogether4.Savecaller%ebp5.Setcallee%ebp6.Savecallee-saveregisters
(%ebx,%edi,%esi)7.Allocatespaceforlocal
variablecaller-saveregistersold%ebpretaddrCaller
Framecallee-saveregisterslocalvariables%ebp%esp46PutitTogether...n-4.savereturnvaluein%eaxarguments(n~1)caller-saveregistersold%ebpretaddrCaller
Framecallee-saveregisterslocalvariables%ebp%esp47PutitTogether...n-4.savereturnvaluein%eaxn-3.de-allocatelocalvariablearguments(n~1)caller-saveregistersold%ebpretaddrCaller
Framecallee-saveregisterslocalvariables%ebp%esp48PutitTogether...n-4.savereturnvaluein%eaxn-3.de-allocatelocalvariablen-2.Restorecallee-saveregistersarguments(n~1)caller-saveregistersold%ebpretaddrCaller
Framecallee-saveregisterslocalvariables%ebp%esp/49PutitTogether...n-4.savereturnvaluein%eaxn-3.de-allocatelocalvariablen-2.Restorecallee-saveregistersn-1.Restorecaller%ebparguments(n~1)caller-saveregistersold%ebpretaddrCaller
Framecallee-saveregisterslocalvariables%ebp%esp50PutitTogether...n-4.savereturnvaluein%eaxn-3.de-allocatelocalvariablen-2.Restorecallee-saveregistersn-1.Restorecaller%ebpn.RetinstructionpopreturnaddressTransfercontroltocallerarguments(n~1)caller-saveregistersold%ebpretaddrCaller
Framecallee-saveregisterslocalvariables%ebp%esp51Example1intswap_add(int*xp,int*yp)2{3 intx=*xp;4 inty=*yp;56 *xp=y;7 *yp=x;8 returnx+y;9}1052Example11intcaller()12{13 intarg1=534;14 intarg2=1057;15 intsum=swap_add(&arg1,&arg2);16 intdiff=arg1-arg2;1718 returnsum*diff;19}53Finishingcodeinswap_add0Saved%ebp-4arg2(534)-8arg1(1057)-12yp(&arg2)-16xp(&arg1)-20ReturnAddrSaved%ebpSaved%ebxStackframeforcaller12popl%ebxRestore%ebx13movl%ebp,%esp
Restore%esp14popl%ebpRestore%ebp15ret
ReturntocallerCallbyvalue%ebpxp(=&arg1=%ebp+16)%edxyp(=&arg2=%ebp+20)%ecxoriginalvalue%ebx1591%eax%esp54Array55AccessingArrayTA[N];AllocateacontiguousregioninmemoryThesizeoftheregionissizeof(T)
*
NbytesThestartingaddressofanarrayAisdenotedasXAArrayelementscanbeaccessedUsinganintegerindexrangingbetween0andN-1ArrayelementiisstoredataddressXA+sizeof(T)*i56Array012345678910110481216chara[12];xaxa+4xa+8char*b[5];xbxb+4xb+8xb+12xb+1657Array0481216doublec[2];xcxc+8double*d[5];xdxd+4xd+8xd+12xd+1658PointerArithmeticAdditionandsubtractionp+i,p-i(resultisapointer)p-q(resultisanint)Referencing&dereferencing*p,&ESubscriptionA[i],*(A+i)59MemoryreferencinginstructionEisanarrayofint’sAddressofEisstoredinregister%edxIndexiisstoredinregister%ecxThearrayelementE[i]istranslatedintomovl (%edx,%ecx,4),%eax60PointerArithmeticExpressionTypeValueAssemblycodeEint*xEmovl%edx,%eaxE[0]intM[xE]movl(%edx),%eaxE[i]
intM[xE+4i]movl(%edx,%ecx,4),%eax&E[2]
int*xE+8leal8(%edx,)%eaxE+i-1int*xE+4i-4lea-4(%edx,%ecx,4),%eax*(&E[i]+i)
intM[xE+4i+4i]movl(%edx,%ecx,8),%eax&E[i]-E
intimovl%ecx,%eax61NestedArrayintA[4][3];ArrayAisatwo-dimensionalarraywithfourrowsandthreecolumnsItisreferencedasA[0][0]throughA[3][2]RowElementAddressA[0]A[0][0]xAA[0][1]xA+4A[0][2]xA+8A[1]A[1][0]xA+12A[1][1]xA+16A[1][2]xA+20A[2]A[2][0]xA+24A[2][1]xA+28A[2][2]xA+32A[3]A[3][0]xA+36A[3][1]xA+40A[3][2]xA+4462NestedArrayintA[4][3];Arrayofarraytypedefintrow3_t[3];
row3_tA[4];ArrayAcontains4elements,
eachrequiring12bytesto
store3integersThewholesizeofarrayAis48bytesRowmajororderedinmemory63NestedArrayTD[R][C];D[i][j]isatmemoryaddressxD+L*(C*i+j)Lissizeof(T)64AccessA[i,j]ItisinmemoryM[xA+j*4+i*12]%eaxcontainsxA%edxholdsi,%ecxholdsjsall$2,%ecx #j*4leal(%edx,%edx,2),%edx#i*3leal(%ecx,%edx,4),%ecx#j*4+i*12movl(%eax,%ecx),%eax
65Fixed-sizeArrays#defineN16typedefintfix_matrix[N][N];/*Computei,koffixedmatrixproduct*/intfix_prod_ele(fix_matrixA,fix_matrixB,
inti,intk){
intj;
intresult=0;
for(j=0;j<N;j++)
result+=A[i][j]*B[j][k];
returnresult;}66Fixed-sizeArrays/*Computei,koffixedmatrixproduct*/intfix_prod_ele_opt(fix_matrixA,fix_matrixB,
inti,intk){
int*Arow=&A[i][0],*Bptr=&B[0][k];
intj,result=0;
for(j=0;j<16;j++){
result+=Arow[j]*(*Bptr);
Bptr+=N;
}
returnresult;}67Fixed-sizeArraysAptrin%esi,Bptrin%ecxresultin%ebx,jin%edx.L6: #loop:movl(%ecx),%eax #Get*Bptrimull(%esi,%edx,4),%eax #MultiplybyArow[j]addl%eax,%ebx #Addtoresultaddl$1,%edx #j++addl$64,%ecx #Add16*4toBptrcmpl$16,%edx #comparej:16jne.L6 #if!=,gotoloop68Variable-SizeArraysintvar_ele(intn,intA[n][n],inti,intj){
returnA[i][j];}DeclareanarrayintA[exp1][exp2]eitherasalocalvariableorasanargumenttoafunctionThedimensionsofthearrayaredeterminedbyevaluatingtheexpressionsatthetimethedeclarationisencounterd69AssemblyCodenat%ebp+8,Aat%ebp+12iat%ebp+16,jat%ebp+20movl8(%ebp),%eax #Getnsall$2,%eax #Compute4*nmovl%eax,%edx #Copy4*nimull16(%ebp),%edx #Compute4*n*imovl20(%ebp),%eax #Getjsall$2,%eax #Compute4*jaddl12(%ebp),%eax #ComputexA+4∗jmovl(%eax,%edx),%eax#ReadfromxA+4∗(n∗i+j)70HeterogeneousDataStructures&Alignment71OutlineStructUnionAlignmentPointers72StructuresGroupobjectsintoasingleobjectstructrect{ intllx;/*Xcoordinateoflower-leftcorner*/ intlly;/*Ycoordinateoflower-leftcorner*/ intcolor;/*Codingofcolor*/ intwidth;/*Width(inpixels)*/ intheight;/*Height(inpixels)*/};73StructuresMemorylayoutAllthecomponentsarestoredinacontiguousregionofmemoryApointertoastructureistheaddressofitsfirstbyte74Structurestructrec{ inti; intj; inta[3]; int*p;}*r;ija[0]a[1]a[2]pContentsOffset0482075StructureReferencestostructureelementsUsingoffsetsasdisplacementsr->j=r->i(Copyelementr->itoelementr->j)risinregister%edx.1 movl (%edx),%eax Getr->i2 movl %eax,4(%edx) Storeinr->jija[0]a[1]a[2]pContentsOffset0482076Structure&(r->a[i])rin%eax,iin%edx:1leal8(%eax,%edx,4),%ecx Generate&r->a[i]ija[0]a[1]a[2]pContentsOffset0482077Structurer->p=&r->a[r->i+r->j];rinregister%edx:1 movl4(%edx),%eax Getr->j2 addl(%edx),%eax Addr->i3 leal8(%edx,%eax,4),%eax Compute&r->a[r->i+r->j]4 movl%eax,20(%edx) Storeinr->pija[0]a[1]a[2]pContentsOffset0482078UnionsAsingleobjectcanbereferencedbyusingdifferentdatatypesThesyntaxofauniondeclarationisidenticaltothatforstructures,butitssemanticsareverydifferentRatherthanhavingthedifferentfieldsreferencedifferentblocksofmemory,theyallreferencethesameblock79UnionsstructS3{ charc; inti[2]; doublev;};unionU3{ charc; inti[2]; doublev;};TypecivsizeS3041220U30008Theoffsetsofthefields,aswellasthetotalsizeofdatatypesS3andU3,are:80UnionsstructNODE{ intis_leaf; union{ struct{ structNODE*left; structNODE*right; }internal; doubledata; }info;};81Unions1
unsignedfloat2bit(floatf)2
{3
union{4
floatf;5
unsignedu;6
}temp;7
temp.f=f;8
returntemp.u;9
}1
movl 8(%ebp),%eax82AlignmentAlignmentrestrictionsTheaddressforsometypeofobjectmustbeamultipleofsomevaluek
(typically2,4,or8)SimplifythehardwaredesignoftheinterfacebetweentheprocessorandthememorysystemInIA32hardwarewillworkcorrectlyregardlessofthealignmentofdataAligneddatacanimprovememorysystemperformance83AlignmentLinuxalignmentrestriction1-bytedatatypesareabletohaveanyaddress2-bytedatatypesmusthaveanaddressthatismultipleof2Anylargerdatatypesmusthaveanaddressthatismultipleof484SimpleExamplestructxxx{ inti; charc; doubled;};structxxxx[2];0x000x040x080x0C0x100x14&x[0].i&x[0].c&x[0].d&x[1].iComplexExamplestructxxx{shorts;charc0;inti;longl;charc1;chara[2];doubled;charc2;};structxxxx[2];850x000x040x080x0C0x100x140x180x1C&x[0].s&x[0].c0&x[0].i&x[0].l&x[0].c1&x[0].a[0]&x[0].a[1]&x[0].d&x[0].c2&x[1].s86Arraystructccc{charc1;chara[3];charc2;};structcccc[2];0x000x040x080x0C0x100x14&c[0].c1&c[0].a[0]&c[0].c2&c[1].c1&c[1].a[0]&c[1].c287Arraystructccc{charc1;shorta[3];charc2;};structssss[2];0x000x040x080x0C0x100x14&s[0].c1&s[0].c2&s[0].a[0]&s[1].c1&s[1].c2&s[1].a[0]88Arraystructiii{charc1;inta[3];charc2;};structiiii[2];0x000x040x080x0C0x100x14&s[0].c1&s[0].c2&x[0].i&s[1].c189PointersEverypointerhasatypeIftheobjecthastypeTApointertothisobjecthastypeT*Specialvoid*typeRepresentsagenericpointermallocreturnsagenericpointerEverypointerhasavalue90PointersPointersarecreatedwiththe&operatorAppliedtolvalueexpressionLvalueexpressioncanappearontheleftsideofassignmentPointersaredereferencedwiththeoperator*TheresultisavaluehavingthetypeassociatedwiththepointerArraysandpointersareclosedrelatedThenameofarraycanbeviewedasapointerconstantip[0]isequivalentto*ip91PointerArithmeticAdditionandsubtractionp+i,p-i(resultisapointer)p-q(resultisaint)Referencing&dereferencing*p,&ESubscriptionA[i],*(A+i)92Pointerscanpointtofunctionsvoid(*f)(int*)fisapointertofunctionThefunctiontakenint*asargumentThereturntypeofthefunctionisvoidAssignmentmakesfpointtofuncf=funcNoticetheprecedenceoftheoperatorsvoid*f(int*)declaresfisafunction(void*)f(int*)93PointerDeclarationchar **argv;int (*daytab)[13]int (*comp)()char (*(*x())[])()Functionreturningpointertoarray[]ofpointertofunctionreturningcharchar (*(*x[3])())[5]Array[3]ofpointertofunctionreturningpointertoarray[5]ofchar94CoperatorsOperators Associativity()[]->.++-- lefttoright!~++--+-*&(type)sizeof righttoleft*/% lefttoright+- lefttoright<<>> lefttoright<<=>>= lefttoright==!= lefttoright& lefttoright^ lefttoright| lefttoright&& lefttoright|| lefttoright?: righttoleft=+=-=*=/=%=&=^=!=<<=>>= righttoleft, lefttorightNote:Unary+,-,and*havehigherprecedencethanbinaryforms95ParameterPassingCallbyvaluef(xp)Callbyreferencef(&xp)96BufferOverflow97Out-of-BoundsMemoryReferences1/*Implementationoflibraryfunctiongets()*/2char*gets(char*s)3{4 intc;5 char*dest=s;6 intgot_char=0;/Hasatleastonecharacterbeenread?*/7 while((c=getchar())!=’\n’&&c!=EOF){8 *dest++=c;/*Noboundschecking*/9 gotchar=1;10 }11 *dest++=’\0’; /*TerminateString*/12 if(c==EOF&&!gotchar)13 returnNULL;/*Endoffileorerror*/14 returns;15}98Out-of-BoundsMemoryReferences14/*Readinputlineandwriteitback*/15voidecho()16{17 charbuf[8]; /*Waytoosmall!*/18 gets(buf);19 puts(buf);20}99Out-of-BoundsMemoryReferencesReturnaddressSaved%ebpSaved%ebx[7][6][5][4][3][2][1][0]%ebpbufStackframeforcallerStackframeforecho100Out-of-BoundsMemoryReferencesReturnaddressSaved%ebp[11][10][9][8][7][6][5][4][3][2][1][0]%ebpbufStackframeforcallerStackframeforecho101Out-of-BoundsMemoryReferencesReturnaddress[15]1[4][13][12][11][10][9][8][7][6][5][4][3][2][1][0]%ebpbufStackframeforcallerStackframeforecho102Out-of-BoundsMemoryReferences[19][18][17][16][15]1[4][13][12][11][10][9][8][7][6][5][4][3][2][1][0]%ebpbufStackframeforcallerStackframeforecho103MaliciousUseofBufferOverflowvoidbar(){charbuf[64];gets(buf);...}voidfoo(){bar();...}returnaddressAStackaftercalltogets()BfoostackframebarstackframeBexploitcodepaddatawrittenbygets()104TheFamousInternetWormofNovember1988TogainaccesstomanyofthecomputersacrosstheInternet4differentwaysOnewasabufferoverflowattackonthefingerdHundredsofmachineswereeffectivelyparalyzedTheauthorofthewormwascaughtandprosecuted.Hewassentencedto3yearsprobation400hoursofcommunityserviceanda$10,500fine105MorrisWormRobertTappanMorrisbornNovember8,1965aprofessoratMITHeisthesonofRobertMorristheformerchiefscientistattheNationalComputerSecurityCenteradivisionoftheNationalSecurityAgency(NSA)106ThwartingBufferOverflowAttacksStackRandomizationStackCorruptionDetectionLimitingExecutableCodeRegions107Machine-LevelRepresentation
ofPrograms(x86-64)108SizeofDataTypeDataTypesinCLanguageDataTypeIA32(Linux)x86-64(Linux)char11short22int44longint48longlong88float44double88longdouble1216pointer(e.g.char*)48IntegerRegisterExtendexistregistersto64bits%rbp%rsp%rdi%rsi%rdx%rcx%rbx%rax%eax%edx%ecx%ebx%esi%edi%esp%ebp%al%ah%dl%dh%cl%ch%bl%bhIntegerRegisterAdd8new64bitsregisters%rbp%rsp%rdi%rsi%rdx%rcx%rbx%rax%eax%ebx%ecx%edx%esi%edi%esp%ebp%al%ah%dl%dh%cl%ch%bl%bh%r15%r14%r13%r12%r11%r10%r9%r8%r8d%r9d%r10d%r11d%r12d%r13d%r14d%r15d111InstructionsLongwordl(4Bytes)↔Quadwordq(8Bytes)NewInstructionsmovl→movqaddl→addqsall→salqetc.32-bitinstructionsgenerate32-bitresultsSethigherorderbitsofdestinationregisterto0Example:addlIA32/LinuxStackFrameCallerStackFrameArgumentsforthiscallReturnAddress(pushedby“call”)CalleeStackFrameOld%ebp(savedby“push%ebp”)SavedregistersLocalvariablesArgumentsfornextcall112Procedures-StackRetAddrArgumentsOld%ebpSavedregistersLocalvariablesArguments%ebp%espframepointerstackpointerIA32/LinuxRegisterUsage%eax,%edx,%ecxCallersavespriorthecall
ifvaluesareusedbylater%eaxReturnintegervalue%ebx,%esi,%ediCalleesavesifwantto
usedthem%esp,%ebpspecial113Procedures-Register%eax%edx%ecx%ebx%esi%edi%esp%ebpCaller-SaveCallee-SaveSpecial%rbp%rsp%rdi%rsi%rdx%rcx%rbx%rax%r15%r14%r13%r12%r11%r10%r9%r8X86-64/LinuxRegisterUsageCaller-Save%rax%rcx%rdx
%rsi%rdi%r8%r9Callee-Save%rbx%rbp%r10%r12%r13%r14%r15Special%rsp,%r11114Procedures-Register%rbp%rsp%rdi%rsi%rdx%rcx%rbx%rax%r15%r14%r13%r12%r11%r10%r9%r8X86-64/LinuxRegisterUsageArgumentspassedviaregs%rcx%rdx%rsi%rdi
%r8%r9Ifmorethan6integer
parameters,thenpass
restonstackReturnvalueby%raxNoframepointerSpecial%rspstackpointer%r11usedforlinking115Procedures-Register%rbp%rsp%rdi%rsi%rdx%rcx%rbx%rax%r15%r14%r13%r12%r11%r10%r9%r8%rdiarg#1%rsiarg#2%rdxarg#3%rcxarg#4%r9arg#6%r8arg#5%raxret%rspstack%r11linkx86-64/LinuxStackFrameCallerStackFrameArgumentspassedviaregistersReturnAddress(pushedby“call”)CalleeStackFrameSavedregistersLocalvariables116Procedures-StackRetAddrSavedregistersLocalvariables%rspstackpointer117X86-64SwapOperandspassedinregistersFirst(xp)in%rdi,second(yp)in%rsiNostackoperationsrequired(exceptret)AvoidstackCanholdalllocalinformationinregistersvoidswap(long*xp,long*yp){longt0=*xp;longt1=*yp;*xp=t1;*yp=t0;}swap:movq(%rdi),%rdxmovq(%rsi),%raxmovq%rax,(%rdi)movq%rdx,(%rsi)ret118AlignmentBytesIA32x86-64TypeAlignmentTypeAlignment1charNocharNo2short02short024int,float,pointer002int,
float0028double0002(Win)002(Lin)double,pointer000212/16longdouble002longdouble00002ExampleIA32LinuxK=4;doubletreatedlikea4-bytedatatypeX86-64orIA32Windows:K=8;duetodoubleelementstructs1{charc;inti[2];doubled;}*p;C3bytesi[0]i[1]4bytesdp+0p+4p+8p+16p+24C3bytesi[0]i[1]dp+0p+4p+8p+12p+20119120从程序到可执行代码
指令编码和汇编器
1次课Y86ProcessorStateProgramRegistersSame8aswithIA32.Each32bitsConditionCodesSingle-bitflagssetbyarithmeticorlogicalinstructionsOF:OverflowZF:ZeroSF:NegativeProgramCounterIndicatesaddressofinstructionMemoryByte-addressablestoragearrayWordsstoredinlittle-endianbyteorder%eax%ecx%edx%ebx%esi%edi%esp%ebpProgramregistersConditioncodesPCMemoryOFZFSFY86InstructionsFormat1--6bytesofinformationreadfrommemoryCandetermineinstructionlengthfromfirstbyteNotasmanyinstructiontypes,andsimplerencodingthanwithIA32Eachaccessesandmodifiessomepart(s)oftheprogramstateY86InstructionsFormat(P259)1--6bytesofinformationreadfrommemoryCandetermineinstructionlengthfromfirstbyteNotasmanyinstructiontypes,andsimplerencodingthanwithIA32Eachaccessesandmodifiessomepart(s)oftheprogramstateErrata:JXXandcallare5byteslong.Format(P259)1--6bytesofinformationreadfrommemoryCandetermineinstructionlengthfromfirstbyteNotasmanyinstructiontypes,andsimplerencodingthanwithIA32Eachaccessesandmodifiessomepart(s)oftheprogramstateErrata:JXXandcallare5byteslong.EncodingRegistersEachregisterhas4-bitIDSameencodingasinIA32,butIA32usingonly3-bitIDRegisterIDFindicates“noregister”Willusethisinourhardwaredesigninmultipleplaces%eax%ecx%edx%ebx%esi%edi%esp%ebp012367451InstructionExampleAdditionInstructione.g.,addl%eax,%esi
Encoding:
6006Two-byteencodingFirstindicatesinstructiontypeSecondgivessourceanddestinationregistersEncodedRepresentationGe
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 视频监控技术支持与服务合同模板
- 北京房产交易合同书
- 专升本文化课课件
- 普法宣讲【模板四】新员工入职培训
- 山东力明科技职业学院《健身运动的理论与方法》2023-2024学年第二学期期末试卷
- 盐城工业职业技术学院《中国文学史(三)》2023-2024学年第二学期期末试卷
- 凯里学院《文化与翻译(1)》2023-2024学年第一学期期末试卷
- 江苏省盐城市重点小学2024-2025学年五年级数学第二学期期末考试模拟试题含答案
- 朔州陶瓷职业技术学院《Web页面设计核心Ajax》2023-2024学年第二学期期末试卷
- 南京市建邺区重点名校2025届初三第五次模拟化学试题试卷含解析
- 静脉血栓栓塞症预防性抗凝治疗知情同意书
- 古诗词诵读《书愤》公开课一等奖创新教学设计统编版高中语文选择性必修下册
- 食堂从业人员绩效管理考核专项方案
- 幼儿园游戏活动评价
- (正式版)SHT 3075-2024 石油化工钢制压力容器材料选用规范
- 机器人发展史课件完整版
- 《城市市政管网运行安全风险评估规程》
- 2024年中国诗词大会知识竞赛模拟题库及答案(120题)
- 新车入户代办委托书
- 可乐罐罐身主要成分的探究
- 麻醉复苏室护理进修汇报
评论
0/150
提交评论