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

ما الفرق بين توابع ال api و المقاطعات int

مغلق
بدأه Ahmadte1 في 1 يوليو 2006 · 15 رد · 2,546 مشاهدة · في لغة Assembly لأنظمة 16, 32, 64 بت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

كنا في الأسمبلي 16 نستعمل int :unsure:

في الأسمبلي 32 استعملنا api (لماذا)

ما الفرق :blink:

وهل يمكن استعمال ال int في الأسمبلي 32

شكوت لوكيع سوءحفظـي ____ فأرشدني إلى ترك المعاصي

وقال لــــي إن العــلم نـــور ____ونـور الله لا يؤتــى لعــــاصي

#2

راجع هذا الموضوع

/index.php?showtopic=95047

d4baa0.gif
#3

كانت المقاطعات تسجل في جدول يلي تماما جدول البيوس

هل لتوابع الapi جدول؟؟؟؟

هل تم الاستغناء نهائيا عن مقاطعات dos

أم يمكن القول أن توابع الapi هي مجموعة مقاطعات dos مرتبة لتقوم بعمل ما!!؟؟

شكوت لوكيع سوءحفظـي ____ فأرشدني إلى ترك المعاصي

وقال لــــي إن العــلم نـــور ____ونـور الله لا يؤتــى لعــــاصي

#4

دوال api هي دوال مسجلة في ملفات النظام على شكل مكتبات الربط الديناميكية بإمتداد DLL (أو حتى EXE).

جدول المقاطعات هو جدول في Ram يبتدئ من خانة الذاكرة 00000000$ ويضم 256 خانة, كل خانة يسجل بها مؤشر لموقع إجرائية خاصة Subroutine موجودة في مكان ما في Ram, هذه الإجرائية لا تنتهي بتعليمة RET بل بتعليمة أخرى و هي IRET.

هذا الجدول يسمى جدول متجهات المقاطعات Vectors Interupts.

يتم مناداتها ب Int nn حيث nn هو Index في جدول المقاطعات يبتدإ بقيمة 00 وتنتهي ب ff$ أو بالعشري 255.

عتند تشغيل الجهاز يقوم نظام التشغيل بملأ هذا الجدول, كما فعل dos و unix . فكل Api للدوس كانت كلها Interuption كمقاطعة الدوس الشهيرة Int 21.

جدول المقاطعات لم يكن يملأ بأكمله بل كانت بعض الخانات تبقى شاغرة يمكن للمبرمج أن يستغلها ويضع فيها مقاطعته البرمجة الخاصة به.

هذا كان زمان الدوس زمان reel mode. أما في windows فنظام الذاكرة هو protected mod, والذاكرة ما هي إلا virtual يعني لا تستطيع الوصول لهذا الجدول و لا حتى منادات تعليمات Int لأن ويندوز سيصادرها و يوقف برنامجك إلا إن كان يعمل في ring0.

نظام int لا يزال يعتمد في ويندوز لكنه أصبح حكرا لها فقط, لأن معظم ما يريده المبرمج سيجده في api. هناك بعض api تستدعي دوال أخرى api native التي هي بدورها قد تكون مجرد مقاطعات.

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#5

هل يمكن القول أن api هي مجموعة برامج تنفذ عند استدعائها كالمقاطعات :huh:

ولكن هل لها جدول عناوين؟؟؟؟؟؟؟؟؟

(api مقاطعات دوس منظمه ومقاطعات الدوس هي مقاطعات بيوس منظمة إذا ما سر ذاك التطور الرهيب (من شاشة سوداء إلى.........)مع توابع ال api)

شكوت لوكيع سوءحفظـي ____ فأرشدني إلى ترك المعاصي

وقال لــــي إن العــلم نـــور ____ونـور الله لا يؤتــى لعــــاصي

#6

يا أخي Ahmadte1, أراك تخلط ما بين ملفات مسجلة في القرص الصلب (و هي ملفات DLL للويندوز), و شيفرة كود على شكل إجرائيات من نوع خاص توجد في RAM.

أنظر هذا الموضوع لتفهم حقيقة api في ويندوز أولا.

مقدمة عن API في ويندوز

ثم سنلقي الضوء عن ما هية المقاطعات التي عندها علاقة بالمعالج وبنيته الداخلية.

