أمثلة على استخدام التجميع في دلفي
-----أيضا طالبة في السنة الثانية، على غرار المثال السابق. هاها، البرنامج كان فوضوي بعض الشيء عندما كتبته، أرجو أن تسامحيني :).
يعد استخدام التجميع للبرمجة الهجينة في دلفي أمرًا مريحًا بشكل غير عادي. بهذه الطريقة، عندما ترغب في اكتساب الكفاءة، يمكنك اختيار التجميع، ولكن بالنسبة لمعظم الأعمال، لا تزال تستمتع براحة البرمجة المرئية والموجهة للكائنات. في لغة دلفي، باستخدام مقطع برنامج asm...end لكتابة جزء كود التجميع، يمكن استدعاء متغيرات اللغة عالية المستوى في مقطع كود التجميع؛ ما تحتاج إلى الاهتمام به هو حماية متغيرات تسجيل معينة، و ثم، بعض التفاصيل ودوس التجميع أدناه مختلف. انظر إلى هذا المثال.
لنتحدث عن بعض المعرفة العامة أولاً:
1. هناك طريقتان لاستدعاء التجميع في دلفي.
تماما مثل---
الإجراء TForm1.DrawRain;
فار
x1,y1,x2,y2,d,i:عدد صحيح;
يبدأ // يبدأ برنامج دلفي
لأني:=0 إلى 100 افعل
يبدأ
x1:=random(537);
y1:=random(280);
د:=عشوائي(7);
asm//يبدأ التجميع المضمن
ادفع اكس
موف إيكس،x1
المحور الفرعي، د
موف X2، إياكس
موف إيكس، y1
أضف اكس، د
موف Y2، إياكس
البوب اكس
end;;//نهاية التجميع المضمن
مرات:=مرات+1؛
drawLine2(x1,y1,x2,y2,clmedGray);
انتظر()؛
إذا (i div 2)=0 ثم drawLine2(x1,y1,x2,y2,clwindow);
نهاية؛
النهاية؛ // ينتهي برنامج دلفي
هناك طريقة أخرى لإزالة البداية الخارجية...النهاية والدخول مباشرة إلى التجميع من خلال asm...end.
الإجراء TForm1.Wait();
asm//يبدأ التجميع المضمن
ادفع اكس
موف اكس،0
@حلقة:
أضف اكس،1
cmp إيكس، 1000000
jnz @loop
البوب اكس
end;// نهاية التجميع المضمن
2. استخدم متغيرات دلفي في التجميع
إذا نظرت إلى مثال الكود الأول، فمن السهل أن تفهم:
asm//يبدأ التجميع المضمن
ادفع اكس
mov eax,x1 //x1 هو متغير دلفي محلي، يستخدم كقيمة هنا
المحور الفرعي، د
mov x2,eax //x2 هو متغير دلفي محلي ويستخدم أيضًا كعنوان للذاكرة
موف إيكس، y1
أضف اكس، د
موف Y2، إياكس
البوب اكس
end;;//نهاية التجميع المضمن
3. تفاصيل مختلفة للتجميع
لن أقوم بنشر الأمثلة، فلنقارنها بأنفسنا.
@حلقة:
//...
jnz @loop
بالإضافة إلى ذلك، قد لا تكون معظم مقاطعات int متاحة، ولم أجرّبها، ولم أر أي معلومات عنها. من يعرف الرجاء ارسال لي رسالة؟ شكرا لكم مقدما.
فيما يلي مثال أكبر لتأثير الرسوم المتحركة. لأنني بدأت للتو في تعلم هذه المعرفة في الماضي، كانت تجربتي صعبة للغاية. إنه مشهد هطول أمطار مستمرة في غابة صغيرة --- هناك العديد من المشاكل أبرزها أنه أولا وقبل كل شيء، لا يتم استخدام تعليمات النقطة العائمة (سأرفق أمثلة اختبارية لتعليمات النقطة العائمة لتجربتها لاحقا) )، لم تكن بعض الخوارزميات معروفة في ذلك الوقت، وكانت النتيجة صورة رتيبة إلى حد ما. ثانيًا، لم يكن التنسيق بين المشهد جيدًا بما فيه الكفاية، على سبيل المثال، لم تكن الأشجار محمية بشكل فعال وتم "إزهارها" لاحقًا بسبب المطر :).
ولكنني لا أزال أعطي مثالاً، لا تضحك علي. أولاً، ليس لدي الوقت لكتابة أمثلة في هذا المجال. ثانياً، إذا تعلمت كيفية استخدام التجميع في دلفي، فلا يزال من الممكن أن تشرح بعض المشاكل. علاوة على ذلك، يتم تجنب هذا التطبيق في المواد العامة أحيانًا في بعض البرامج المتقدمة، ولكن إذا كنت تريد إتقانه، فيجب عليك في الغالب أن تمارسه بنفسك. هذا المثال يمكن أن يعلمك الكثير :).
الوحدة 1؛
واجهة
الاستخدامات
النوافذ، الرسائل، SysUtils، المتغيرات، الفئات، الرسومات، عناصر التحكم، النماذج،
مربعات الحوار، ExtCtrls، القوائم، ExtDlgs، FileCtrl، StdCtrls، ComCtrls، ImgList؛
يكتب
TForm1 = الفئة (TForm)
القائمة الرئيسية 1: القائمة الرئيسية؛
ملف 1: TMenuItem؛
Exit1: TMenuItem;
N1: TMenuItem;
Help1: TMenuItem;
About1: TMenuItem;
g1: TMenuItem;
Spring1: TMenuItem;
Summer1: TMenuItem;
الخريف1: TMenuItem;
Winter1: TMenuItem;
StatusBar1: TStatusBar;
ext1: TMenuItem;
Timer1: TTimer؛
إجراء Exit1Click(Sender: TObject);
الإجراء About1Click(Sender: TObject);
إجراء Spring1Click(Sender: TObject);
الإجراء FormCreate(Sender: TObject);
الإجراء Summer1Click(Sender: TObject);
الإجراء الخريف 1 انقر (المرسل: TObject)؛
الإجراء Winter1Click(Sender: TObject);
الإجراء ext1Click(Sender: TObject);
خاص
الإجراء DrawLine1(x1,y1,x2,y2:عدد صحيح;icolor:TColor);// x2>x1 و y2>y1
الإجراء DrawLine2(x1,y1,x2,y2:integer;icolor:TColor);// x2<x1 and y2>y1
إجراء DrawLine3(x1,y1,x2,y2:عدد صحيح;iColor:TColor);// x1=x2 أو y1=y2
الإجراء DrawRain؛
الإجراء DrawTree(x,y,height:integer);
الإجراء Timer1Timer(sender:TObject);
رسم الإجراء واضح؛
الإجراء انتظر () ؛
{تصريحات خاصة}
عام
{التصريحات العامة}
نهاية؛
فار
Form1: TForm1؛
مرات:واحدة؛
تطبيق
يستخدم Unit3، Unit5؛
{$R *.dfm}
الإجراء TForm1.Wait();
asm
ادفع اكس
موف اكس،0
@حلقة:
أضف اكس،1
cmp إيكس، 1000000
jnz @loop
البوب اكس
نهاية؛
الإجراء TForm1.DrawLine1(x1,y1,x2,y2:integer;iColor:TColor);
const i:integer=1;
فار j,k1,k2,d:عدد صحيح;
يبدأ
إذا ((x2-x1)<=0)أو ((y2-y1)<=0) ثم اخرج؛
من أجل j:=0 إلى (x2-x1) افعل
يبدأ
form1.Canvas.Pen.Color:=icolor;
form1.Canvas.Ellipse(x1,y1,x1+2,y1+2);
form1.Canvas.Ellipse(x1-1,y1-1,x1+1,y1+1);
إذا ((x2-x1)=0)أو ((y2-y1)=0) ثم اخرج؛
asm
ادفع اكس
com.pushebx
com.pushecx
ادفع إدكس
موف إي إكس، 0
موف إيكس، ×2
المحور الفرعي،x1
موف إبكس، y2
إبكس الفرعي، y1
موف د، إبكس
موف إدكس،0
شعبة د
موف K2، إياكس
موف إيكس، y2
الفرعية إيكس، y1
موف إبكس،x2
إبكس الفرعي،x1
موف د، إبكس
موف إدكس،0
شعبة د
موف K1، إياكس
موف إيكس،x1
@ حلقة 2:
إضافة إياكس، ط
شركة إيكس
كمبيككس، k2
جي بي @loop2
موف X1، إياكس
موف إيكس، y1
@ حلقة 1:
إضافة إياكس، ط
com.incecx
كمبيككس، ك1
جي بي @loop1
موف Y1، إياكس
إدكس البوب
popecx
البوب إبكس
البوب اكس
نهاية؛
النهاية؛// نهاية ل
نهاية؛
الإجراء TForm1.DrawLine2(x1,y1,x2,y2:integer;icolor:TColor);
const i:integer=1;
فار j,k1,k2,d:عدد صحيح;
يبدأ
إذا ((x1-x2)<=0)أو ((y2-y1)<=0) ثم اخرج؛
من أجل j:=0 إلى (x1-x2) افعل
يبدأ
form1.Canvas.Pen.Color:=icolor;
form1.Canvas.Ellipse(x1,y1,x1+2,y1+2);
form1.Canvas.Ellipse(x1-1,y1-1,x1+1,y1+1);
إذا ((x1-x2)=0)أو ((y2-y1)=0) ثم اخرج؛
asm
ادفع اكس
com.pushebx
com.pushecx
ادفع إدكس
موف إي إكس، 0
موف إيكس،x1
المحور الفرعي،x2
موف إبكس، y2
إبكس الفرعي، y1
موف د، إبكس
موف إدكس،0
شعبة د
موف K2، إياكس
موف إيكس، y2
الفرعية إيكس، y1
موف إبكس،x1
إبكس الفرعي،x2
موف د، إبكس
موف إدكس،0
شعبة د
موف K1، إياكس
موف إيكس،x1
@ حلقة 2:
الفرعية إيكس، ط
com.incecx
كمبيككس، k2
جي بي @loop2
موف X1، إياكس
موف إيكس، y1
@ حلقة 1:
إضافة إياكس، ط
com.incecx
كمبيككس، ك1
جي بي @loop1
موف Y1، إياكس
إدكس البوب
popecx
البوب إبكس
البوب اكس
نهاية؛
النهاية؛// نهاية ل
نهاية؛
الإجراء TForm1.DrawLine3(x1,y1,x2,y2:integer;icolor:TColor);
فار ي: عدد صحيح؛
يبدأ
إذا ((x2-x1)<>0) و((y2-y1)<>0) ثم اخرج؛
إذا (x2-x1)=0 إذن
من أجل j:=0 إلى (y2-y1) افعل
يبدأ
form1.Canvas.Pen.Color:=icolor;
form1.Canvas.Ellipse(x1-1,y1-1,x1+1,y1+1);
إذا (y2-y1)=0 ثم اخرج؛
asm
ادفع اكس
موف إيكس، y1
Inc
موف Y1، إياكس
البوب اكس
نهاية؛
نهاية // نهاية ل
آخر لـ j:=0 إلى (x2-x1) افعل
يبدأ
form1.Canvas.Pen.Color:=icolor;
form1.Canvas.Ellipse(x1-1,y1-1,x1+1,y1+1);
إذا (x2-x1)=0 ثم اخرج؛
asm
ادفع اكس
موف إيكس،x1
Inc
موف X1، إياكس
البوب اكس
نهاية؛
النهاية؛// نهاية ل
نهاية؛
الإجراء TForm1.Timer1Timer(sender:TObject);
يبدأ
نهاية؛
الإجراء TForm1.DrawRain؛
فار
x1,y1,x2,y2,d,i:عدد صحيح;
يبدأ
لأني:=0 إلى 100 افعل
يبدأ
x1:=random(537);
y1:=random(280);
د:=عشوائي(7);
asm
ادفع اكس
موف إيكس،x1
المحور الفرعي، د
موف X2، إياكس
موف إيكس، y1
أضف اكس، د
موف Y2، إياكس
البوب اكس
نهاية؛
مرات:=مرات+1؛
drawLine2(x1,y1,x2,y2,clmedGray);
انتظر()؛
إذا (i div 2)=0 ثم drawLine2(x1,y1,x2,y2,clwindow);
نهاية؛
نهاية؛
الإجراء TForm1.DrawTree(x,y,height:integer);
فار
x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,d1: عدد صحيح;
يبدأ
asm
ادفع اكس
com.pushebx
com.pushecx
ادفع إدكس
تحرك الفأس، الارتفاع
موف إدكس،0
موف إي إكس، 2
divecx
موف د1، إياكس
موف إيكس،x
موف إبكس، ذ
المحور الفرعي، الارتفاع
موف X1، إياكس
ebx الفرعي، الارتفاع
موف y1، إبكس
أضف الفأس والارتفاع
المحور الفرعي،5
ebx الفرعي، الارتفاع
موف X2، إياكس
موف Y2، إبكس
موف إيكس،x
إضافة اكس،3
ebx الفرعي، الارتفاع
موف X3، إياكس
موف Y3، إبكس
إضافة اكس،8
إضافة إبكس، الارتفاع
موف X4، إياكس
موف Y4، إبكس
أضف الفأس والارتفاع
المحور الفرعي،5
إضافة إبكس، الارتفاع
موف X5، إياكس
موف Y5، إبكس
إدكس البوب
popecx
البوب إبكس
البوب اكس
نهاية؛
DrawLine2(x3,y3,x2-d1,y2,clcream);
DrawLine1(x3,y3,x4+d1,y4,clcream);
drawline3(x2-d1,y2,x2,y2,clcream);
drawline3(x4,y4,x4+d1,y4,clcream);
DrawLine2(x2,y2,x1,y1,clcream);
DrawLine1(x4,y4,x5,y5,clcream);
DrawLine2(x2+2,y2,x1,y1+2,clcream);
DrawLine1(x4-2,y4,x5,y5+2,clcream);
drawline3(x1,y1,x5,y5,clcream);
drawline3(x1,y1-1,x5,y5-1,clcream);
drawline3(x,y5,x,y,clcream);
drawline3(x,y,x+5,y,clcream);
drawline3(x+5,y5,x+5,y,clcream);
form1.Canvas.Brush.Color:=clgreen;
form1.Canvas.FloodFill(x,y1-5,clcream,fsBorder);
form1.Canvas.FloodFill(x+2,y-5,clcream,fsBorder);
نهاية؛
الإجراء TForm1.Exit1Click(Sender: TObject);
يبدأ
يغلق؛
نهاية؛
الإجراء TForm1.About1Click(Sender: TObject);
يبدأ
form3.Show;
نهاية؛
الإجراء TForm1.Spring1Click(Sender: TObject);
فار ط، ك، ي: عدد صحيح؛
يبدأ
StatusBar1.Panels[1].text:='ربيع العاصفة...';
form1.Canvas.Brush.Color:=clwindow;
form1.Canvas.FloodFill(1,1,clred,fsBorder);
لأني:=0 إلى 10do
يبدأ
ك:=عشوائي(10);
ي:=عشوائي(10);
ي:=-ي;
drawTree(10+k*50,300+j*20,20);
نهاية؛
لأني: = 0 إلى 10 افعل
يبدأ
form1.Canvas.Brush.Color:=clwindow;
form1.Canvas.FloodFill(1,1,clgreen,fsBorder);
drawRain;
نوم(100);
نهاية؛
نهاية؛
الإجراء TForm1.FormCreate(Sender: TObject);
يبدأ
مرات:=0;
form1.canvas.Brush.Color:=clwindow;
form1.caption:=form1.caption+' الرجاء تحديد Pictype!... ';
نهاية؛
الإجراء TForm1.drawClear؛
فار ط،ك:عدد صحيح؛
يبدأ
form1.Canvas.Brush.Color:=clblack;
form1.Canvas.FloodFill(15,15, clcream, fsBorder);
لأني: = 0 إلى 5 افعل
يبدأ
ك:=عشوائي(300);
DrawLine3(20+k,1,20+k,307,clyellow);
DrawLine3(200+k,1,200+k,307,clyellow);
نهاية؛
نهاية؛
الإجراء TForm1.Summer1Click(Sender: TObject);
يبدأ
drawClear;
form1.Canvas.Font.Color:=clblue;
form1.Canvas.Font.Size:=18;
form1.canvas.textOut(150,150,'المحيط الأخضر...وقت الراحة^_^!');
//DrawTree;
نهاية؛
الإجراء TForm1.Autumn1Click(Sender: TObject);
يبدأ
drawClear;
form1.Canvas.Font.Color:=clblue;
form1.Canvas.Font.Size:=18;
form1.canvas.textOut(150,150,'الأوراق الحمراء والجبال العطرة...تستريح^_^!');
نهاية؛
الإجراء TForm1.Winter1Click(Sender: TObject);
//var i,x,y:integer;
يبدأ
drawClear;
form1.Canvas.Font.Color:=clblue;
form1.Canvas.Font.Size:=18;
form1.canvas.textOut(150,150,'فيل شمع الثعبان الفضي... لم يفتح بعد^_^!');
نهاية؛
الإجراء TForm1.ext1Click(Sender: TObject);
يبدأ
form5.Show;
نهاية؛
نهاية.
فيما يلي برنامج الاختبار المرفق باستخدام تعليمات الفاصلة العائمة، ولم يحقق الإصدار الأصلي التأثير :):
// اطلب من المكتبة التحقق :)
الإجراء Tform1.xx؛
فار
xmax,ymax,x,y,a,b:single;
ط، ض: عدد صحيح؛
يبدأ
أ:=2.0;ب:=10.0;
xmax:=image1.Width;
ymax:=image1.Height;
لأني:=0 إلى image1.Width يفعل
يبدأ
asm
//.80x87
com.finit
fld xmax // ادفع xmax في st (0)
فديف أ
fchs //دع st(0)=-st(0)
بدعة i //st(0)=st(0)+i
fdiv ب //st(0)=st(0)/b
fstp x // ضع st(0) في x بدون فرقعة
س
فمول x
com.fchs
فد يماكس
//frndint
// فابس
fstp ذ
نهاية؛
x:=(i-xmax/2)/10;
y:=-x*x+ymax;
ض:=trunc(z);
image1.canvas.Ellipse(i-1,trunc(y)-1,i+1,trunc(y)+1);
//image1.Canvas.Pixels[x,y];
نهاية؛
نهاية؛
اخترت إحدى العمليات، هاها، مضحك.
يمكنك أيضًا أخذ أغراضك ومشاركة تجربتك، وأنا على استعداد للاستماع :).
لو سمحت----