असेंबली - फ़ाइल प्रबंधन
असेंबली भाषा में File managemen का उपयोग आपके डिवाइस पर उपलब्ध डेटा और फ़ाइलों को व्यवस्थित करने, उन्हें संशोधित करने जैसे नई फ़ाइलें बनाने, संपादित करने, हटाने, संशोधित करने, स्थानांतरित करने, नाम बदलने आदि के लिए किया जाता है।
सिस्टम किसी भी इनपुट या आउटपुट डेटा को बाइट्स की एक स्ट्रीम के रूप में मानता है। तीन मानक फ़ाइल स्ट्रीम हैं-
- Standard input (stdin),
- Standard output (stdout), and
- Standard error (stderr).
फ़ाइल हैंडलर में कमांड लिखने के लिए फ़ाइल डिस्क्रिप्टर और फ़ाइल पॉइंटर का उपयोग किया जाता है.
file descriptor - जब कोई नई फ़ाइल बनाई जाती है या कोई मौजूदा फ़ाइल खोली जाती है, तो फ़ाइल तक पहुँचने के लिए फ़ाइल डिस्क्रिप्टर का उपयोग किया जाता है। फ़ाइल डिस्क्रिप्टर एक 16-बिट पूर्णांक है जिसे फ़ाइल आईडी के रूप में फ़ाइल को सौंपा गया है।
The file descriptors of standard file streams - stdin, stdout and stderr are 0, 1 and 2 respectively.
file pointer - एक फ़ाइल पॉइंटर बाइट्स के संदर्भ में बाद के पढ़ने/लिखने के संचालन के लिए फ़ाइल में एक स्थान निर्दिष्ट करता है। प्रत्येक फ़ाइल को बाइट्स के अनुक्रम के रूप में माना जाता है। प्रत्येक खुली फ़ाइल एक फ़ाइल पॉइंटर से जुड़ी होती है जो फ़ाइल की शुरुआत के सापेक्ष बाइट्स में ऑफसेट निर्दिष्ट करती है। जब कोई फ़ाइल खोली जाती है, तो फ़ाइल पॉइंटर शून्य पर सेट हो जाता है।
फ़ाइल हैंडलिंग सिस्टम कॉल
निम्नलिखित तालिका फ़ाइल हैंडलिंग से संबंधित सिस्टम कॉल का संक्षेप में वर्णन करती है−
%eax | Name | %ebx | %ecx | %edx |
---|---|---|---|---|
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 | - | - |
8 | sys_creat | const char * | int | - |
19 | sys_lseek | unsigned int | off_t | unsigned int |
सिस्टम कॉल का उपयोग करने के लिए आवश्यक चरण समान हैं, जैसा कि हमने पहले चर्चा की थी −
- सिस्टम कॉल नंबर को EAX रजिस्टर में डालें।
- सिस्टम कॉल के तर्कों को रजिस्टर EBX, ECX आदि में संग्रहीत करें।
- संबंधित interrupt को कॉल करें (80 घंटे).
- परिणाम सामान्यतः EAX रजिस्टर में लौटाया जाता है।
एक फ़ाइल बनाना और खोलना
नई फ़ाइल बनाने और खोलने के लिए, निम्नलिखित कार्य करें −
- EAX रजिस्टर में सिस्टम कॉल sys_creat() नंबर 8 डालें।
- फ़ाइल का नाम EBX रजिस्टर में डालें।
- फ़ाइल अनुमतियों को ECX रजिस्टर में रखें।
सिस्टम कॉल बनाई गई फ़ाइल का फ़ाइल डिस्क्रिप्टर EAX रजिस्टर में लौटाता है, त्रुटि के मामले में, त्रुटि कोड EAX रजिस्टर में होता है।
किसी मौजूदा फ़ाइल को खोलना
किसी मौजूदा फ़ाइल को खोलने के लिए, निम्नलिखित कार्य करें−- EAX रजिस्टर में सिस्टम कॉल sys_open() नंबर 5 डालें।
- फ़ाइल नाम को EBX रजिस्टर में रखें।
- ECX रजिस्टर में फ़ाइल एक्सेस मोड डालें।
- फ़ाइल अनुमतियाँ EDX रजिस्टर में डालें।
सिस्टम कॉल बनाई गई फ़ाइल का फ़ाइल डिस्क्रिप्टर EAX रजिस्टर में लौटाता है, त्रुटि के मामले में, त्रुटि कोड EAX रजिस्टर में होता है।
फ़ाइल एक्सेस मोड में, सबसे अधिक उपयोग किए जाने वाले मोड हैं: केवल पढ़ने के लिए (0), केवल लिखने के लिए (1), और पढ़ने के लिए लिखने के लिए (2)।
किसी फ़ाइल से पढ़ना
किसी फ़ाइल से पढ़ने के लिए, निम्नलिखित कार्य करें −- EAX रजिस्टर में सिस्टम कॉल sys_read() नंबर 3 डालें।
- फ़ाइल डिस्क्रिप्टर को EBX रजिस्टर में रखें।
- ECX रजिस्टर में पॉइंटर को इनपुट बफ़र पर रखें।
- EDX रजिस्टर में बफ़र आकार, यानी, पढ़ने के लिए बाइट्स की संख्या डालें।
सिस्टम कॉल EAX रजिस्टर में पढ़े गए बाइट्स की संख्या लौटाता है, त्रुटि की स्थिति में, त्रुटि कोड EAX रजिस्टर में होता है।
फ़ाइल में लिखना
किसी फ़ाइल में लिखने के लिए, निम्नलिखित कार्य करें -- सिस्टम कॉल sys_write() नंबर 4 को EAX रजिस्टर में डालें।
- फ़ाइल डिस्क्रिप्टर को EBX रजिस्टर में रखें।
- ईसीएक्स रजिस्टर में पॉइंटर को आउटपुट बफर पर रखें।
- ईडीएक्स रजिस्टर में बफर आकार, यानी लिखने के लिए बाइट्स की संख्या डालें।
सिस्टम कॉल EAX रजिस्टर में लिखे गए बाइट्स की वास्तविक संख्या लौटाता है, त्रुटि के मामले में, त्रुटि कोड EAX रजिस्टर में होता है।
फ़ाइल बंद करना
किसी फ़ाइल को बंद करने के लिए, निम्नलिखित कार्य करें -- सिस्टम कॉल sys_close() नंबर 6 को EAX रजिस्टर में डालें।
- फ़ाइल डिस्क्रिप्टर को EBX रजिस्टर में रखें।
त्रुटि के मामले में, सिस्टम कॉल EAX रजिस्टर में त्रुटि कोड लौटाता है।
किसी फ़ाइल को अपडेट करना
फ़ाइल को अद्यतन करने के लिए निम्नलिखित कार्य करें −- EAX रजिस्टर में सिस्टम कॉल sys_lseek () नंबर 19 डालें।
- फ़ाइल डिस्क्रिप्टर को EBX रजिस्टर में रखें।
- ऑफसेट मान को ECX रजिस्टर में रखें.
- EDX रजिस्टर में ऑफसेट के लिए संदर्भ स्थिति रखें।
The reference position could be:
- Beginning of file - value 0
- Current position - value 1
- End of file - value 2
त्रुटि के मामले में, सिस्टम कॉल EAX रजिस्टर में त्रुटि कोड लौटाता है
Exampal
निम्नलिखित प्रोग्राम myfile.txt नामक एक फ़ाइल बनाता है और खोलता है, और इस फ़ाइल में 'ट्यूटोरियल पॉइंट में आपका स्वागत है' एक टेक्स्ट लिखता है। इसके बाद, प्रोग्राम फ़ाइल से पढ़ता है और डेटा को info नामक बफर में संग्रहीत करता है। अंत में, यह जानकारी में संग्रहीत पाठ को प्रदर्शित करता है। −
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
;create the file
mov eax, 8
mov ebx, file_name
mov ecx, 0777 ;read, write and execute by all
int 0x80 ;call kernel
mov [fd_out], eax
; write into the file
mov edx,len ;number of bytes
mov ecx, msg ;message to write
mov ebx, [fd_out] ;file descriptor
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
; close the file
mov eax, 6
mov ebx, [fd_out]
; write the message indicating end of file write
mov eax, 4
mov ebx, 1
mov ecx, msg_done
mov edx, len_done
int 0x80
;open the file for reading
mov eax, 5
mov ebx, file_name
mov ecx, 0 ;for read only access
mov edx, 0777 ;read, write and execute by all
int 0x80
mov [fd_in], eax
;read from file
mov eax, 3
mov ebx, [fd_in]
mov ecx, info
mov edx, 26
int 0x80
; close the file
mov eax, 6
mov ebx, [fd_in]
int 0x80
; print the info
mov eax, 4
mov ebx, 1
mov ecx, info
mov edx, 26
int 0x80
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
file_name db 'myfile.txt'
msg db 'Welcome to Dooseep.com'
len equ $-msg
msg_done db 'Written to file', 0xa
len_done equ $-msg_done
section .bss
fd_out resb 1
fd_in resb 1
info resb 26
परिणाम −
Written to file
Welcome to Dooseep.com