الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

شرح برنامج سي مع اسمبلي

مغلق
بدأه queen1 في 1 يناير 2005 · 4 رد · 1,022 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته :

أرجوا لمن يقرأ مشاركتي المساعدة في شرح برنامجي الذي يخلط بين لغة اسمبلي ولغة سي++ في الحقيقة البرنامج طويل نوعا ما ولكن أتمنى لمن يستطيع مساعدتي

يشرح لي حتى ولو دالتين أو ثلاث دوال من بين 20 دالة وسأكون شاكره لكم

ملاحظه:

اذا سمحتم أرجوا السرعة في شرح البرنامج وفي اسرع وقت.

وشكرا

Mylib.h

#2

السلام عليكم,

العملية كلها تقتضي معرفة شغل المقاطعات وأعني بهذا ما يعنيه رقم كل مقاطعة ما وكيف نستدعيها وما ترجعه لنا. وهنا أنصح كما أقول دائما أن نتوفر إما على كتاب يحتوي على مختلف هذه الأرقام أو على ملف يكون فيه هذا الشيء وأشهر ملف هو للسيد Ralph Brown ويمكن تحميله من هذا المنتدى لأنه في الحقيقة يصعب تذكر الأرقام وكيف التعامل مع المقاطعات ولذى نلجأ دائما إلى من يذكرنا بهذا. وحين نقرأ مثل هذه المعلومات ستتضح لنا هذه الدوال وحقيقة إذا كنا لا نعرف كيف تشتغل المقاطعات فسيبدو لنا الكود كأنه شيء غير مفهوم على الإطلاق.

فكمثال لو نأخذ هذا الكلام المأخوذ من الملف المذكور سابقا فيما يخص المقاطعة 21 والدالة 3C فهو كما يلي :

اقتباس
INT 21 - DOS 2+ - "CREAT" - CREATE OR TRUNCATE FILE

AH = 3Ch

