सिस्टम कॉल कंप्यूटर या हार्डवेयर से काम करवाने के लिए कुस बेसिक और जरूरी निर्देश होते है। यह यूजर और कर्नेल के बीच इंटरफेस के लिए एपीआई हैं। जैसे - सिस्टम कॉल - sys_write और sys_exit, क्रमशः स्क्रीन में लिखने और कार्यक्रम से बाहर निकलने के लिए उपयोग करते है ।
असेंबली - सिस्टम कॉल
सिस्टम कॉल आप जो भी ऑपरेटिंग सिस्टम यूज़ करते है असेंबली प्रोग्राम में उस सिस्टम कॉल निर्देशों का उपयोग कर सकते हैं। यहां हम अपने असेंबली प्रोग्राम में लिनक्स सिस्टम कॉल का उपयोग करके समझने की कोशिस करेंगे।
आपको अपने प्रोग्राम में लिनक्स सिस्टम कॉल्स का उपयोग करने के लिए निम्नलिखित कदम उठाने की आवश्यकता है -
- EAX रजिस्टर में सिस्टम कॉल नंबर डालें।
- रजिस्टरों EBX, ECX, आदि में सिस्टम कॉल के तर्कों को स्टोर करें।
- निर्देश पूरा करने के लिए (80h) पर कॉल करें।
- जो भी इस कोड के रन होने पर रिजल्ट आता है वो आमतौर पर EAX रजिस्टर में स्टोर होता है।
यह छह रजिस्टर (EBX, ECX, EDX, ESI, EDI, and EBP) सिस्टम कॉल के तर्कों को संग्रहीत करने में उपयोग होते है। ये रजिस्टर EBX रजिस्टर से शुरू होकर लगातार आर्ग्युमेंट लेते हैं। यदि छह से अधिक तर्क हैं, तो पहले तर्क का स्मृति स्थान EBX रजिस्टर में संग्रहीत किया जाता है।
कुस सिस्टम कॉल nasm असेम्ब्ली निर्देश।
mov eax,1 ; सिस्टम कॉल नंबर (sys_exit)
mov eax,4 ; सिस्टम कॉल नंबर (sys_write)
int 0x80 ; कॉल कर्नेल
सभी syscalls उनकी संख्या के साथ /usr/include/asm/unistd.h में (आपके द्वारा 80h पर कॉल करने से पहले EAX में रखा गया मान) सूचीबद्ध हैं
सिस्टम कॉल्स टेबल
इस टेबल में ट्यूटोरियल में प्रयुक्त कुछ सिस्टम कॉल्स को दिखाया गया है -
%eax | Name | %ebx | %ecx | %edx | %esx | %edi |
---|---|---|---|---|---|---|
1 | sys_exit | int | - | - | - | - |
2 | sys_fork | struct pt_regs | - | - | - | - |
3 | sys_read | unsigned int | char * | size_t | - | - |
4 | sys_write | unsigned int | const char * | size_t | - | - |
5 | sys_open | const char * | int | int | - | - |
6 | sys_close | unsigned int | - | - | - | - |
उदाहरण - निम्न उदाहरण कीबोर्ड से एक संख्या इनपुट लेता है और इसे स्क्रीन पर प्रदर्शित करता है
section .data ;डाटा सेगमेंट
userMsg db 'Please enter a number: ' ;इनपुट संदेश
lenUserMsg equ $-userMsg ;संदेश की लंबाई
dispMsg db 'You have entered: '
lenDispMsg equ $-dispMsg
section .bss ;अप्रारंभीकृत डेटा
num resb 5
section .text ;कोड सेगमेंट
global _start
_start: ;उपयोगकर्ता इनपुट प्रॉम्प्ट
mov eax, 4
mov ebx, 1
mov ecx, userMsg
mov edx, lenUserMsg
int 80h
;उपयोगकर्ता इनपुट पढ़ें और स्टोर करें
mov eax, 3
mov ebx, 2
mov ecx, num
mov edx, 5 ;5 bytes (numeric, 1 for sign) of that information
int 80h
;संदेश आउटपुट करें 'The entered number is: '
mov eax, 4
mov ebx, 1
mov ecx, dispMsg
mov edx, lenDispMsg
int 80h
;दर्ज संख्या को आउटपुट करें
mov eax, 4
mov ebx, 1
mov ecx, num
mov edx, 5
int 80h
; कोड से बाहर निकलें
mov eax, 1
mov ebx, 0
int 80h
जब उपरोक्त कोड असेम्ब्ल और रन किया जाता है, तो यह निम्न परिणाम प्राप्त होता है -
Please enter a number -
1234
You have entered - 4321