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

[ تمت الإجابة ]مطلوب شرح للتعاليمات القفز و دورها

بدأه §0L0 في 14 يناير 2009 · 2 رد · 3,383 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سلام عليكم

المرجو درس حول تعليمات القفز و دورها

شكرا

#2

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

تعليمات القفز نوعين

شرطية unconditional jump وغير شرطية conditional jump

أو قد تسمى في بعض المراجع والردود "مشروطة" و "غير مشروطة"

الغير شرطية منها واحدة وهي JMP والتي تقوم بنقل التنفيذ إلى أي مكان تريده في البرنامج بدون أي شرط مسبق، مثال:

 

[color= #ff007f;]mov   [color= #7f7f40;]eax[color= #0000ff;],[color= #7f7f7f;]1

[color= #ff007f;]jmp    @[color= #7f7f7f;]1

[color= #ff007f;]add    [color= #7f7f40;]eax[color= #0000ff;],[color= #7f7f7f;]2

[color= #ff007f;]jmp    @[color= #7f7f7f;]2

@[color= #7f7f7f;]1[color= #0000ff;]:

[color= #ff007f;]add    [color= #7f7f40;]eax[color= #0000ff;],[color= #7f7f7f;]3

@[color= #7f7f7f;]2[color= #0000ff;]:

ستكون قيمة eax نتيجة هذا التنفيذ مساوية 4 وليس 3 لأن التنفيذ ينتقل قصرياً عند jmp @1 ويقوم بتخطي مجموعة من التعليمات التي لا يعود لها أي استخدام في هذا المثال.

هناك ثلاث أشكال من هذه التعليمة، وبشكل عام فإن جميع القفزات تبدأ من الشكل القصير لها وهو jmp الذي يسمح بالانتقال في مجال [-128,+128] ويمثله بايتين.

الشكل الثاني يمثل بثلاث بايتات يسمح لك بالانتقال في أي مكان ضمن المقطع segment الواحد والذي يتم كتابته بالشكل

jmp	near ptr label

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

jmp	far ptr label

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

أما التعليمات المشروطة فهي عديدة أذكر منها على سبيل المثال لا الحصر: JE/JZ , JNE/JNZ , JG , JGE , JA , JAE , JL , JLE, JBE , .....

هذه التعليمات يتم التحكم بها من خلال شرط مسبق فعلى سبيل المثال التعليمة JE يتم تنفيذها عندما تكون قيمة الـ ZF مساوية لـ 1، وكما تعلم فإن هذه الراية تتأثر بعمليات المقارنة مثلاً فلو أردت تستطيع أن تقوم بمقارنة قيمة مسجل مع آخر وترى إن كان هناك تطابق على سبيل المثال:

[color= #ff007f;]cmp    [color= #7f7f40;]eax[color= #0000ff;],[color= #7f7f40;]ebx

[color= #ff007f;]je    go_do_something

 

otherwise_ignore[color= #0000ff;]:

[color= #0000ff;]...

 

go_do_something[color= #0000ff;]:

[color= #0000ff;]...

عندما تتطابق قيمة eax مع ebx حينها فقط يتم تنفيذ القفزة ويتم الانتقال إلى العنوان المشار إليه باللافتة go_do_something وإلا يتم تجاهل القفز لأن الشرط غير محقق ويتم تنفيذ ما يلي أمر القفز مباشرة والذي أقوم بالإشارة إليه بـ otherwise_ignore (لا تحتاج إلى كتابة لافتة هنا وإنما وضعت للتوضيح)

جميع أوامر القفز السابقة تعمل بنفس المبدأ فهناك شرط إن تحقق يتم القفز وإلا فلا، JG مثلاً تعليمة قفز شرطية مؤشرة تقوم بمقارنة الـ src مع الـ dst فإن كان dst أكبر من src يتم القفز.

* مؤشرة بمعنى أنه يتم الاعتماد على قيمة ناتجة من ZF أو CF بحيث تكون قيمة ZF=0 أو CF=overflow.

* غير مؤشرة كمثيلتها JA بمعنى أنه يتم الاعتماد على قيمة CF=0 و ZF=0

* هناك تعليمات قفز أيضاً كاستخدام تعليمة loop

* هناك تعليمات متكافئة مثلاً ja و jnbe فالأولى قفز إن كانت القيمة أكبر (غير مؤشرة) والثانية قفز إن كانت القيمة لا تساوي وليست أصغر يعني بمعنى آخر أكبر :lol: (أيضاً غير مؤشرة)

* هناك تعليمات قفز تقوم بالتحقق من قيم الأعلام flags مباشرة مثل JC (jump on carry) و JZ (jump if zero)

يمكنك لمزيد من المعلومات المفصلة عن كل تعليمات القفز ما لها وما عليها مراجعة كتابة Art of Assembly.

السلام عليكم

1

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#3

جزاكـ الله خير

مشكوور

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

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

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

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

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