يجب معرفة أن المقاطعات نعنمد على البنية الداخلية للمعالج, فهي عبارة عن إشارات إلكترونية تصل للمعالج من المركبات الإلكترونية المحيطة به مثل الفأرة أو لوحة المفاتيح أو بطاقة من بطاقات ISAH أو غيرها من العتاد.. فالمقاطعة: طلب لفت انتباه المعالج. عندما يتلقى المعالج مقاطعة فإنه يعلق العمليات الجارية، ويحافظ على حالة العمل، وينقل التحكم إلى إجرائية خاصة (إجرائية المقاطعة) تحوي تعليمات للتعامل مع الحالة الخاصة التي سببت المقاطعة. توجد بنية هرمية للمقاطعات تحدد أولوية معالجة المقاطعات عند حدوث أكثر من واحدة في نفس الوقت. هناك مركب إلكتروني ينظم كل المقاطعات الواردة للحاسب تسمى بوحدة التحكم بالمقاطعة و هي جزء من اللوحة الأساسية اللوحة, الأم للحاسب, يقوم بتوزيع خطوط طلبات المقاطعة من التجهيزات (IRQ)، حيث تضمن هذه اللوحة ألا يقوم أكثر من جهاز محيطي واحد بالتخاطب مع المعالج في وقت واحد.هذه المقاطعات تسمى بالمقاطعات المادية لأنها واردة عن وحدات إلكترونية.

في المقابل هناك مقاطعات برمجية يمكن للبرنامج أن يستدعيها بواسطة التعليمة INT, فهي أيضا مقاطعات لكنها لا تأتي من إشارات كهربية خارجية بل تأتي من داخل الكود البرمجي.

يعني خلاصة : المقاطعات هي إشارات خاصة مرسلة من المكونات المادية أو البرمجية للحاسب إلى المعالجCPU, كأن يقوم فجأة جزء من الحاسب بإستأذان المعالج و يطلب منه أن يعيره انتباهه.

في بداية عمل الجهاز بالطريقة الاعتيادية يبدأ الجهاز بعملية الـ ( cold booting) وأول ما يقوم به هو عملية تسمى بعملية ( post)= (power on self test ) ، في الحقيقة أثناء هذه العملية يقوم البايوس ( Bios) بفحص نفسه أولاً ثم يقوم بفحص وحدات الجهاز إذا كانت قابلة للعمل أم لا . وبعد التأكد من سلامة كل الوحدات الرئيسية يقوم بعملية تحميل ( IVT) (interrupt vector table ) وهذا هو جدول المقاطعات وهو من الامور الاساسية للحاسب حيث يعرف الحاسب من خلاله أولويات عمل الاجهزة وطريقة مقاطعة الاجهزة لبعضها وما هو الاولى بالعمل وما هو الجهاز الذي يمكن ان يعمل قبل الاخر وما هو الامر الذي يجب تنفيذه على قائمة الاولويات وهكذا .

في أغلب الأحيان فإن نظام التشغيل ينظم و يجدول أولويات المعالجة بحيث تكون طلبات المقاطعة مقنعة ( masked ) فيقوم المعالج بتجاهل طلبات المقاطعة من بعض المصادر حتى يتم الانتهاء من العمل المحدد بأسرع وقت ممكن. هناك بعض طلبات المقاطعة مثل المقاطعات المتعلقة بأخطاء الذاكرة هذه المقاطعات مهمة جداً بحيث لا يستطيع المعالج تجاهلها, هذه الـ non-maskable Interrupts طلبات المقاطعة غير القابلة للتجاهل NMIs يجب أن يتعامل معها المعالج مباشرة بغض النظر عن المهام الأخرى التي يعالجها.

interrupt vector table أو جدول متجهات المقاطعات هو الجدول الذي يبتدئ من الموقع 0 في الram و يمتد إلى 1024 bytes , فكل 4bytes في هذا الجدول هي عنوان لإجرائية المقاطعة المناسبة لها, يعني هناك 256 = 1024/4 مقاطعة برمجية في معالجات X86 التي يقوم نظام التشغيل بمللأها عند كل إقلاع لنظام التشغيل.

8086_interrupts-3.gif

int_table.png

ولكل نظام تشغيل طريقته في وضع إجرائيات المقاطعات

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#7

رائع يا أخي

لكن حسب ما فهمت من المقال السابق (المرفق)

أن النوافذ هي رسوم تظهر على الشاشة (يجب رسم كل تفصيل فيها )(إن لم نستعمل ال api طبعا) :wacko:

