تقييم الموضوع :
  • 6 أصوات - بمعدل 3.17
  • 1
  • 2
  • 3
  • 4
  • 5
Handling Debug Registers
#2
صاحب التعليق الاصلي : AnasD في 30-08-2008, 09:30 AM
شكراً اخ GamingMasteR على الدرس القيم
"< رغم ندرة مشاركاتي بس اتمنى تعتبروني صديق >"
انا في عندي سؤالين
الاول بشأن الكود اخي

if ((context.Dr6 & (1 << 0))) //hwbp #1

واضح انه لمعرفة فيما إذا كان hwbp #1 هو الذي حدث ام لا وذلك من خلال Dr6 ... جميل جداً, بس مشكلتي انني لست مبرمج بلغة ++C لذلك لم افهم تركيب جملة الشرط هذه .
اتمنى لو انه في توضيح حتى اتمكن من كتابة جملة الشرط للـ hwbp #3 و #4
السؤال الثاني إذا ما في غلبة
لدي برنامج قمت بصطياد السيريال لمساره على جهازي - يعتمد السيريال على القرص الموجود عليه البرنامج -
حاولت اقوم بتنفيذ هذا الدرس عليه بس في مشكلة وهي كيف يمكنني الحصول على محتوى ST0 عند النقطة المحدده في الصوره - بالمرفقات-.
#### على فكره انا لم افهم ما تقوم به هذه التعليمات (FADD , FCOMP , FSTSW ) لكن لاحظة ان ( FADD , FSTP , FLD) تؤثر على ST0 والتعليمة FCOMP تقوم بالمقارنة.
إذا اتمكنت من انشاء اللودر سأضعة مثال في هذا الموضوع
وشكراً


صاحب التعليق الاصلي : GamingMasteR في 30-08-2008, 11:12 AM
السلام عليكم.
إقتباس :اتمنى لو انه في توضيح حتى اتمكن من كتابة جملة الشرط للـ hwbp #3 و #4

كما ذكرت سابقاً فإن اول 4bit في مسجل Dr6 هو الذي يحدد أي HWBP حدث , يعني اذا كان اول بت = 1 فان اول HWBP حدث واذا ثاني بت = 1 فان ثاني HWBP حدث وهكذا ..
 
if ((context.Dr6 & (1 << 0)))

هذا الكود يقوم باختبار قيمة البت الأول (رقم صفر) لمعرفة اذا كان اول HWBP حدث , يمكن تغيير 0 الى رقم البت المراد اختباره , مثلا لاختبار البت الثالث (رقم 2) :
 
if ((context.Dr6 & (1 << 2)))

----------------------------
إقتباس :على فكره انا لم افهم ما تقوم به هذه التعليمات (FADD , FCOMP , FSTSW ) لكن لاحظة ان ( FADD , FSTP , FLD) تؤثر على ST0 والتعليمة FCOMP تقوم بالمقارنة.

هذه التعليمات خاصة بمعالج الـFPU وهو مخصص للتعامل مع الاعداد العشرية والكبيرة , يحتوي على عدة مسجلات 8 منهم لحفظ الارقام طول كل واحد منهم 10 بايت وهي تمثل من ST0 الى ST7 .
يمكن اصطياد قيم هذه المسجلات بنفس الطريقة السابقة , هناك عنصر في الـCONTEXT structure اسمه FloatSave وهو عبارة عن structure من النوع FLOATING_SAVE_AREA وتركيبته كالتالي :

 
struct {
    DWORD   ControlWord;
    DWORD   StatusWord;
    DWORD   TagWord;
    DWORD   ErrorOffset;
    DWORD   ErrorSelector;
    DWORD   DataOffset;
    DWORD   DataSelector;
    BYTE    RegisterArea[80];
    DWORD   Cr0NpxState;
} FLOATING_SAVE_AREA;

يحتوي هذا التركيب على المسجلات الخاصة بالـFPU ومنهم مسجلات الـST كلها تحت اسم RegisterArea وهي مصفوفة تتكون من 80 بايت (اي عدد الـST * طول كل واحد منهم) .
بالمناسبة هذه الأرقام تركيبها ليس كتركيب الارقام الصحيحة مثل DWORD-int-integer بل لها تركيبات خاصة ,, يمكنك تحويلها الى نص عن طريق احد دوال الـtext formatting مثل printf مع وضع الـformat للرقم "f%" , السلام عليكم .

---------------------------
صاحب التعليق الاصلي : MouradPr في 03-10-2008, 09:44 PM
ياعم وين حق الأسمبلي من الموضوع... البارحة كانت لي أول محاولة بالأسمبلي لأضع الدرس Serie API 3 أحببت أن أضيف هذه الطريقة لكني لم أفلح في وضع نقطة التوقف وذلك بسبب البنيات التي أضفت
DR7 و RegFlag
هل يمكن ان تتكرم وتقدم مساعدة بالأسمبلي..

صاحب التعليق الاصلي : GamingMasteR في 03-10-2008, 10:49 PM
للأسف هذه البنيات(التي بها bits) لابد من التعامل معها في الاسمبلي على انها DWORD ويتم التحقق من الـbit المراد عن طريق and/test .

صاحب التعليق الاصلي : GamingMasteR في 04-10-2008, 12:54 PM
أجدع كود اسمبلي لأجدع مراد في الدنيا Big Grin
shift و and و or وكل اللي قلبك يحبه


الملفات المرفقة
.rar   DbgLoader_asm.rar (الحجم : 41.7 KB / التحميلات : 45)
سبحان الله وبحمده، سبحان الله العظيم
أعضاء أعجبوا بهذه المشاركة : M!X0R


الردود في هذا الموضوع
Handling Debug Registers - بواسطة mhmod - 23-10-2018, 06:31 PM
RE: Handling Debug Registers - بواسطة Gu-sung18 - 17-11-2018, 12:28 AM

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 3 ) ضيف كريم