6 µ÷ÓÃջʵÀý·ÖÎö
±¾½Úͨ¹ý´úÂëʵÀý·ÖÎöº¯Êýµ÷Óùý³ÌÖÐÕ»Ö¡µÄ²¼¾Ö¡¢ÐγɺÍÏûÍö¡£
6.1 Õ»Ö¡µÄ²¼¾Ö
ʾÀý´úÂëÈçÏ£º
//StackReg.c
#include
//»ñÈ¡º¯ÊýÔËÐÐʱ¼Ä´æÆ÷%ebpºÍ%espµÄÖµ
#define FETCH_SREG(_ebp, _esp) do{\
asm volatile( \
"movl %%ebp, %0 \n" \
"movl %%esp, %1 \n" \
: "=r" (_ebp), "=r" (_esp) \
); \
}while(0)
//Ò²¿ÉʹÓÃgccÀ©Õ¹register void *pvEbp __asm__ ("%ebp"); register void *pvEsp __asm__ ("%esp");»ñÈ¡£¬
// pvEbpºÍpvEspÖ¸Õë±äÁ¿µÄÖµ¾ÍÊÇFETCH_SREG(_ebp, _esp)ÖÐ_ebpºÍ_espµÄÖµ
#define PRINT_ADDR(x) printf("[%s]: &"#x" = %p\n", __FUNCTION__, &x)
#define PRINT_SREG(_ebp, _esp) do{\
printf("[%s]: EBP = 0x%08x\n", __FUNCTION__, _ebp); \
printf("[%s]: ESP = 0x%08x\n", __FUNCTION__, _esp); \
printf("[%s]: (EBP) = 0x%08x\n", __FUNCTION__, *(int *)_ebp); \
printf("[%s]: (EIP) = 0x%08x\n", __FUNCTION__, *((int *)_ebp + 1)); \
printf("[%s]: &"#_esp" = %p\n", __FUNCTION__, &_esp); \
printf("[%s]: &"#_ebp" = %p\n", __FUNCTION__, &_ebp); \
}while(0)
void tail(int paraTail){
int locTail = 0;
int ebpReg, espReg;
FETCH_SREG(ebpReg, espReg);
PRINT_SREG(ebpReg, espReg);
PRINT_ADDR(paraTail);
PRINT_ADDR(locTail);
}
int middle(int paraMid1, int paraMid2, int paraMid3){
int ebpReg, espReg;
tail(paraMid1);
FETCH_SREG(ebpReg, espReg);
PRINT_SREG(ebpReg, espReg);
PRINT_ADDR(paraMid1);
PRINT_ADDR(paraMid2);
PRINT_ADDR(paraMid3);
return 1;
}
int main(void){
int ebpReg, espReg;
int locMain = middle(1, 2, 3);
FETCH_SREG(ebpReg, espReg);
PRINT_SREG(ebpReg, espReg);
PRINT_ADDR(locMain);
return 0;
}
StackReg
|
¸Ã³ÌÐòÿ¸öº¯Êý¶¼Ç¶Èë»ã±à´úÂ룬ÒÔ»ñÈ¡¸÷º¯ÊýÔËÐÐʱ¿ÌEBPºÍESP¼Ä´æÆ÷µÄÖµ¡£Ã¿¸öº¯Êý¶¼´òÓ¡³öEBP¼Ä´æÆ÷ËùÖ¸ÏòÄÚ´æµØÖ·´¦µÄÖµ£¬ÒÔ¼°Î»ÓÚÆäºóµÄº¯Êý·µ»ØµØÖ·¡£Í¼7¸ø³ö³ÌÐòµÄ±àÒëºÍÔËÐнá¹û¡£

ͼ7 StackRegÔËÐнá¹û
Ϊ±ãÓÚÀí½âÊä³ö½á¹ûÖÐÊý¾Ý¼äµÄ¹ØÏµ£¬½«Æäת»¯ÎªÍ¼8Ëùʾ¡£Í¼×ó»¹Ê¾³öÕ»µÄÔö³¤·½ÏòºÍÕ»µÄÄÚ´æµØÖ·¡£ºÚÉ«¼ýÍ·ºÍ¼Ä´æÆ÷Ãû±íʾµ±Ç°Õ»Ö¡£¬·ñÔòÓûÒÉ«±íʾ¡£Í¼Öбíʾtailº¯ÊýÄÚËù¿´µ½µÄÕ»²¼¾Ö£¬ÆäÖÐÍêÕûʾ³ötailºÍmiddleº¯ÊýµÄÕ»Ö¡½á¹¹£¬ÒÔ¼°mainº¯ÊýµÄ²¿·Ö¡£×¢Ò⣬ÐβÎ1¡¢2¡¢3(³£Á¿)²»ÔÚÕ»ÄÚ¡£
ͼ8 StackRegÕ»Ö¡²¼¾Ö
ͨ³£Ã¿¸öº¯Êý¶¼ÓÐ×Ô¼ºµÄÕ»Ö¡¡£¸÷Õ»Ö¡Öдæ·Åǰһ¸öµ÷Óú¯ÊýµÄÕ»Ö¡»ùÖ·£¬Í¨¹ý¸ÃµØÖ·Óò½«ËùÓÐÖ÷µ÷º¯ÊýÓë±»µ÷º¯ÊýµÄÕ»Ö¡ÒÔÁ´±íÐÎʽÁ¬ÔÚÒ»Æð¡£º¯Êýµ÷Óü¶ÊýÔ½¶à£¬Õ¼ÓõÄÕ»¿Õ¼äÒ²Ô½´ó£¬Òò´ËӦСÐÄʹÓõݹ麯Êý¡£
6.2 Õ»Ö¡µÄÐγÉ
Ϊ·½±ã½²½â£¬»ñÈ¡StackRegʾÀý³ÌÐòËù¶ÔÓ¦µÄ»ã±à´úÂëÆ¬¶Î£¬Èçͼ9Ëùʾ¡£ÔÚ»ã±à´úÂëÖУ¬×î×óÁÐΪָÁîÔÚÄÚ´æÖеĵØÖ·£¬Õ»Ö¡Öеķµ»ØµØÖ·(return
address)¼´Ö¸´ËÀàµØÖ·¡£×îÓÒÁÐΪ´ýÖ´ÐеĻã±àÖ¸ÁîÓï¾ä£¬ÖмäÁÐΪ¸ÃÖ¸ÁîÔÚ´úÂë¶ÎÖеÄ16½øÖƱíʾ£¬¿É¼ûpush
%ebpÖ¸Áî½öÕ¼Ò»¸ö×Ö½Ú(0x55)¡£Ã¿´ÎCPUÖ´Ðж¼ÒªÏȶÁÈ¡%eip¼Ä´æÆ÷Öµ£¬È»ºó¶¨Î»µ½%eipÖ¸ÏòµÄ»ã±àÖ¸ÁîÄÚ´æµØÖ·£¬¶ÁÈ¡¸ÃÖ¸Áî²¢Ö´ÐС£¶ÁȡָÁî»áʹ%eip¼Ä´æÆ÷ÖµÔö¼ÓÏàÓ¦Ö¸ÁîµÄ³¤¶È(×Ö½ÚÊý)£¬Ö´ÐÐÖ¸Áîºó%eipֵΪÏÂÌõ´ýÖ´ÐÐÖ¸ÁîµÄÌø×ªµØÖ·¡£

ͼ9 StackReg»ã±àƬ¶Î
¼ÙÉè³ÌÐòÔËÐÐÔÚmain¸Õµ÷ÓÃmiddleº¯Êýʱ£¬¹Û²ìÕ»Ö¡²¼¾ÖÈçºÎ±ä»¯¡£³ÌÐò½øÈëmiddleº¯ÊýËùÔËÐеĵÚÒ»ÌõÖ¸ÁîλÓÚÄÚ´æµØÖ·0x804847c´¦£¬ÔÚÔËÐиÃÖ¸Áî֮ǰµÄÕ»Ö¡½á¹¹Èçͼ10Ëùʾ¡£´ËʱEBPÖ¸Ïòmainº¯ÊýÕ»Ö¡µÄÍ·²¿£¬¶øESPËùÖ¸ÏòµÄÄÚ´æÖдæ·Å³ÌÐò·µ»Øµ½mainº¯ÊýµÄÖ¸ÁîλÖÃ(0x080485c5)¡£

ͼ10 StackRegÔËÐÐÖÐÕ»Ö¡½á¹¹-1
±»µ÷º¯ÊýÔÚµ÷Óúó»ñµÃ³ÌÐòµÄ¿ØÖÆÈ¨£¬½Ó×ÅÐèÍê³É3Ï×÷£º½¨Á¢×Ô¼ºµÄÕ»Ö¡£¬Îª¾Ö²¿±äÁ¿·ÖÅä¿Õ¼ä£¬°´Ðè±£´æ¼Ä´æÆ÷%ebx¡¢%esiºÍ%ediµÄÖµ¡£
ÄÚ´æµØÖ·0x804847c¡«0x804847fµÄÖ¸ÁîÓÃÓÚÐγÉmiddleº¯ÊýµÄÕ»Ö¡¡£µÚÒ»ÌõÖ¸Áî(λÓÚµØÖ·0x804847c´¦£¬¼ò³Æ<Ö¸Áî804847c>)½«Ö÷µ÷º¯ÊýmainµÄÕ»Ö¡»ùÖ·±£´æµ½Õ»ÉÏ(ѹջ²Ù×÷)£¬¸ÃµØÖ·ÓÃÓÚ´Ó±»µ÷º¯Êý¶ÑÕ»·µ»Øµ½Ö÷µ÷º¯ÊýmainÖС£ÕýÊǸ÷º¯ÊýÄÚµÄÕâÒ»²Ù×÷£¬Ê¹µÃËùÓÐÕ»Ö¡Á¬ÔÚÒ»Æð³ÉΪһÌõÁ´¡£
<Ö¸Áî804847d>½«%esp¼Ä´æÆ÷µÄÖµ¸³Öµ¸ø%ebp¼Ä´æÆ÷£¬´Ëʱ%ebp¼Ä´æÆ÷Öдæ·Åµ±Ç°º¯ÊýµÄÕ»Ö¡»ùÖ·£¬ÒÔ±ã¸ù¾ÝÆ«ÒÆÁ¿·ÃÎʶÑÕ»ÖеIJÎÊý»ò±äÁ¿¡£ÕâÑù±ã¿ÉÌÚ³ö%esp¼Ä´æÆ÷ÒÔ×÷ËûÓ㬲¢ÔÚÐèҪʱ¸ù¾Ý%ebpÖµ´Óµ±Ç°º¯ÊýÕ»¶¥Ö±½Ó·µ»ØÕ»µ×¡£
<Ö¸Áî804847f>¶Ô%esp½øÐмõ²Ù×÷£¬¼´½«%espÏòµÍµØÖ·´¦Òƶ¯40(0x28)¸ö×Ö½Ú£¬ÒÔ±ãÔÚÕ»ÉÏÌÚ³ö¿Õ¼äÀ´´æ·Å¾Ö²¿±äÁ¿ºÍÁÙʱ±äÁ¿¡£
ÔËÐÐÍêÉÏÊöÈýÌõÖ¸Áîºó£¬middleº¯ÊýµÄÕ»Ö¡¾ÍÒÑÐγɣ¬Èçͼ11Ëùʾ¡£Í¼Öл¹Ê¾³ö¸Ãº¯ÊýÄڵľֲ¿±äÁ¿ebpRegºÍespRegÔÚÕ»Ö¡ÖеÄλÖá£

ͼ11 StackRegÔËÐÐÖÐÕ»Ö¡½á¹¹-2
Ëæºó£¬½«Ö´ÐÐmiddleº¯ÊýÌå¡£Ö´Ðйý³ÌÖÐÖ¡»ùÖ¸ÕëEBP±£³Ö²»±ä£¬Í¨¹ý¸ÃÖ¸Õë¼ÓÆ«ÒÆÁ¿¼´¿É·ÃÎʺ¯Êýʵ²Î¡¢¾Ö²¿±äÁ¿ºÍÁÙʱ´æ´¢ÄÚÈÝ¡£¼´Ê¹middleº¯ÊýÄÚµ÷ÓÃÆäËûº¯Êý(Èçtail)£¬ÉõÖÁµÝ¹éµ÷ÓÃmiddle×ÔÉí£¬Ö»ÒªÔÚÕâЩ×Óµ÷Ó÷µ»ØÊ±»Ö¸´EBP£¬¾Í¿É¼ÌÐøÓÃEBP¼ÓÆ«ÒÆÁ¿µÄ·½Ê½·ÃÎÊʵ²ÎµÈÐÅÏ¢¡£
<Ö¸Áî804848d>ºÍ<Ö¸Áî804848f>ÊÇmiddleº¯ÊýÖÐÄÚǶµÄ»ã±à´úÂ룬ÓÃÓÚ»ñÈ¡´Ëʱ%ebpºÍ%esp¼Ä´æÆ÷µÄÖµ¡£<Ö¸Áî8048491>½«%ebp¼Ä´æÆ÷Öµ·ÅÈë¾Ö²¿±äÁ¿ebpRegÖУ¬<Ö¸Áî8048494>Ôò½«%esp¼Ä´æÆ÷Öµ·ÅÈë¾Ö²¿±äÁ¿espRegÖС£ÆäÖУ¬0xfffffffc(%ebp)µÈÓÚ(%ebp
- 4)£¬±íʾÔÚÖ¡»ùÖ¸ÕëÏòµÍµØÖ·Æ«ÒÆËÄ×ֽڵĵØÖ·´¦´æ´¢µÄÄÚÈÝ(Æ«ÒÆÁ¿Óò¹Âë±íʾ£¬¸ºÖµ±íʾÏòµÍµØÖ·Æ«ÒÆ)¡£
<Ö¸Áî8048482>ºÍ<Ö¸Áî8048485>½«mainº¯ÊýÖд«µÝÀ´µÄµÚÒ»¸ö±äÁ¿paraMid1Öµ¿½±´µ½%esp¼Ä´æÆ÷ËùÖ¸ÏòµÄÄÚ´æÖУ¬Îªµ÷ÓÃtailº¯Êý×¼±¸Êµ²Î¡£´Ëʱջ¿Õ¼äÈçͼ12Ëùʾ¡£

ͼ12 StackRegÔËÐÐÖÐÕ»Ö¡½á¹¹-3
<Ö¸Áî8048488>µ÷ÓÃtailº¯Êý£¬¸Ãµ÷Óý«·µ»ØµØÖ·(EIPÖ¸ÁîÖ¸Õë¼Ä´æÆ÷µÄÄÚÈÝ)ѹÈëÕ»ÖУ¬µ÷ÓøÃÖ¸ÁîºóµÄÕ»¿Õ¼äÈçͼ13Ëùʾ¡£Ñ¹Õ»µÄ·µ»ØµØÖ·ÊÇ0x804848d£¬´Óͼ9Öпɿ´³ö¸ÃµØÖ·Ö¸Ïòmiddleº¯ÊýÄÚµ÷ÓÃtailº¯ÊýµÄºóÒ»ÌõÖ¸Áµ±tailº¯Êý·µ»ØÊ±½«´Ó¸ÃµØÖ·´¦¼ÌÐøÔËÐгÌÐò¡£µ÷ÓÃ<Ö¸Áî8048488>Ò²Òâζ׎øÈëtailº¯ÊýµÄÕ»Ö¡£¬tailº¯Êý²ÉÓÃÓëmiddleº¯ÊýÏàͬ·½Ê½µÄ½¨Á¢×Ô¼ºµÄÕ»Ö¡¡£Ç°ÃæÍ¼8ËùʾÕýÊÇtailº¯Êý½¨Á¢Õ»Ö¡Ê±µÄÄÚ´æ²¼¾Ö¡£

ͼ13 StackRegÔËÐÐÖÐÕ»Ö¡½á¹¹-4
ͨ¹ýÒÔÉÏÔËÐÐʱ·ÖÎö£¬¿É¿´µ½º¯Êýµ÷Óùý³ÌÖжÑÕ»À©Õ¹Óë»Ö¸´µÄ¶¯Ì¬¹ý³Ì¡£%espºÍ%ebpÁ½¸ö¼Ä´æÆ÷Ö®¼äµÄ¸³ÖµÊ±»ú£¬ÕýÊÇÖ÷µ÷º¯ÊýºÍ±»µ÷º¯ÊýÖ°Ôð½»ÌæÖ®Ê±¡£Ò²ÕýÊǸÃʱ»úµÄÕýÈ·£¬²ÅÄܱ£Ö¤¶ÑÕ»µÄ»Ö¸´¡£
6.3 Õ»Ö¡µÄÏûÍö
ÔڰѳÌÐò¿ØÖÆÈ¨·µ»¹¸øÖ÷µ÷º¯Êýǰ£¬±»µ÷º¯ÊýÈôÓзµ»ØÖµ£¬ÔòÏȽ«Æä±£´æÔÚÏàÓ¦¼Ä´æÆ÷(ͨ³£ÊÇ%eax)ÖУ¬È»ºó°´Ðè»Ö¸´%ebx¡¢%esiºÍ%edi¼Ä´æÆ÷µÄÖµ£¬×îºó´ÓÕ»Àﵯ³ö·µ»ØµØÖ·¡£
ÏÂÃæ¹Û²ìtailº¯ÊýÄÚ½øÐк¯Êý·µ»ØÊ±Õ»¿Õ¼äÈçºÎ±ä»¯¡£<Ö¸Áî804847a>ΪleaveÖ¸Á½«%esp¼Ä´æÆ÷µÄÖµÉèÖÃΪ%ebp¼Ä´æÆ÷Öµ²¢×öÒ»´Îµ¯Õ»²Ù×÷£¬½«µ¯Õ»²Ù×÷µÄÄÚÈÝ·ÅÈë%ebp¼Ä´æÆ÷ÖС£¸ÃÖ¸ÁîµÄ¹¦ÄܵȼÛÓÚ"mov
%ebp, %esp"¼Ó"pop %ebp"£¬¿É½«tailº¯ÊýËù½¨Á¢µÄÕ»Ö¡Çå³ý¡£¸ÃÖ¸ÁîÖ´ÐкóµÄÕ»²¼¾ÖÓëͼ13ÍêÈ«Ïàͬ¡£<Ö¸Áî804847b>ÓÃÓÚ½«Õ»Éϵķµ»ØµØÖ·µ¯³öµ½%eip¼Ä´æÆ÷ÖУ¬Ö´ÐиÃÖ¸Áîºó³ÌÐò·µ»Øµ½middleº¯ÊýµÄ0x804848dµØÖ·´¦¡£¸ÃÖ¸ÁîÖ´ÐкóµÄÕ»½á¹¹Óëͼ12Ïàͬ¡£
6.4 ·µ»Ø½á¹¹Ìå
·ÖÎöÒÔÏÂʾÀý³ÌÐò£º
//StackStrt.c
#include
typedef struct{
int member1;
int member2;
int member3;
}T_RET_STRT;
//FETCH_SREG/PRINT_SREG/PRINT_ADDRºê¶¨Ò壬ÂÔ(Ïê¼ûStackReg.c)
T_RET_STRT func(int paraFunc){
T_RET_STRT locStrtFunc = {.member1=1, .member2=2, .member3=3};
int ebpReg, espReg;
FETCH_SREG(ebpReg, espReg);
PRINT_SREG(ebpReg, espReg);
PRINT_ADDR(paraFunc);
printf("[%s]: (BelowPara) = 0x%08x\n", __FUNCTION__, *((int *)¶Func - 1));
PRINT_ADDR(locStrtFunc.member1);
PRINT_ADDR(locStrtFunc.member2);
PRINT_ADDR(locStrtFunc.member3);
return locStrtFunc;
}
int main(void){
int ebpReg, espReg;
T_RET_STRT locStrtMain = func(100);
FETCH_SREG(ebpReg, espReg);
PRINT_SREG(ebpReg, espReg);
PRINT_ADDR(locStrtMain.member1);
PRINT_ADDR(locStrtMain.member2);
PRINT_ADDR(locStrtMain.member3);
return 0;
}
StackStrt
|
¸ÃʾÀýÖУ¬mainºÍfuncº¯ÊýÄÚ¾ù¶¨ÒåÀàÐÍΪT_RET_STRTµÄ¾Ö²¿±äÁ¿£¬ÇÒfuncº¯ÊýµÄ·µ»ØÖµÀàÐÍÒ²ÊÇT_RET_STRT¡£±äÁ¿locStrtMainºÍlocStrtFuncµÄÄڴ潫·ÖÅäÔÚ¸÷×Ôº¯ÊýµÄÕ»Ö¡ÖУ¬ÄÇôfuncº¯ÊýµÄlocStrtFunc±äÁ¿ÖµÈçºÎͨ¹ýº¯Êý·µ»ØÖµ´«µÝµ½mainº¯ÊýµÄlocStrtMain±äÁ¿ÖУ¿±àÒë¸Ã³ÌÐò²¢ÔËÐÐÒÔ¹Û²ì½á¹û£¬Èçͼ14Ëùʾ¡£Í¼15ʾ³öfuncº¯ÊýÄÚËù¿´µ½µÄÕ»²¼¾Ö¡£

ͼ14 StackStrtÔËÐнá¹û

ͼ15 StackStrtÕ»Ö¡²¼¾Ö
´ÓͼÖпɿ´³ö£¬mainº¯Êýµ÷ÓÃfuncº¯Êýʱ³ý½«ºóÕßËùÐèµÄ²ÎÊýѹÈëÕ»ÖÐÍ⣬»¹½«¾Ö²¿±äÁ¿locStrtMainµØÖ·Ò²Ñ¹ÈëÕ»ÖУ»funcº¯Êý·µ»ØÊ±½«locStrtFunc±äÁ¿µÄֵͨ¹ý¸ÃµØÖ·Ö±½Ó¿½±´µ½mainº¯ÊýµÄlocStrtMain±äÁ¿ÖУ¬´Ó¶øÊ¡È¥Ò»´Îͨ¹ýÕ»µÄÖÐת¿½±´¡£
ɾ³ý´òÓ¡µÈÎÞ¹ØÓï¾äºó£¬²é¿´StackStrt.cÔ´Îļþ»ã±à´úÂëÈçÏÂͼËùʾ(ÂÔÓÐɾ¼õ)£º

ͼ16 StackStrt»ã±àƬ¶Î
<Ö¸Áî804839a>½«¾Ö²¿±äÁ¿locStrtMain½á¹¹ÌåÔÚÕ»ÖеĵØÖ·´æÈë%eax¼Ä´æÆ÷¡£<Ö¸Áî804839d>½«±êÁ¿²ÎÊý(100)ÈëÕ»£¬Òò<Ö¸Áî8048397>ÒÑÔ¤ÁôºÃ´æ´¢¿Õ¼ä£¬¹Ê´Ë´¦µÈЧÓÚ"pushl
$0x64"¡£<Ö¸Áî8048397>½«%eaxÖб£´æµÄ½á¹¹Ì嵨ַ(&locStrtMain)ÈëÕ»£¬´Ë´¦µÈЧÓÚ"pushl
%eax"¡£
<Ö¸Áî804835a>½«8(%ebp)´¦Ëù´æ´¢µÄÖ÷µ÷º¯ÊýlocStrtMain½á¹¹Ì嵨ַ´æÈë%edx¼Ä´æÆ÷¡£<Ö¸Áî804835d>ÖÁ<Ö¸Áî804836b>¶Ô±»µ÷º¯ÊýÕ»Äڵľֲ¿±äÁ¿locStrtFunc½á¹¹Ì帳ֵ¡£<Ö¸Áî8048372>ÖÁ<Ö¸Áî8048380>½«locStrtFunc½á¹¹ÌåµÄ¸÷¸ö³ÉÔ±±äÁ¿ÖµÒÀ´Î´æÈë%edx¼Ä´æÆ÷ËùÖ¸ÏòµÄÄÚ´æµØÖ·´¦(&locStrtMain)¡£<Ö¸Áî8048383>½«ÔÝ´æµÄ%edx¼Ä´æÆ÷ÄÚÈÝ´æÈë%eax¼Ä´æÆ÷£¬´Ëʱ%eaxÄÚ´æ·ÅÖ÷µ÷º¯Êý½á¹¹ÌålocStrtMainµÄµØÖ·¡£
¸ù¾Ý»ã±à½á¹û£¬¿ÉÖªfuncº¯Êý±»¡°¸Ä±à¡±ÎªÒÔÏÂʵÏÖ£º
void func(T_RET_STRT *pStrtMain, int paraFunc){
T_RET_STRT locStrtFunc = {.member1=1, .member2=2, .member3=3};
pStrtMain->member1 = locStrtFunc.member1;
pStrtMain->member2 = locStrtFunc.member2;
pStrtMain->member3 = locStrtFunc.member3;
return; //´Ë¾ä¿ÉÓпÉÎÞ
}
modified func
|
ÈôÏÔʽÉùÃ÷½á¹¹ÌåÖ¸Õë²ÎÊý£¬Ôò¿É±àд¸ü¸ßЧµÄfuncº¯Êý´úÂ룺
void func(T_RET_STRT *pStrtMain, int paraFunc){ 2 pStrtMain->member1 = 1; 3 pStrtMain->member2 = 2; 4 pStrtMain->member3 = 3; 5 } |
×¢Ò⣬ÈôT_RET_STRT locStrtMain = func(100)¸ÄΪfunc(100)£¬Ö÷µ÷º¯ÊýÕ»ÉÏÈÔ»áÔ¤ÁôÒ»¸ö½á¹¹Ìå±äÁ¿µÄ¿Õ¼ä£¬È»ºó½«¸Ã±äÁ¿µØÖ·´æÈë%eax¼Ä´æÆ÷¡£<Ö¸Áî8048397>ºÍ<Ö¸Áî804839a>·Ö±ð±äΪsub
$0x1c, %espºÍlea 0xffffffe8(%ebp), %eax¡£
´ÓÒÔÉÏ·ÖÎöÒàÖª£¬µ±º¯ÊýÒԽṹÌå»òÁªºÏÌå×÷Ϊ·µ»ØÖµÊ±£¬º¯ÊýµÚÒ»¸ö²ÎÊý´æ·ÅÔÚÕ»Ö¡12(%ebp)λÖô¦£¬¶ø8(%ebp)λÖô¦´æ·Å·µ»ØÖµµÄµØÖ·¡£
|