وبما أن النوافذ رسم لماذا لم يقدم dos و الأسمبلي 16 هذه النوافذ الرائعة (هناك مقاطعات للشاشة)

اقتباس
(api مقاطعات دوس منظمه ومقاطعات الدوس هي مقاطعات بيوس منظمة إذا ما سر ذاك التطور الرهيب (من شاشة سوداء إلى.........)مع توابع ال api)

هل هذا صحيح :wacko:

وما سر التطور :wacko:

شكوت لوكيع سوءحفظـي ____ فأرشدني إلى ترك المعاصي

وقال لــــي إن العــلم نـــور ____ونـور الله لا يؤتــى لعــــاصي

#8

هذا هو سر الإنتقال من نظام أحادي المهمة مثل الدوس إلى نظام متعدد المهام مثل ويندوز.

المقاطعات لن تفيد في نظام متعدد المهام, فهي ليست دوال بل مقاطعات أي تأخذ CPU و تشتغل به 100%.

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

إمكانيات الدوال كبيرة جدا و ضخمة أما المقاطعات فمحدودة وخطيرة تهدد إستقرار الحاسب و إستخدامها يبشر بالشاشة الزرقاء.

لا يمكن إستعمال المقاطعات في ويندوز إلى في ring0 و هي برمجة تعريفات العتاد hardware driver.

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#9

أخي ikossan (بارك الله بعلمك)

بصراحة أنا سألت السؤال كله من أجل أن أفهم api و علا قتها بالنوافذ

موضوعك كان رائع (أقصد التصبيقات)

ولكن لم أفهم إلى الآن كيف يتعامل windows مع النوافذ

هل يتعامل معها كرسوم فقط؟؟؟؟؟ :wacko:

وماذا يعني handle (مقبض النافذة)

وماذا يفيد

وماذا يعني أن windows أرسل رساله للنافذة بالحدث

:wacko:

شكوت لوكيع سوءحفظـي ____ فأرشدني إلى ترك المعاصي

وقال لــــي إن العــلم نـــور ____ونـور الله لا يؤتــى لعــــاصي

#10

دروس الأخ الشمري في قسم ++C ستكفيك إن شاء الله, فالأخ حفظه الله وفى و كفى جزاه الله كل خير.

سلسلة دروس لتعلم Win32 API

الجزء الأول: /index.php?showtopic=65853

الجزء الثاني: /index.php?showtopic=71472

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#11
اقتباس
بصراحة أنا سألت السؤال كله من أجل أن أفهم api و علا قتها بالنوافذ

اعتقد ان الـ software interrupts في دوس ليس لها اي علاقة بإنشاء النوافذ في وندوز.

ربما حصل عندك لخبطة لانك تعتقد ان api هي نظام لإنشاء النوافذ؟!

هذه الفكرة غلط.

api تعني application programming interface يعني هي باختصار مجموعة من الـ functions و الـ classes, و عبارة api هي تسمية عامة, ليست حكرا على وندوز ولا انشاء النوافذ ولا شيء.

اي مكتبة برمجية هي في الحقيقة api ..

و لكن لا ادري .. لسبب ما شاع عند العرب استخدام كلمة api هكذا للدلالة على win32 api

عودة الى المقاطعات .. او الـ interrupts اللتي تسأل عنها.

و هي في الحقيقة software interrupts يعني هي في النهاية استدعاء لـ subroutine خاص بالنظام (نظالم التشغيل).

في وندوز لا تستطيع استخدام الـ interrupts كما في الدوز, بل تقوم باستدعاء دالة عادية مثل اي دالة أخرى.

في النهاية لا يوجد فرق ..

هذا حسب فهمي المتواضع ..

و لكن لا علاقة لموضوع مقاطعات الدوز بموضوع نوافذ الوندوز.

و حول سؤالك كيف يرسم الوندوز النوافذ؟ فهو يرسمها كما يرسم اي شيء آخر. أما إذا كنت تسأل عن كيفية رسم الأشياء على الشاشة, فلدي موضوع نظري يشرح الفكرة الأساسية في كيفية الرسم على الشاشة

/index.php?showtopic=83756

#12

لحظة :blink: :wacko:

اقتباس
ربما حصل عندك لخبطة لانك تعتقد ان api هي نظام لإنشاء النوافذ؟!

