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

طلب معلومات عن تصميم المجمعات

بدأه MohamedIBrahim في 3 يوليو 2011 · 5 رد · 1,425 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

اهلا اخواني الاعزاء وجميع الاعضاء

اليوم ومن زمن اطلب طلب :cool: بنقاط يعني لكن ان شاء الله أجد ضالتي والاشياء التي أريدها

انا احتاج الى مصادر . كتب , مقالات اى شئ قد يفيد عن تصميم المجمعات او الاسمبلرات

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

اتمني من الله التوفيق للجميع

تحياتى

والله الموفق

GoodBye

#2

تمكنت من جمع بعض المعلومات التي قد تفيد

ولمن يريد الاستفادة منها

http://www.davidsalomon.name/assem.advertis/asl.pdf

كذلك ما زلت ابحث والموضوع مفتوح لمساعدتي

تم تعديل هذه المشاركة بواسطة MohamedIBrahim في 3 يوليو 2011 في 18:15

GoodBye

#3

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

يوجد كتاب إسمه Game Scripting Mastery يقوم بصناعة لغة script و vm و اسمبلر، الكتاب محتواه بسيط و يمكن فهمه بسهوله و إذا قمت ببناء اللغه و محتوياتها ستعرف كيف تبني اسمبلر يقوم بأهداف معينه.

و الله ولي التوفيق

1

مدونتي: C++ Tips and Tricks

#4
محمد علاء الدين كتب:

صناعة اسمبلر امر بسيط و ليس معضله إلا لو كان يهدف لأكثر من معماريه

أعرف انه امر بسيط لكن انا اريد صناعة مجمع محترم يصلح لآن يكون بديلا لNASM طبعا لا اهدف ابدا الى نشره ولا حتي عمل واجهة رسومية فاستعماله سيكون مقتصرا على الهدف الذي اريده منه

محمد علاء الدين كتب:

، أهم شئ فى بناء الأسمبلر يكمن فى معرفة جيده لبنية الملف التنفيذى الذى تهدف له

المشكلة تكمن فى أنني قد اكون مضطرا لعمل بنية لملفات تنفيذية جديدة فالمجمع الذي اتكلم عنه سيكون ان شاء الله فى نظام التشغيل الذي اعمل عليه (طبعا لسه بدري ) لكن مبدئيا اريد دعم عدد من بنية الملفات المهمة مثل ELF والمستخدمة بكثرة

محمد علاء الدين كتب:

يوجد كتاب إسمه Game Scripting Mastery يقوم بصناعة لغة script و vm و اسمبلر، الكتاب محتواه بسيط و يمكن فهمه بسهوله و إذا قمت ببناء اللغه و محتوياتها ستعرف كيف تبني اسمبلر يقوم بأهداف معينه.

و الله ولي التوفيق

شكرا ليك على الكتاب واذا كان لديك اى مصدر او كتاب حتي لو كان نظريا بحتا يا ريت تفيدني

وتحياتى لك

تم تعديل هذه المشاركة بواسطة MohamedIBrahim في 3 يوليو 2011 في 20:12

GoodBye

#5
اقتباس
انا اريد صناعة مجمع محترم يصلح لآن يكون بديلا لNASM

يعتمد الأسمبلر فى عمله علي مجموعه من الـ meta-data و التى تستخدم فى عملية التحقق من الـ syntax و الـ code generation، أيضا إسلوب الـ meta-data يتيح لك إضافة معماريه جديده للأسمبلر فقط بإضافتها و إليك مثال لـ x86:

لاحظ انه لايد على درايه ممتازه بالـ x86 instruction format و يمكنك مراجعتها من خلال مراجع انتل و بالتحديد Volume 2A - Chapter 2 يتكلم بالتفصيل عنها.

سنفترض أن الأسمبلر يتيح فقط كود أسمبلي صرف، بمعني لا يوجد غير تعليمات الأسمبلي و إذا اردت حجز مساحه من الـ stack ستحتاج لإستخدام المسجل ebp.

الخطوه الأولى هى بتحديد الـ meta-data للمسجل و التى تمثل اسمه و مساحته (بالبايت) و المجموعه التى ينتمي إليها:

struct reg_meta
{
   char*  reg_name; // i.e. eax, ax ...
   uint32 reg_size; // 1, 2, 4, 8, 16 ...
   uint32 reg_cate; // see REGCAT_* below
};

#define REGCAT_GP   0x1 // general purpose register
#define REGCAT_CTL  0x2 // control register
#define REGCAT_MMX  0x3 // mmx register

reg_meta reg[] = {
  {  "al", 1, REGCAT_GP },
  {  "ah", 1, REGCAT_GP },
  {  "ax", 2, REGCAT_GP },
  { "eax", 4, REGCAT_GP },
};

الخطوه التاليه هي بتحديد الـ instruction

// define information about group of instructions with same name
struct instr_group_meta
{
   uint32 igroup;  // instruction which belong to e.g. "POP", "PUSH", "MOV"...
   uint16 iclass;  // class which belong to e.g. "data transfer", "arithmetic", "control transfer"...
   uint16 ifamily; // technology which belong to e.g. "MMX", "SSE"...
   char*  iname;   // instruction name
};

// define instruction opcode information
struct instr_meta
{
    const instr_base* base; // base information of instruction
    uint64 imask;        // instruction bit pattern
    uint16 iclocks;      // number of clocks needed by instruction
    uint16 iprop;        // characteristics of instruction
    uint16 iarch;        // instruction architecture
    uint16 param1_type;  // 1st parameter type
    uint16 param2_type;  // 2nd parameter type
    uint16 param3_type;  // 3rd parameter type
    uint16 param4_type;  // 4th parameter type
};

