2013-07-13 10 views
15

में आरईटी का अर्थ मैं असेंबली के लिए बहुत नया हूं, और मुझे समझ में नहीं आता कि एक प्रो के अंत में, इसका मतलब क्या है, आप ret कथन के साथ एक संख्या लिखते हैं।असेंबली

Function Proc 
push ax cx 
. 
...body... 
. 
pop cx ax 
ret 2 
Function endp 

मैं समझता हूँ कि यह जहां ढेर सूचक समारोह के अंत में करने के लिए वापस चाहिए के साथ क्या करने के लिए कुछ है:

इस तरह

?

कृपया, अगर आप इसे आसानी से समझा सकते हैं तो यह वास्तव में मेरी मदद करेगा।

+6

विधानसभा एक भाषा नहीं है - प्रत्येक प्रोसेसर का अपना स्वयं का होता है। आपको एक विशिष्ट वास्तुकला के बारे में पूछना चाहिए (x86, ऐसा लगता है)। – ugoren

+0

और उत्तर, x86 के लिए, [यहां] है (http://download.intel.com/products/processor/manual/325383.pdf) – ugoren

+2

ऑफ-विषय: 'ret' एक शक्तिशाली छोटा निर्देश है जो लंबे समय से रहा है बग्गी सॉफ़्टवेयर का शोषण करने का केंद्र: यह कॉल स्टैक की स्मृति की सामग्री के अनुसार प्रोग्राम के नियंत्रण प्रवाह को निर्देशित करता है। यदि आप स्मृति को नियंत्रित करते हैं ('strcpy', मैं आपको देख रहा हूं), तो आप प्रोग्राम निष्पादन प्रवाह को नियंत्रित करते हैं। –

उत्तर

14

हां, लेकिन ret 2 स्टैक से 2 बाइट पैरामीटर को भी हटा देता है। एक समारोह (आम तौर पर सी द्वारा प्रयुक्त) "फोन करने वाले को साफ" - -

push some_parameter 
call Function 

इस बिंदु पर, एक cdecl समारोह add sp, 2 की आवश्यकता होती है "ढेर को साफ करने के लिए" होता है, को हटाने: मुमकिन है, अपने कार्य की तरह बुलाया गया था पैरामीटर। ऐसा एक समारोह एक सादा ret में समाप्त होगा।

एक stdcall समारोह है, जो आपको क्या मिल गया है, एक "कॉल प्राप्त करने वाला को साफ" समारोह (विंडोज एपीआई द्वारा इस्तेमाल किया, उदाहरण के लिए) add sp, 2 की आवश्यकता नहीं है है - यह ret 2 द्वारा किया गया है।

आप इसके बारे में पता नहीं कर रहे हैं, call ढेर पर वापसी पता डालता है (और ret इसे बंद पॉप) है, तो आप सिर्फ pop अपने समारोह के अंदर पैरामीटर नहीं प्राप्त करने के लिए कर सकते हैं।

3

इसका मतलब उच्च स्तर की भाषाओं में return की तरह रीटर्न है।

अधिकांश मशीनों पर, यह स्टैक के सबराउटिन में प्रवेश करने से पहले प्रोग्राम काउंटर के पिछले मूल्य को पॉप करेगा और इसे पीसी के रजिस्टर में कॉपी करेगा।

x86 के लिए, तर्क स्टैक पर पैरामीटर की संख्या है। यह तभी लागू होता है जब इस्तेमाल किया गया सम्मेलन सबराउटिन को स्टैक को रीसेट करने के लिए है।

+0

तो इसके आगे की संख्या का अर्थ क्या है? –

+0

@RotemMayo मेरे संपादन का संदर्भ लें। – alex

+2

मामूली सुधार: तत्काल ऑपरेंड लौटने पर अतिरिक्त _bytes_ को "पॉप" पर स्टैक से निर्दिष्ट करता है। – Michael

6

जैसा कि एलेक्स ने कहा, इसका मतलब है रिटर्न। x86 असेंबली में, जब संकलक इस पंक्ति तक पहुंचता है (उदाहरण के लिए, सबराउटिन के अंत में), यह स्टैक से अंतिम मान पॉप करता है, जो लौटने वाला पता माना जाता है, और इसे आईपी रजिस्टर में सौंपा जाता है। आप एक साधारण असेंबलर कोड लिखकर इसे बेहतर समझ सकते हैं और इसे टर्बो डीबगर के साथ संकलित कर सकते हैं। यदि आप उसमें नए हैं तो असेंबलर के लिए एक जीयूआई है। आप जीयूआई here पा सकते हैं।

जब आप उपरोक्त में होते हैं तो स्टैक्स से और स्टैक पर मूल्यों को दबाते समय दबाते हैं, तो आपको वापसी पते को स्टोर करना चाहिए, क्योंकि सबराउटिंग के अंत में आपको इसे return से पहले स्टैक में धक्का देना होगा लाइन।

शुभकामनाएं!

12

आइए कहें कि मेरे पास दो शब्द जोड़ने और EAX में राशि छोड़ने की प्रक्रिया है। शब्द तर्क हैं जो मैं ढेर पर प्रक्रिया को पास करना चाहता हूं। मैं।ई:

addtwob proc 

push ebp 
mov ebp,esp 
mov eax, [ebp+6]  
add eax, [ebp+8] 
pop ebp 
ret 4 

Endp 

[ebp+6] और [ebp+8] पता word2 और word1 स्टैक पर:

push word1 
push word2 
call addtwob 

प्रक्रिया कुछ ऐसा दिखाई देगा। ret 4 बस सामान्य की तरह लौटाता है लेकिन फिर स्टैक पॉइंटर (esp) में 4 जोड़ता है, इसलिए आपको कॉल से लौटने के बाद स्टैक से pop word2pop word1 नहीं होना चाहिए, इसलिए यह पिछले धक्का को पॉप किए बिना स्टैक को साफ़/संतुलित करता है।

1

आप x86_64 के लिए एक ऑपरेंड के साथ वापसी के पास के बारे में पूछ रहे हैं। प्रोसेसर द्वारा आरईटी के पास होने पर हार्डवेयर के बाद एल्गोरिदम का पालन किया जाता है Intel instruction set reference manual में दिखाया गया है;

(* Near return *) 
IF instruction = near return 
    THEN; 
    IF OperandSize = 32 
     THEN 
     IF top 4 bytes of stack not within stack limits 
      THEN #SS(0); FI; //throw protected mode exception 
     EIP ← Pop(); 
     ELSE 
     IF OperandSize = 64 
      THEN 
      IF top 8 bytes of stack not within stack limits 
       THEN #SS(0); FI; //throw protected mode exception 
      RIP ← Pop(); 
      ELSE (* OperandSize = 16 *) 
      IF top 2 bytes of stack not within stack limits 
       THEN #SS(0); FI; //throw protected mode exception 
      tempEIP ← Pop(); 
      tempEIP ← tempEIP AND 0000FFFFH; 
      IF tempEIP not within code segment limits 
       THEN #GP(0); FI; //throw protected mode exception 
      EIP ← tempEIP; 
     FI; 
    FI; 
    IF instruction has immediate operand 
     THEN (* Release parameters from stack *) 
     IF StackAddressSize = 32 
      THEN 
      ESP ← ESP + SRC; 
      ELSE 
      IF StackAddressSize = 64 
       THEN 
       RSP ← RSP + SRC; 
       ELSE (* StackAddressSize = 16 *) 
      SP ← SP + SRC; 
      FI; 
     FI; 
    FI; 
FI; 
  • इस एल्गोरिथ्म जब भी एक के पास वापसी का सामना करना पड़ा है के अनुसार, वापसी पता चेक किया गया है कि क्या यह एसएस सीमा में है। यदि रिटर्न पता वैध है तो स्टैक का शीर्ष ऑपरेशन आकार के अनुसार आरआईपी या ईआईपी में पॉप किया जाता है।

  • यदि ऑपरेंड आकार 16 बिट्स है तो एक अस्थायी स्थान पॉप-अप रिटर्न पता होता है जो मूल्य 0x0000FFFF के साथ एंडेड होता है और सीएस सीमाओं की जांच के बाद ईआईपी में लोड किया जाता है।

  • जैसा कि आपका प्रश्न पूछता है कि आरईटी निर्देश ओपोड के पास एक ऑपरेंड होने पर क्या होता है। यह स्टैक पता आकार पर निर्भर करता है। उस आकार के अनुसार आरएसपी ईएसपी या एसपी ऑपरेंड द्वारा बढ़ाया गया है और सभी निकट आरईटी निर्देश हार्डवेयर पर निष्पादन पूरा हो गया है।

+1

'पॉप सीएक्स' एक स्पष्ट स्पष्ट संकेत है कि ओपी 16-बिट कोड देख रहा था। कुछ कारणों से लोग 16-बिट कोड के बारे में बहुत सारे स्टैक ओवरफ़्लो प्रश्न पूछते हैं। उनमें से कुछ खिलौने ओएस बना रहे हैं, उनमें से ज्यादातर विश्वविद्यालय पाठ्यक्रम ले रहे हैं जो कुछ पागल कारणों से emu8086 के साथ 8086 पढ़ाते हैं। –

संबंधित मुद्दे