Introduction to x64
x64 का परिचय
x64, जिसे x86-64 भी कहा जाता है, एक 64-बिट प्रोसेसर आर्किटेक्चर है जो अधिकतर डेस्कटॉप और सर्वर कंप्यूटिंग में प्रयोग किया जाता है। जो x86 आर्किटेक्चर से उत्पन्न हुआ था जिसे इंटेल द्वारा उत्पादित किया गया था और बाद में AMD ने AMD64 नाम से अपनाया, यह व्यक्तिगत कंप्यूटर और सर्वरों में प्रचलित आर्किटेक्चर है।
रजिस्टर
x64 x86 आर्किटेक्चर पर आधारित है, जिसमें 16 जनरल-पर्पस रजिस्टर हैं जिन्हें rax
, rbx
, rcx
, rdx
, rbp
, rsp
, rsi
, rdi
, और r8
से r15
तक नामित किया गया है। इनमें से प्रत्येक एक 64-बिट (8-बाइट) मान स्टोर कर सकता है। इन रजिस्टरों के पास 32-बिट, 16-बिट, और 8-बिट सब-रजिस्टर भी हैं संगतता और विशेष कार्यों के लिए।
rax
- सामान्यत: फ़ंक्शन से रिटर्न मान के लिए प्रयोग किया जाता है।rbx
- अक्सर मेमोरी ऑपरेशन के लिए बेस रजिस्टर के रूप में प्रयोग किया जाता है।rcx
- लूप काउंटर्स के लिए सामान्यत: प्रयोग किया जाता है।rdx
- विभिन्न भूमिकाओं में प्रयोग किया जाता है जिसमें विस्तारित अंकगणित ऑपरेशन शामिल है।rbp
- स्टैक फ्रेम के लिए बेस पॉइंटर।rsp
- स्टैक पॉइंटर, स्टैक के शीर्ष का ट्रैक रखने के लिए।rsi
औरrdi
- स्ट्रिंग/मेमोरी ऑपरेशन में स्रोत और गंतव्य सूचकों के लिए प्रयोग किया जाता है।r8
सेr15
- x64 में पेश किए गए अतिरिक्त जनरल-पर्पस रजिस्टर।
कॉलिंग कनवेंशन
x64 कॉलिंग कनवेंशन ऑपरेटिंग सिस्टम के बीच भिन्न होता है। उदाहरण के लिए:
Windows: पहले चार पैरामीटर को रजिस्टर
rcx
,rdx
,r8
, औरr9
में पारित किया जाता है। आगे के पैरामीटर स्टैक पर ढकेले जाते हैं। रिटर्न मानrax
में होता है।सिस्टम V (UNIX-जैसे सिस्टमों में सामान्य रूप से प्रयोग किया जाता है): पहले छः पूर्णांक या पॉइंटर पैरामीटर को रजिस्टर
rdi
,rsi
,rdx
,rcx
,r8
, औरr9
में पारित किया जाता है। रिटर्न मान भीrax
में होता है।
यदि फ़ंक्शन में छः से अधिक इनपुट हैं, बाकी को स्टैक पर पारित किया जाएगा। RSP, स्टैक पॉइंटर, को 16 बाइट एलाइंड होना चाहिए, जिसका मतलब है कि इसका पता जिस पर यह पॉइंट करता है, किसी भी कॉल से पहले 16 से विभाजनीय होना चाहिए। इसका मतलब है कि सामान्यत: हमें यह सुनिश्चित करने की आवश्यकता होगी कि RSP हमारे शैलकोड में उचित रूप से एलाइंड है पहले हम किसी फ़ंक्शन को कॉल करते हैं। हालांकि, व्यावहारिक रूप से, इस आवश्यकता को पूरा न करने पर भी कई बार सिस्टम कॉल काम करते हैं।
स्विफ्ट में कॉलिंग कनवेंशन
स्विफ्ट का अपना कॉलिंग कनवेंशन है जो https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#x86-64 में देखा जा सकता है।
सामान्य निर्देश
x64 निर्देशों में एक समृद्ध सेट है, पहले x86 निर्देशों के साथ संगतता बनाए रखते हैं और नए निर्देशों को पेश करते हैं।
mov
: एक मान को एक रजिस्टर या मेमोरी स्थान से दूसरे में मूव करें।उदाहरण:
mov rax, rbx
—rbx
सेrax
में मान को मूव करता है।push
औरpop
: स्टैक पर मानों को पुश या पॉप करें।उदाहरण:
push rax
—rax
में मान को स्टैक पर पुश करता है।उदाहरण:
pop rax
— स्टैक से शीर्ष मान कोrax
में पॉप करता है।add
औरsub
: जोड़ने और घटाने के ऑपरेशन।उदाहरण:
add rax, rcx
—rax
औरrcx
में मानों को जोड़कर परिणाम कोrax
में स्टोर करता है।mul
औरdiv
: गुणा और भाग के ऑपरेशन। ध्यान दें: इनके ऑपरेंड का प्रयोग करने के संबंध में विशेष व्यवहार होता है।call
औरret
: फ़ंक्शन को कॉल और वापसी के लिए प्रयोग किया जाता है।int
: सॉफ़्टवेयर इंटरप्ट को ट्रिगर करने के लिए प्रयोग किया जाता है। उदाहरण, 32-बिट x86 लिनक्स में सिस्टम कॉल्स के लिएint 0x80
का प्रयोग किया गया था।cmp
: दो मानों की तुलना करता है और परिणाम के आधार पर सीपीयू के फ्लैग सेट करता है।उदाहरण:
cmp rax, rdx
—rax
कोrdx
के साथ तुलना करता है।je
,jne
,jl
,jge
, ...: शर्तानुसार जंप निर्देशाएं जो पिछलेcmp
या टेस्ट के परिणामों के आधार पर नियंत्रण प्रवाह को बदलती हैं।उदाहरण:
cmp rax, rdx
निर्देश के बाद,je label
—rax
बराबर है तोrdx
पर जाता है।syscall
: कुछ x64 सिस्टमों में सिस्टम कॉल्स के लिए प्रयोग किया जाता है (जैसे आधुनिक यूनिक्स)।
macOS
सिसकॉल
विभिन्न क्लास के सिसकॉल होते हैं, आप उन्हें यहाँ पा सकते हैं:
फिर, आप प्रत्येक सिसकॉल नंबर इस URL में:
इसलिए open
सिसकॉल (5) को Unix/BSD class से बुलाने के लिए इसे जोड़ना होगा: 0x2000000
इसलिए, open को बुलाने के लिए सिसकॉल नंबर होगा 0x2000005
शैलकोड
कॉम्पाइल करने के लिए:
बाइट्स निकालने के लिए:
Last updated