// define prefixes used with instruction
struct instr_prefix
{
    uint32 address; // address of prefixes
    uint8  prefix1; // 1st prefix if exist, zero otherwise.
    uint8  prefix2; // 2nd prefix if exist, zero otherwise.
    uint8  prefix3; // 3rd prefix if exist, zero otherwise.
    uint8  prefix4; // 4th prefix if exist, zero otherwise.
};

// define ModR/M byte
struct instr_rm
{
    uint8 imod         : 2,
          ireg_iopcode : 3,
          irm          : 3;
};

// define SIB byte
struct instr_sib
{
    uint8 iscale : 2,
          iindex : 3,
          ibase  : 3;
};

// define information about parsed instruction
struct instr_data
{
    const instr_info* info;      // instruction information
    instr_prefix*     prefix;    // prefixes
    instr_rm*         rm;        // ModR/M
    instr_sib*        sib;       // SIB
    uint32            instr_add; // instruction address
    uint32            instr_size;// size of instruction + operands
};

#define ARCH_UNKNOWN           0x00  // unknown architecture
#define ARCH_16BIT             0x01  // 16-bit  architecture
#define ARCH_32BIT             0x02  // 32-bit  architecture
#define ARCH_64BIT             0x04  // 64-bit  architecture

#define FAMLIY_UNKNOWN          0x0000  // unknown
#define FAMLIY_GPI              0x0001  // general purpose instruction
#define FAMLIY_SYSTEM           0x0002  // system
#define FAMLIY_FPU              0x0003  // fpu
#define FAMLIY_3DNOW            0x0004  // 3d now
#define FAMLIY_MMX              0x0005  // mmx
#define FAMLIY_SSE              0x0006  // sse
#define FAMLIY_SSE2             0x0007  // sse2
#define FAMLIY_SSE3             0x0008  // sse3
#define FAMLIY_SSSE3            0x0009  // sses3
#define FAMLIY_SSE4             0x000A  // sse4
#define FAMLIY_SSE41            0x000B  // sse4.1
#define FAMLIY_SSE42            0x000C  // sse4.2
#define FAMLIY_VM               0x000D  // vm
#define FAMLIY_AES              0x000E  // aes
#define FAMLIY_FMA              0x000F  // fma
#define FAMLIY_CLMUL            0x0010  // clmul
#define FAMLIY_AVX              0x0011  // avx
#define FAMLIY_VEX              0x0012  // vex
#define FAMLIY_UNDOCUMENTED     0xFFFE  // undocumented
#define FAMLIY_INVALID          0xFFFF  // invalid

#define CLASS_NONE                    0x0000  // no class
#define CLASS_DATA_TRANSFER           0x0001  // data transfer
#define CLASS_CONTROL_TRANSFER        0x0002  // control transfer
#define CLASS_INTEGER_ARITHMETIC      0x0003  // integer arithmetic
#define CLASS_FPU_ARITHMETIC          0x0004  // FPU arithmetic
#define CLASS_BIT_OPERATION           0x0005  // bit-related operations
#define CLASS_COMPARISON              0x0006  // comparison
#define CLASS_STRING_OPERATION        0x0007  // string operation
#define CLASS_SIZE_CONVERT            0x0008  // size convert
#define CLASS_PORT                    0x0009  // port operations
#define CLASS_STATE_MANAGEMENT        0x000A  // state management
#define CLASS_REGISTER_MANAGEMENT     0x000B  // register management
#define CLASS_TASK_MANAGEMENT         0x000C  // task management
#define CLASS_SYSCALL                 0x000D  // system calls
#define CLASS_FPU                     0x000E  // FPU operation "non arithmetic operations"
#define CLASS_SIMD64                  0x000F  // SIMD 64bit operations
#define CLASS_SIMD128                 0x0010  // SIMD 128bit operations
#define CLASS_BCD_OPERATION           0x0011  // binary coded decimal oerations

لاحظ ان الكود الموجود فى هذه المشاركه هو عن كود قديم كنت كتبته لـ Assembler\Disassembler و الهدف من وضع بعض من هذه التفاصيل هو توضيح لك تفاصيل سير عمل الـ assembler.

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

mov al, ffffh ; error 'al' register requires '1' byte(s) immediate value, found '2' byte(s) immediate value

التعليمه mov لها عدة صور منها الهدف يكون reg و المصدر يكون imm و بالتالي يتم تقليل الإحتمالات إلي التالي:

MOV r8, imm8
MOV r16, imm16
MOV r32, imm32
MOV r64, imm64

و حيث ان الهدف هو المسجل al و مساحته 1 بايت لذا هذا يقلل الإحتمالات إلي أولهم و منها نعلم ان المصدر لابد ان يكون قيمه فوريه بمساحة 1 بايت و هذا يعني ان المصدر لابد ان يكون قيمه في المدي من 0 إلى ff و لكن تم إيجاد ffff و هنا تظهر لنا رسالة الخطأ الموجوده بسطر الكود.

قد يتطرق إليك السؤال عن الكيفيه التى يقوم بها الأسمبلر بالبحث عن التعليمه المناسبه بين هذا الكم الهائل من التعليمات: الإجابه عن طريق hash table تكون به كل هذه المعلومات و التى يستخدمها لتحليل الملف المدخل له.

كل الـ meta-data الخاصه بالمسجلات و التعليمات لا يتطلب لهم عمل كثير حيث إن كنت على معرفه جيده بالـ instruction format سيسهل ذلك عليك الكثير جدا. ما يتطلب العمل الكثير هو الـ parser الخاص بالـ macro و الـ semantic التي تود ان تضفها بالأسمبلر الخاص بك.

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 4 يوليو 2011 في 03:10

مدونتي: C++ Tips and Tricks

#6

شكرا على التوضيح الجميل يا محمد

GoodBye

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