أنا أعلم أن توابع api ليست لإنشاء نظام النوافذ ولكن لم أعرف أنها ليست حكر على ويندوز

أخي hasan_aljudy

ما فهمته في النهاية أن النافذة هي مجرد رسم يظهر على الشاشة

وهذا يقتضي أن الدلة

hwnd = CreateWindow(
 " arab team ",
 "The title of my window",
 WS_OVERLAPPEDWINDOW,
 CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
 NULL, NULL, hInstance, NULL);

ستعمل على رسم النافذة (بكسل بكسل)

(أي الويندوز ينظر إلى النافذة كرسمة يجب إظهارها على الشاشة)

هل هذا صحيح :wacko:

إن كان هذا صحيح

يمكنني أن أبرمج برنامج يعمل على دوس وأقوم برسم النافذة بكسل بكسل لتظهر لي نافذة جميلة كما في وندوز

(إن كان هذا صحيح لماذا لم تظهر النوافذ في dos)

شكرا أخي hasan_aljudy

بصراحة أرحتني من إكمال كل الموضوع الذي طرحه الأخ الشمري :lol: جزاه الله خير :lol: )

شكوت لوكيع سوءحفظـي ____ فأرشدني إلى ترك المعاصي

وقال لــــي إن العــلم نـــور ____ونـور الله لا يؤتــى لعــــاصي

#13

النافذة اللتي تراها انت هي مجرد رسمة .. و لكنها في الذاكرة ليست مجرد رسمة, بل هي مجموعة متغيرات تحتفظ بحالة النافذة state

حتى ابسط لك ما معنى state, تخيل برنامج يطبع اسم شخص:

#include <iostream>
using namespace std;

int main()
{
	cout << "I'm Hasan" << endl;
}

هنا كل ما يقوم به البرنامج هو طباعة اسم ...

و الاسم هو فقط ما تراه على الشاشة .. البرنامج لا يقوم بعمل اي شيء اضافي.

و الان, تخيل برنامج يسأل المستخدم عن اسمه و عمره

#include <iostream>
using namespace std;

int main()
{
	char[300] name;
	int age;
	cout << "Enter your name (first name only)" << endl;
	cin >> name;
	cout << "Enter your age" << endl;
	cin >> age;

	cout << "You are " << name << " and you are " << age << " Years old!" << endl;
}

هنا الاسم و العمر لم يظهرا من فراغ .. لأن البرنامج يخزن عنده الاسم و العمر على شكل متغيرات.

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

int main()
{
	char[300] name;
	int age;
	cout << "Enter your name (first name only)" << endl;
	cin >> name;
	cout << "Enter your age" << endl;
	cin >> age;

	cout << "You are " << name << " and you are " << age << " Years old!" << endl;

	while( true )
	{
		cout << "Enter new age" << endl;
		cin >> age;

		cout << "Age: " << age << endl;
	}
}

هنا يمر البرنامج بحلقة لا نهائية يطلب فيها من المستخدم تغيير عمره.

ما اللذي نستفيده من كل هذا؟

هذا مثال بسيط و لكنه يوضح فكرة مهمة جدا:

العمر هو ليس مجرد رقم تراه على الشاشة, بل هو متغير داخل البرنامج, يمكن ان يتغير باستمرار بحسب ما يدخله المستخدم من input.

بمعنى آخر, العمر هو ليس فقط رقم تراه مكتوب على الشاشة, نعم .. هذا كل ما تراه انت, و لكن بالنسبة للبرنامج, فالعمر هو متغير يخزن"حالة" العمر (حالة نفسه) state.

النافذة ايضا ليست مجرد شي تراه على الشاشة, بل هو مجموعة كبيرة من المتغيرات تخزن حالة النافذة, هذه الحالة تحتوي على حجم النافذة و ابعادها مثلا .. اضافة الى اشياء اخرى كثيرة.

اقتباس
إن كان هذا صحيح

يمكنني أن أبرمج برنامج يعمل على دوس وأقوم برسم النافذة بكسل بكسل لتظهر لي نافذة جميلة كما في وندوز

(إن كان هذا صحيح لماذا لم تظهر النوافذ في dos)

نعم تستطيع, اذا كان نظام التشغيل يسمح لك بالوصول الى كرت الشاشة و كان الجهاز يستطيع اظهار الصور بسرعة جيدة .. فتستطيع عمل ذلك. (على فرض انك تعرف كيف تبرمجه).

