असेंबली भाषा में फ़ाइल Management

Prahlad Godara ------ From DOOSEEP


असेंबली - फ़ाइल प्रबंधन

असेंबली भाषा में 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 

Read in- English
Tags- Nasm Assembly language file management. This blogcreates content similar to stackoverflow geeks for geeks tutorialspoint w3schools and dooseep,file handling in assembly in hindi
कोई टिप्पणी नहीं:
एक टिप्पणी भेजें