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

هل يمكن كتابة تعليمات أسمبلي في السي شارب؟

مغلق
بدأه X-Ware في 8 يونيو 2007 · 11 رد · 1,220 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

هل يمكن كتابة تعليمات أسمبلي في السي شارب؟

وشكرا

في البداية يسخرون منك . . . ثم يهملونك . . . ثم يحاربونك . . . ثم تنتصر

#2

السلام عليكم

بإمكانك وضع هذه التعليمات في مكتبة ديناميكية dllوإستدعائها في الكود سي شارب

#4

أخي hazzoom

المثل يقول إسأل المجرب و ماتسأل الطبيب :D

#5

أخي العزيز Ben_Laiid هل لك أن تشرح لي كيفية وضع التعليمات في ملف DLL؟؟؟

والأخ hazzoom هل يمكن كتابة تعليمات أسمبلي في فيجوال بيسك كونك(مشرف في قسم Visual Basic .NET)؟؟؟؟

ولكم مني جزيل الشكر؟؟؟

في البداية يسخرون منك . . . ثم يهملونك . . . ثم يحاربونك . . . ثم تنتصر

#7

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

#8

السلام عليكم

أخي بإمكانك أن تستعمل المثال التالي:

extern "C" __declspec(dllexport) int __stdcall getCPUSpeed() 
{
	LARGE_INTEGER ulFreq, ulTicks, ulValue, ulStartCounter, ulEAX_EDX, ulResult;

	// it is number of ticks per seconds
	QueryPerformanceFrequency(&ulFreq);

	// current valueofthe performance counter
	QueryPerformanceCounter(&ulTicks);

	// calculate one second interval
	ulValue.QuadPart = ulTicks.QuadPart + ulFreq.QuadPart;

	// read time stamp counter
	// this asm instruction load the highorder 32 bit of the register into EDX
	// and the lower order 32 bits into EAX
	_asm {
		rdtsc
		mov ulEAX_EDX.LowPart, EAX
		mov ulEAX_EDX.HighPart, EDX
	}

	// start no of ticks
	ulStartCounter.QuadPart = ulEAX_EDX.QuadPart;

	// loop for 1 second
	do {
		QueryPerformanceCounter(&ulTicks);
	} while (ulTicks.QuadPart <= ulValue.QuadPart);

	// get the actual no of ticks
	_asm {
		rdtsc
		mov ulEAX_EDX.LowPart, EAX
		mov ulEAX_EDX.HighPart, EDX
	}

	// calculate result
	ulResult.QuadPart = ulEAX_EDX.QuadPart - ulStartCounter.QuadPart;

	return (int)ulResult.QuadPart / 1000000;
}

التعليمة التالية تحدد بها أن هذه الدالة التي عرفتها في المكتبة سيتم إستدعائها لاحقا من كود خارجي

extern "C" __declspec(dllexport) int __stdcall MyMethodName()

وكما ترى هنا الكود بلغة الآلة يضف في جزء مستقل تبدأه ب _asm

_asm {
		rdtsc
		mov ulEAX_EDX.LowPart, EAX
		mov ulEAX_EDX.HighPart, EDX
	}

يبقى أن تتأكد جيدا من كيفية تمرير البيانات بين السي و السي شارب وعادة أحبذ إستعمال النوع CStringلإيجابياته الكثيرة

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

#9

لقد نسيت بقية السؤال :D

كي تنشأ ملف:

1. في الفيزوال سي إختر New Project/ Others languages/Visual C++ / Win32

2. ثم إختر نوع المشروع Win32 project و أكتب إسم المكتبة التي تريد إنشائها OK/Next/DLL

أعني بالرمز "/" الإختيار الموالي

في نهاية هذه المراحل ستفتح لك نافذة المشروع وداخلها الكود التالي:

// MyDLL.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"


#ifdef _MANAGED
#pragma managed(push, off)
#endif

BOOL APIENTRY DllMain( HMODULE hModule,
					   DWORD  ul_reason_for_call,
					   LPVOID lpReserved
					 )
{
	return TRUE;
}

#ifdef _MANAGED
#pragma managed(pop)
#endif

دع هذا الكود كما هو وأضف الدوال إثر هذا الكود.

عندما تنقر ويتم تنفيذ الكود بنجاح ستجد المكتبة في المجلد bin/Debug

في الخدمة إذا كانت لك أسئلة أو إستفسارات طبعا بقدر ما أعلم

#10

أشكر جميع الأخوة الذين شاركو في هذا الموضوع

سبب هذا السؤال هو أنني أجرب عملية Decompilation على برامج فيجوال بيسك و البرنامج الذي استخدمه يعطي تعليمات أسمبلي أريد استخدامها في برنامج سي شارب

أعتقد أن هذا أجاب على سؤالي شكرا ثانية لكم جميعا

هذا هو موقع البرنامج :

www.vb-decompiler.org

و أرجو من الله إعانتي و إعانتكم على فعل الخير

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

في البداية يسخرون منك . . . ثم يهملونك . . . ثم يحاربونك . . . ثم تنتصر

#11

شكراً Ben_Laiid

ولكن كيف ذلك بدون ++Visual C ? اقصد بواسطة المفكرة و ومترجم السي CL

وكيفية كتابة commandline لـ Win32

مواضيع متنوعة

#12

السلام عليكم

هذه المراحل اللازمة:

1.

post-91400-1181552286_thumb.jpg

2.

post-91400-1181552361_thumb.jpg

3. هذا الكود الذي يضاف تلقائيا

post-91400-1181552398_thumb.jpg

الآن أضف الكود السابق الذي وضعته كمثال في آخر الكود الذي يضيفه الفيزوال تلقائيا ثم أنقر F6. ستتم الترجمة بنجاح وستجد المكتبة MyDLL في المجلد Bin/Debugالتابع لمشروعك

الآن أنسخ تلك المكتبة في المجلدC:\WINNT\system32 أو دC:\windows\system32لحاسوبك (حسب نظام التشغيل الذي تمتلكه)

4.

الآن أنشأ مشروع جديد وأضف المجال:

using System.Runtime.InteropServices;

هذا المجال يهتم أساسا بالتصرف في إستدعاء المكتبات الخارجية

5. إستدعي مكتبتك والدالة التي عرفتها فيها كما يلي:

[DllImport("MyDLL.dll")]
public static extern int getCPUSpeed();

6. وهكذا تحصل على مخرجات الدالة التي وضعت فيها التعليمات بلغة الآلة:

MessageBox.Show(getCPUSpeed().ToString());

من الأفضل التأكد جيد من عمل الدوال التي عرفتها في المكتبة عبر تجربتها في مشروع سي من نوعConsole Application ثم تقم "بتعليبها" في المكتبة dll

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

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

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

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

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

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