CX = file attributes (see #01401)

DS:DX -> ASCIZ filename

Return: CF clear if successful

    AX = file handle

CF set on error

    AX = error code (03h,04h,05h) (see #01680 at AH=59h/BX=0000h)

وهذا معناه أنه إذا أردنا مثلا أن نخلق ملفا جديدا سنستعمل المقاطعة 21 مع الدالة 3C وهذا الرقم سيكون دائما في الرجستر AH ومعطيات المقاطعة تكون كما يلي :

في الرجستر CX يجب أن يحتوي على خصائص الملف الذي نريد أن نخلقه وهي مجرد أرقام كل واحد له مدلول خاص به وهذه الأرقام هي أيضا موجودة بالملف . وطبعا حين نريد أن نخلق ملفا جديدا يجب أن نعطي اسما لهذا الملف وهذا الإسم سنعطي عنوانه في DS:DX كما جاء في الكلام السابق DS:DX -> ASCIZ filename

هذا ما ستطلبه منا المقاطعة وحين تنجز هذه الأخيرة فستكون الأمور كاتالي :

إذا كان الفلاغ CF صفر فإن العملية تمت بنجاح وفي الحالة الأخرى فقد تمت هناك مشكلة ما في خلق الملف وسيكون عندنا رقم الخطء في الرجستر AX . وإذا تمت العملية بنجاح فسنجد في الرجستر AX هاندل الملف الجديد الذي خلقناه ومن ثم يمكن التعامل مع الملف من خلال هذا الهاندل حتى نستدعي مرة أخرى المقاطعة الخاصة بغلق الملف.

وهنا أعطيت هذا المثال وسنرى مشابهه في ماجاء في الملف اذي أرفق في السؤال والدالة المماثلة لهذا هي :

اقتباس
void Fun1 (){//open new file

int A = FP_OFF(Txt) , B ;

clrscr();

printf("Enter file name :");

scanf("%s",Txt);

asm {

  mov ah, 0x3c ;

  mov cx, 0x20 ;

  mov dx, A    ;

  int 0x21    ;

}

if( _FLAGS &0x01){PrintError(_AX);return;}

else            Hand=_AX;

printf("    Witer  youer doc  to close file wite  ^\n\n");

وهنا اسم الدالة يعبر عن ما ذكرت من قبل وسنقارنه بما سبق :

int A = FP_OFF(Txt) , B هنا سنعلن عن متغيرين فمثلا A ستحتوي من بعد على عنوان txt وهذا سيكون فيه اسم الملف الذي نريد أن نخلقه.

clrscr(); هذه ليست لها علاقة مباشرة مع ما سبق ولكنها ستمسح فقط الشاشة

asm {

mov ah, 0x3c ;

mov cx, 0x20 ;

mov dx, A ;

int 0x21

هنا كما ذكرنا سابقا تماما . سنملأ الرجسترات التي تطلبها هذه الدالة والمقاطعة بما يجب ثم نستدعي الدالة .

if( _FLAGS &0x01){PrintError(_AX);return;} إذا كان الفلاغ غير صفر يعني هناك مشكل ما وسنطبع الخطء الذي رقمه قد وضع في الرجستر AX

scanf("%s",Txt); سيطلب منا إدخال اسم الملف وسيوضع هذا الإسم في المتغير txt

else Hand=_AX; وفي الحالة الأخرى سيحتوي الرجستر AX على هاندل الملف الذي فتح مجددا.

هذا كمثال ومن الصعب الحديث هنا عن كل الدوال لكن الطريقة هي مثلها إذ يكفي معرفة المقاطعات ويمكن لأي أحد من بعد أن يفهم معنى كل دالة لوحده.

إلى اللقاء.

#3

السلام عليكم :

بصراحة الاخ chik ما قصرت اشكرك جداعلى شرح البرنامج وانا بصراحة

فهمت احسن من اول ولكن عندي بعض الغموض في بعض الدوال فارجوا ان

تسمح لي في اسئلتك مرة اخرى في بعض الاسئلة التي صعبت علي وهي:

في الدالةfun1 الاوامر التاليه :

------------------------------------

for(;;){

scanf("%s",Buf);

B = strlen(Buf) ;

Buf='\r';Buf[b+1]='\n';Buf[b+2]=0;

if(strchr(Buf,'^')==NULL)Wite(Hand);

else break ;

}

asm {

mov ah, 0x3e ;

mov bx, Hand ;

int 0x21 ;

}

if( _FLAGS &0x01){PrintError(_AX);return;}

printf("\n\n File %s has been Created and Has Handler = %d",Txt,Hand);

getch();

------------

فارجوا ان توضح لي بعض الاوامر التي فيها لانني لست قوي في الاسمبلي

وارجوا ايضا ان ترشدني من اين احمل الملف الذي قلت لي انه يحتوي على

ارقام المقاطعات للسيد Ralph Brown .

وطلب اخر ارجوا عدم الانزعاج مني وهو:

ان تشرح لي عمل كل دالة من الدوال التالية بشكل عام دون تفصيل.

وهي:

DiskInfo() ، Init() ،PrintError ،FindFirst( char *T )،FindNext( char *T )،Read(int hand )

Wite(int hand , int S )

ملاحظة أخيرة:

أريد ان اعرف لماذا البرنامج لايتنفذ وما هو السبب.

هذا وساكون شاكرة لك جزيلاً.

#4

السلام عليكم,

فيما يخص الكود التالي :

for(;;){
scanf("%s",Buf);
B = strlen(Buf);
Buf='\r';Buf[B+1]='\n';Buf[B+2]=0;
if(strchr(Buf,'^')==NULL)Wite(Hand);
else break;

فهذا سيقرأ جملة من الكايبورد ويزيدها في الأخير الرجوع إلى السطر ثم البايت 0 ليعلن عن نهاية الجملة.

asm {
mov ah, 0x3e;
mov bx, Hand;
int 0x21;
}

وهذا الكود هو للإغلاق ملف فتح من قبل . وهذا شغل المقاطعة 21 مع الدالة ah=3e فلو نقرأ عن المقاطعة ستتضح الأشياء إذ هذه المقاطعة تتطلب منا هاندل الملف الذي نريد إغلاقه وهذا الهاندل يجب أن يكون في الرجستر bx وهذا الهاندل سنحصل عليه حين نفتح الملف لذى يجب الإحتفاظ به عند فتح الملف لأن كل التعاملات مع هذا الملف ستكون عبر هذا الهاندل.

فيما يخص المقاطعات لست متذكرا العنوان الآن ولكن حاول البحث في النت بصاحب الملف زسيع>ية الةثير ةما يمةن أن تلقي نرو على المزقع الذي أتى به الأخ Hisham.net مشكورا وهو :

http://www.htl-steyr.ac.at/~morg/pcinfo/ha...ts/inte1at0.htm

فيما يخص بقية السؤال أنصح بقراءة المقاطعات ففيها الأجوبة عن كل هذه الأسئلة.

إلى اللقاء.

#5

السلام عليكم,

لقد حملت ملف المقاطعات من الموقع الذي جاء به الأخ هشام ويمكن تحميله من هذا المنتدى على الرابط التالي وتجدونه في الملف المرفق .

/index.php?showtopic=54198

إلى اللقاء.

هذا الموضوع مغلق.

مواضيع مشابهة