سلام عليكم
المرجو درس حول تعليمات القفز و دورها
شكرا
سلام عليكم
المرجو درس حول تعليمات القفز و دورها
شكرا
وعليكــم السـلام ورحمة الله وبركاتـه..
تعليمات القفز نوعين
شرطية 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.
السلام عليكم
Do as I say, not as I do
We are Anonymous. We are Legion. We don't forgive. We don't forget
جزاكـ الله خير
مشكوور
المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية
جارٍ التحقق من المتواجدين…