2011-07-01 12 views
7

उदाहरण के लिए, यह कैसे syscall sys_wait4 के लिए मानकों को तैयार करने के:असेंबली में, आप सी स्ट्रक्चर से कैसे निपटते हैं?

asmlinkage long sys_wait4(pid_t pid,unsigned int __user *stat_addr, int options, struct rusage __user *ru) 
1120 { 

विधानसभा में struct rusage से कैसे निपटते हैं?

एक नमस्ते दुनिया उदाहरण विधानसभा में struct से निपटने के लिए मेरे लिए काफी है :)

उत्तर

11

एक struct के सदस्यों स्मृति में क्रमिक रूप से बाहर रखी हैं, संभवतः गद्दी के साथ, और struct का पता आम तौर पर पता है अपने पहले सदस्य का।

struct Bar { 
    int x; 
    int y; 
}; 

struct Foo { 
    struct Bar b; 
    double d; 
    int i; 
}; 

struct Foo f; 

मान लें कि &f0x10 में है। फिर, &f.b.x (Foo के पहले सदस्य का पहला सदस्य) 0x10 भी है। &f.b.y0x14 है, क्योंकि f.b.x चार बाइट्स (32-बिट मशीन मानते हुए) है। &f.d0x18 है, और &f.i0x20 है। पहला पता जो f पर कब्जा नहीं किया गया है (दूसरे शब्दों में, &f + 1) 0x24 है।

तो आपको यह सुनिश्चित करना है कि आपके पास संरचना के सदस्यों के लिए स्थान (ढेर या ढेर) स्थान है, और उचित डेटा के साथ स्थान भरें, और पहले सदस्य के पते को पास करें समारोह।

उदाहरण के लिए वास्तव में असेंबली शामिल है, तो आप आसानी से इसे एक छोटा परीक्षण कार्यक्रम लिखकर उत्पादित कर सकते हैं और gcc -S -O0 -g के साथ संकलित कर सकते हैं, जो आपके सी कोड के लिए असेंबली कोड उत्पन्न करेगा।

int func(struct Foo * foo) { 
    return foo->b.x + foo->i; 
} 

int main() { 
    struct Foo foo; 
    foo.b.x = 42; 
    foo.b.y = 9; 
    foo.d = 3.14; 
    foo.i = 8; 
    func(&foo); 
    return 0; 
} 

विधानसभा उत्पादन में, आप अन्य बातों के अलावा, देखेंगे: उदाहरण के लिए (ध्यान दें: इस 64-बिट एएसएम है):

movl $42, -32(%rbp) 
movl $9, -28(%rbp) 
movabsq $4614253070214989087, %rax 
movq %rax, -24(%rbp) 
movl $8, -16(%rbp) 

आप देख सकते हैं, मानों 42, 9, (पूर्णांक जिसका बिट पैटर्न 3.14 है), और 8 पते -32, -28, -24, और -16 (बेस पॉइंटर से संबंधित) में लोड किया जा रहा है। मेरे पास केवल एक सोलारिस बॉक्स आसान है, इसलिए मैं asmlinkage का उपयोग नहीं कर सका (जो निर्दिष्ट करता है कि फ़ंक्शन तर्कों को रजिस्टरों की बजाय ढेर पर पारित किया जाना चाहिए), इसलिए फ़ंक्शन कॉल से ठीक पहले, हम संरचना का प्रभावी पता देखते हैं एक रजिस्टर में लोड किया जा रहा:

leaq -32(%rbp), %rax 
movq %rax, %rdi 

asmlinkage इसके बजाय, आप देखना चाहते हैं इस प्रभावी पता ढेर पर धकेल दिया जा रहा है।

+0

एल्डहुसेट, एक हैलो विश्व उदाहरण उपलब्ध है? –

+0

मुझे लगता है कि सी 99 गारंटी देता है कि एक संरचना का पता अपने पहले सदस्य का पता है। –

+0

@ टीसी .: उचित लगता है; मैंने "आम तौर पर" लिखा क्योंकि सिर्फ 100% यकीन नहीं था कि यह मामला था - लेकिन मुझे कोई कारण नहीं दिख रहा कि क्यों कोई संरचना की शुरुआत में पैडिंग जोड़ना चाहेगा। –

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