2012-02-12 18 views
11
 
void return_input (void) 
{ 
    char array[30]; 

    gets (array); 
    printf("%s\n", array); 
} 

में% gs है इस समारोह निम्नलिखित विधानसभा कोड में बदल जाती है:क्या, जीसीसी में यह संकलन करने के बाद विधानसभा

 
mov %gs:0x14,%eax 
xor %gs:0x14,%eax 

:

 
push %ebp 
mov %esp,%ebp 
sub $0x28,%esp 
mov %gs:0x14,%eax 
mov %eax,-0x4(%ebp) 
xor %eax,%eax 
lea -0x22(%ebp),%eax 
mov %eax,(%esp) 
call 0x8048374 
lea -0x22(%ebp),%eax 
mov %eax,(%esp) 
call 0x80483a4 
mov -0x4(%ebp),%eax 
xor %gs:0x14,%eax 
je  0x80484ac 
call 0x8048394 
leave 
ret 

मैं दो पंक्तियों समझ में नहीं आता % जीएस क्या है, और वास्तव में ये दो पंक्तियां क्या करती हैं?

 
cc -c -mpreferred-stack-boundary=2 -ggdb file.c 
+0

मुझे लगता है कि ये एसएस, डीएस, सीएस, ईएस, एफएस, जीएस - सेगमेंट रजिस्ट्रार हैं। अगर मुझे यह सही मिला। –

+1

संभावित डुप्लिकेट ["एफएस"/"जीएस" रजिस्टर का उद्देश्य क्या है?] (Http://stackoverflow.com/questions/10810203/what-is-the-fs-gs-register-intended-for) –

उत्तर

16

जी एस एक खंड रजिस्टर है, लिनक्स में इसके उपयोग here पर पढ़ा जा सकता है।

mov %gs:0x14,%eax 
xor %gs:0x14,%eax 

इस कोड को मान्य करने के लिए है कि ढेर विस्फोट नहीं हुआ है या, corupted दिया जी एस + 0x14 पर संग्रहीत एक कनारी मूल्य का उपयोग किया जाता है, this देखते हैं।

3

ES, एफएस, जी एस:

इस संकलन आदेश है अतिरिक्त सेगमेंट रजिस्टर अतिरिक्त खंड रजिस्टरों के रूप में इस्तेमाल किया जा सकता; विशेष निर्देशों में भी प्रयोग किया जाता है जो खंडों (जैसे स्ट्रिंग प्रतियां) का विस्तार करते हैं। (अपने मूल रूप से प्रक्रिया डेटा प्रति के लिए प्रयोग) यहां से

http://www.hep.wisc.edu/~pinghc/x86AssmTutorial.htm


लिया आशा है कि यह मदद करता है

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