طباعة هذه الصفحة
كتبه المجمع NASM 3478
الدرس 15: الملفات الدرس 15: الملفات
قيم الموضوع
(2 أصوات)
 
 نأتي الآن إلى آخر درس في هذه السلسلة ونتطرق فيه إلى معرفة كيفية التعامل مع الملفات برمجيا.

1. مقدمة

الملفات : هي التي يتم الكتابة فيها أو القراءة منها ويتم حفظها في الأقراص.

عند التعامل مع الملفات في المجمع، فهناك قاطعتين تقومان بذلك :

القاطعة الآلية 13h : الخاصة بـ BIOS وهي في الحقيقة أصل كل دالة تقوم سواء بالكتابة في الملفات أو القراءة أو المسح الكلي للقرص الصلب أو القرص المرن ...، أو التحقق وفحص الأقراص ...

القاطعة المحدثة 21h : الخاصة بـ DOS وهي تستعمد أساسا في أصلها على القاطعة 13h،

الذين يريدون التعامل مع القاطعة 13h هم فقط الذين يحاولون إنشاء نظام تشغيل جديد.

لكن في فقرتنا هذه سنتطرق فقط للقاطعة 21h التي تتميز بسهولتها واحتوائها على طريقتين للتعامل مع الملفات .

الطريقة FCB : معقدة إلى حد ما، لكن يجب معرفتها خصوصا لمن يتعامل مع الحماة المعلوماتية (الفيروسات).

الطريقة Handle : سهلة وسريعة.


2.التعامل مع المجلدات

ملاحظة : جميع الدوال التي سنتطرق إليها تنتمي إلى القاطعة 21h.

2.1 الدالة 39h : إنشاء مجلد

 الدخول : ah=39h
ds:dx : اسم المجلد والمكان الذي تود وضعه فيه (الاسم يجب أن يكون منتهيا بالقيمة 0)
 الخروج : CF : الصفر 0  يعني النتيجة تمت بنجاح.
        1  هناك خطأ ما (ax يحتوي على رقم الخطأ)
 مقابلتها في DOS : MKDIR
 مقابلتها في C : ()mkdir
 مقابلتها في Pascal : Mkdir
 مثال :

chemin      db     'c:\salam',0

......

mov ah,39h
mov dx,chemin
int 21h

2.2 الدالة 3Ah :حذف مجلد

الدخول

: ah=3Ah
ds:dx : اسم المجلد والمكان الذي تود حذفه (الاسم يجب أن يكون منتهيا بالقيمة 0)

الخروج

: CF : الصفر 0  يعني النتيجة تمت بنجاح.
        1  هناك خطأ ما (ax يحتوي على رقم الخطأ)
 مقابلتها في DOS : RMDIR
 مقابلتها في C : ()rmdir
 مقابلتها في Pascal : Rmdir
 مثال :

chemin      db     'c:\salam',0

......

mov ah,3Ah
mov dx,chemin
int 21h

2.3  الدالة 3Bh :فتح مجلد

 الدخول : ah=3Bh
ds:dx : اسم المجلد والمكان الذي تود فتحه (الاسم يجب أن يكون منتهيا بالقيمة 0)
  الخروج : CF : الصفر 0  يعني النتيجة تمت بنجاح.
        1  هناك خطأ ما (ax يحتوي على رقم الخطأ)
 مقابلتها في DOS : CHDIR
 مقابلتها في C : ()chdir
 مقابلتها في Pascal : Chdir
 مثال :

chemin      db     'c:\salam',0

......

mov ah,3Bh
mov dx,chemin
int 21h


3.التعامل مع الملفات

ملاحظة : جميع الدوال التي سنتطرق إليها تنتمي إلى القاطعة 21h.

الملف : يمكن أن يكون ملفا للكتابة مثلا أو القراءة ، ويمكن أن يكون أيضا عبارة عن مجلد.

بصفة عامة يطلق اسم الملف غلى الملف ذاته وعلى المجلد.


2.1 الطريقة باستعمال Handle

 معنى كلمة Handle

handle تعني خواص الملف أو كيفية الدخول إليه.

ملاحظة : الخانات الملونة هي التي تعنينا هنا فلا مجال للتفكير عن معنى الخانات الأخريات.

خواص الملف :

 ثمن الزوج إذا كان يساوي ماذا يعني