الوندوز اول ما ظهر كان عبارة عن برنامج يعمل ضمن الدوز.

يعني اول ما تفتح الجهاز يطلعلك شاشة سوداء, تكتب فيها اوامر.

اذا كتبت امر win فسوف يظهر برنامج وندوز.

#14

رائع إليك ما توصلت إليه :D (أرجوا التصحيح :huh: )

النافذة رسم على الشاشة

ويتعامل نظام التشغيل مع هذا الرسم من خلال قيم يسجلها في الذاكرة

إن ضغط زر الفأرة مثلا

سيحدد ويندوز مكان الفأرة

وحسب قيم المتحولات التي في الذاكرة سيحدد أي نافذة تم الضغط عليها

ويحدد أي عنصر منها تم الغضط عليه

ويسجل رسالة باسم النافذة و إسم العنصر المضغوط عليه

وتنتهي مهمة ويندوز

وبما أن البرنامج يقوم بستدعاء الدالة GetMessage

تقوم هذه الدالة بالذهاب إلى الموقع الذي خزن فية ويندوز الرسائل

فإن و جدت رسالة باسمها عادة بالقيمة التي نحن نناقش حالاتها

مارأيك أخي hasan_aljudy

(ولكن سؤال يحيرني ماهو handle وكيف يتعامل معه ويندوز) :wacko:

شكوت لوكيع سوءحفظـي ____ فأرشدني إلى ترك المعاصي

وقال لــــي إن العــلم نـــور ____ونـور الله لا يؤتــى لعــــاصي

#15
اقتباس
رائع إليك ما توصلت إليه (أرجوا التصحيح )

النافذة رسم على الشاشة

ويتعامل نظام التشغيل مع هذا الرسم من خلال قيم يسجلها في الذاكرة

إن ضغط زر الفأرة مثلا

سيحدد ويندوز مكان الفأرة

وحسب قيم المتحولات التي في الذاكرة سيحدد أي نافذة تم الضغط عليها

ويحدد أي عنصر منها تم الغضط عليه

ويسجل رسالة باسم النافذة و إسم العنصر المضغوط عليه

وتنتهي مهمة ويندوز

وبما أن البرنامج يقوم بستدعاء الدالة GetMessage

تقوم هذه الدالة بالذهاب إلى الموقع الذي خزن فية ويندوز الرسائل

فإن و جدت رسالة باسمها عادة بالقيمة التي نحن نناقش حالاتها

مارأيك أخي hasan_aljudy

(ولكن سؤال يحيرني ماهو handle وكيف يتعامل معه ويندوز)

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

بخصوص الـ handle فهي مجرد رقم, قد يكون رقم عنصر معين في مصفوفة تحتفظ مثلا بكل النوافذ .. مثلا.

مثلا تخيل ان النظام يحتفظ بمصفوفة (array) بها عدد غير محدد من العناصر.

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

اقول مثلا لانني لا اعرف التفاصيل, و لكني اتوقع انها شي مشابه لذلك.

السبب في استخدام هذه الطريقة هو ان لغة C ليست object oriented.

في اللغات الأخرى مثل Java و C#‎ فالنظام لا يعطيك handle بل يعطيك reference للـ object اللذي يمثل النافذة.

#16
اقتباس
عند انشاء نافذة جديدة, يقوم النظام بالبحث في المصفوفة عن مكان شاغر من اجل وضع النافذة الجديدة فيه, و يقوم بإعطائك رقم العنصر على انه هو الـ handle اللتي يستطيع النظام من خلالها ان يتعرف على النافذة .. مثلا.

:D :D :D

بصراحة كنت أريد أن أقول فيماسبق أن الhandle عنوان ازاحة في الذاكرة تبدأ عنده متحولات النافذة (ولكن قلت أن أتأكد من الخبير أولا :P )

اقتباس
اقول مثلا لانني لا اعرف التفاصيل, و لكني اتوقع انها شي مشابه لذلك.

المشكلة أن ما كتبته أنا أيضا أتوقع فية ما يشابه ذلك :blink:

الآن و بعد الفكرة العامة هل هناك مرجع أستطيع مراجعته لمزيد من المعلومات

شكوت لوكيع سوءحفظـي ____ فأرشدني إلى ترك المعاصي

وقال لــــي إن العــلم نـــور ____ونـور الله لا يؤتــى لعــــاصي

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

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