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

برنامج بسيط يدمج بين السي والاسمبلي

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

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

وضعت اكواد السي لطبع رسالة بسيطة والاختيار بينهما

#include <iostream.h>

main()
{
	int x;
	cin >> x;
	switch(x)
	{
	case 1:
cout << "hi how r u";
break;
    case 2:
  cout << " im here";
  break;
	default :
  cout << " no result";
    break;
	}
return 0;
}

وهذه لطباعة رسالة اخري ولكن بالاسمبلي

        .model small
        .code
        ORG  100H 

begin:	JMP START


msg DB 'Hello, World!', 13, 10
    DB 'Please Register.', 13, 10
    DB 'Thank you!', '$'

START proc  near 
     LEA DX, msg

        MOV AH, 9
        INT 21h

        MOV AH, 4Ch
        INT 21h
start endp
      end begin

ولكن اريد ان اضع اكواد الاسمبلي مكان اكواد السي والتي هي

cout << " im here";
  break;

لكي تظهر الرسالة الخاصة بالاسمبلي مكان الرسالة im here

فكيف اعلن لدي السي بان هناك اكواد اسمبلي لكي يظهر الرسالة او ينفذ اي برنامج آخر؟

#2

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

الأخ فارس2005 يجب أن نعلم أن دمج الأسمبلي داخل كود س++ شيئ بسيط جدا ولكن يجب أن نأخد الحدر أن يكون هناك التطابق.

فمثلا حسب البرنامج الدي كتبته بلغة س++ فرغم أنه ينفد في نافدة كنسول إلا أنه يشتغل في النظام المحروس Protected Mode وفي نظام 32 بت . بينما كود الأسمبلر الدي كتبت هو للنظام الحقيقي Real Mode 16 بت .وهكدا فإن المقاطعات مثل المقاطعة التي كتبتها هي تعمل في نظام 16 بت ولا يمكن أن نستعملها في 32 بت وحاول وجربها وستلاحظ أن البروسسور سوف يغضب وسيعطينا إندار في تشغيل البرنامج.

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

إلى اللقاء.

#3

المعذرة انت لم تعطيني الارشاد الكامل

ولكن ما هو الحل ان استعمل السي بدل السي بلس بلس ام ماذا؟

كذلك كيف ادمج اي ما هي الطريقة الصحيحة في نظرك

انت اعطيتني نقطة مهمة جدا وهي اختلاف الاكواد علي حسب النظامين ولكن لم تكملها في كيفية التعامل معها اذا كان لدي سي بلس بلس واسمبلي 16 بت فارجو ان تكمل الارشاد

#4

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

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

وهنا يجب أن نفهم ما معنى النضامين وهذا سيحدد ما قيل من قبل. في النظام المحروس يمنع علينا الإتصال المباشر بأدوات الكمبيوتر وكذلك نوع الذاكرة مختلف إذ في هذا النضام ستكون عندنا الذاكرة مفطحة ويبقى مفهوم السكمنت لا معنى ولا فائدة فيه هنا . وإذا رأينا في الدوس فستلاحظ أن الذاكرة تعتمد على السكمنت في جمبع تعاملاتها ففي مثالك وفيما يخص INT 9 يجب أن يكون المسج الذي نريد كتابته في العنوان DX وأن يكون في السكمنت DS وهذا هو الأمر الصعب الذي سيكون أمامنا وهو كيف التحويل بين عنوان ذاكرة من نوع مفطح إلى نوع من السكمنت الذي يفهمه الدوس. وهنا إذا كنا مريد فعلا أن نتخذ هذا الإتجاه فيجب أن نتعامل مع Services الذي يعطيه لنا النضام مثل VMM وغيره.ولحل مشكلتك في نظام الوندوز 98 مثلا والذي أشتغل عليه هي الدخول إلى الحلقة 0 وتغيير عناوين الذاكرة باستدعاء خصائص VMM وبعد هذا الرجوع إلى البرنامج وهذه ستكون بمثابة مشقة ولا سيما إذا كنا لا نعرف مثل هذا النوع من البرمجة ولهذا قلت من قبل أنه لا داعي لكل هذا في مثل هذه الأمثلة ولهذا لم أرد أن أتكلم عنها من قبل وقلت أنها غير ممكن مباشرة.

وإذا كنت مسرا على هذا النوع من البرمجة فيجب أن نتعلم كيفية برمجة برامج من نوع VXD مثلا في الوندوز 98 أو تعلم بعض التقنيات التي تمكننا من الولوج إلى الحلقة 0 والتي تعرف بالمنطقة ذات الإمتيازات الكاملة والتي لا يمنع فيها أي شيء.

أعرف أن جوابي هذا ربما لا يكون مقنعا تماما ولهذا يجب على ما أضن أن نقوم ببعض الأمثلة في هذا الميدان حتى تتضح لنا الرؤيا وحتى نرى الإمكانيات التي نتمتع بها والقيود المفروضة علينا في الحلقة 3 وهي الحلقة التي تتعامل فيها جميع البرامج التي ننجزها عادة.

إلى اللقاء.

#5

الا يمكن ان تعطي لي مثالا بسيطا لبرنامج بلغة السي ينادي دالة بلغة الاسملبي لينفذها مع العلم انني استخدم visual c++ compiler

#6

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

سأعطيك مثالا بسيطا ولكن كلتا البرنامجين في النظامين 32 بت .

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

#include <windows.h>
#include <iostream.h>

void main()
{
	char* mess= " A test of a message";
	char* tit= " A Sample Title";
	int a,b,c;
	cout << "Enter 2 numbers please \n";
	cin >> a >>b;
	_asm
	{
  mov eax,a;
  mov ebx,b;
  add eax,b;
  mov c,eax;
	}
	cout << "The sum is : "<< c << "\n";
	HINSTANCE hand=GetModuleHandle("USER32.DLL");
	if(!hand)
  hand=LoadLibrary("USER32.DLL");
	DWORD* dw =(DWORD*)GetProcAddress(hand,"MessageBoxA");
	_asm
	{
  push 0;   // kind of message box 0= default
  push tit; //title for message box
  push mess; // the message
  push 0;  // fandle for parent 0= none
  call dw  // we call the function of messagebox wich is in user32.dll
	}
}

وأضن أن هذا المثال سيجعلك تقوم بتجارب أخرى.

إلى اللقاء.

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

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…