0 1  ملف للقراءة فقط
1 1  ملف مخفي
2 1  ملف نظام
3 1  اسم القرص الذي ينتمي إليه
4 1  ليس بملف بل هو مجلد
5 1  أرشيف
6 0  ما زال هذا الزوج غير مستعمل
7 0  ما زال هذا الزوج غير مستعمل

 كيفية الدخول إليه عن طريق اللغة المعلوماتية :

 ثمن الزوج إذا كان يساوي ماذا يعني : الدخول من أجل
0 1 2    
  000  القراءة
  001  الكتابة
  010  القراءة والكتابة
3 0  ما زال هذا الزوج غير مستعمل
4 5 6    
  000  خاص للطريقة FCB
  001  يمكن لتطبيق حالي للدخول
  010  الكتابة
  010  القراءة
  010  الكل
7 0  ما زال هذا الزوج غير مستعمل

 

 الدالة 3Ch : إنشاء ملف

الدخول : ah=3Ch
ds:dx : اسم المجلد والمكان الذي تود وضعه فيه (الاسم يجب أن يكون منتهيا بالقيمة 0)
cx : يحمل خواص الملف : أي إذا كان يساوي :
  0 : ملف للقراءة فقط
  1 : ملف مخفي
  2 : ملف نظام
الخروج : CF =  0  يعني النتيجة تمت بنجاح.
CF =  1  هناك خطأ ما (ax يحتوي على رقم الخطأ)
مقابلتها في C : ()fopen
مقابلتها في Pascal : ASSIGN
مثال :

nom      db     'c:\salam.txt',0

......

mov ah,3ch
mov dx,nom
mov cx,0
int 21h

2.1.3 الدالة 3Dh : قتح ملف

الدخول : ah=3Dh
ds:dx : اسم المجلد والمكان الذي تود وضعه فيه (الاسم يجب أن يكون منتهيا بالقيمة 0)
AL : يحمل طريقة الدخول إلى الملف : أي إذا كان يساوي :
  0 : للقراءة فقط
  1 : للكتابة
  2 : للكتابة والقراءة
الخروج : CF =  0  يعني النتيجة تمت بنجاح.
CF =  1  هناك خطأ ما (ax يحتوي على رقم الخطأ)
مقابلتها في C :

   للقراءة فقط : fopen("nom","r")

 للكتابة : fopen("nom","w")

  للكتابة والقراءة : fopen("nom","a")

مقابلتها في Pascal :

   للقراءة فقط : reset

 للكتابة : rewrite

  للكتابة والقراءة : appened

مثال :

nom      db     'c:\salam.txt',0

......

mov ah,3dh
mov dx,nom
mov al,1        ; للكتابة
int 21h

2.1.4 الدالة 3Eh : غلق ملف

ملاحظة : جميع الدوال التي تلاحظ أنه يوجد فيها handle : BX  تعني أنك يجب إدخال handle في BX قبل أن تستدعي القاطعة 21h ، و handle عبارة عن عدد يمنح لكل ملف مفتوح، ولهذا فعند فتح أي ملف سواء للقراءة أو الكتابة أو هما معا فيجب أن تحفظ القيمة المتواجدة في bx  في متغير ما عند لحظة الفتح لكي تسترجعا عند الغلق أو ما شابه ذلك.

الدخول : ah=3Eh
handle : BX
الخروج : CF =  0  يعني النتيجة تمت بنجاح.
CF =  1  هناك خطأ ما (ax يحتوي على رقم الخطأ)
مقابلتها في C :

  fclos()

مقابلتها في Pascal :

 close()

مثال :

[SEGMENT .data]
nom db 'c:\salam.txt',0

[SEGMENT .bss]
handle resw 1

[SEGMENT .text]

mov ah,3dh
mov dx,nom
mov al,1                   ; للكتابة
int 21h
mov word [handle],bx

mov ah,3dh
mov bx,word [handle]
int 21h

mov ax,4c00h
int 21h

 

 الدالة 3Fh : قراءة ملف

الدخول : ah=3Fh
Handle : BX
CX : عدد الأثمان المراد قراءتها (أي عدد الحروف)
DS:DX : عنوان الجدول المراد الوضع فيه الحروف المقروءة
الخروج : CF =  0  يعني النتيجة تمت بنجاح.
CF =  1  هناك خطأ ما (ax يحتوي على رقم الخطأ)
مقابلتها في C : fopen("nom","r")
مقابلتها في Pascal : reset
مثال :