يوفر Zasm مكتبة مرنة وخفيفة الوزن للغاية لمعالجة وإنشاء رمز x86-64 باستخدام Zydis كواجهة خلفية. تقوم Zasm بتخزين كل شيء مثل العقد مثل التعليمات والبيانات والعلامات والأقسام وما إلى ذلك والتي توفر وسيلة لمعالجة/تحويل الكود بسهولة قبل تسلسلها إلى ثنائي. API مستوحاة من ASMJIT ، لذلك إذا كنت قد استخدمت ASMJIT قبل أن يشعر هذا مألوفًا جدًا.
كانت بعض مشاريعي تستخدم Zydis و Asmjit حيث تم فك تشفير التعليمات لأول مرة مع Zydis ثم وضعت في منشئ Asmjit للسماح بمعالجة/تحليل التعليمات/الفروع قبل إعادة ترميز/نقل الرمز المعدل ، هناك بضعة نقاط هبوط في هذا النهج الذي سيتم شرحه بشكل أكبر. قدم Zydis مؤخرًا طريقة لاستخدام نفس الهياكل/البيانات التي يتعين عليها بالفعل تشفير التعليمات التي تؤدي إلى Zasm. تهدف هذه المكتبة إلى أن تكون مجموعة/فك ترميز مستوى أعلى والتي يمكن استخدامها لمختلف أشياء مثل المثال المذكور سابقًا.
هناك فرق قوي بين Zasm و ASMJIT هو التركيز على بيانات التعليمات الدقيقة مثل الوصول إلى المعامل ، واستخدام السجل الخفي ، وعلامات وحدة المعالجة المركزية الصحيحة ، والتي يمكن أن تكون جميعها مفقودة أو خاطئة في ASMJIT مع بعض الاستثناءات بالطبع ، تهدف Asmjit إلى طريقة ودية لإنشاء رمز على الطيران للقول للنصية أو الحساب عالي الأداء. لا يحاول Zasm استبدال Asmjit بأي شكل من الأشكال ، وله أهداف مختلفة.
السبب الثاني ل Zasm هو أن تشفير Zydis يكون منخفضًا للغاية مما يعني أنه ليس لديك أشياء مثل الملصقات ، يوفر Zasm فئة عالية المستوى لتجميع التعليمات ويوفر ملصقات مثل التجميع العادي.
يستخدم Zasm Cmake بالاشتراك مع CMKR لتبسيط صيانة cmakelists.txt. يجب أن يكون المبنى سهلاً مثل استخدام الأوامر التالية من محطة في دليل الجذر:
cmake . -B build
cmake --build build --config Release
إذا كنت تريد أيضًا بناء الاختبارات
cmake . -B build -DZASM_BUILD_TESTS=ON
البرنامج هو الحاوية التي تحتوي على جميع البيانات وتعمل أيضًا كقائمة مرتبطة بشكل مضاعف. يتم تخزين التعليمات والعلامات والبيانات والأقسام وما إلى ذلك كعقد تتيح للمستخدم إزالة/إدراج/إعادة الطلب بسهولة تامة.
يوفر فئة Assembler وظائف عضو تم إنشاؤها لإنشاء تعليمات/بيانات/ملصقات في البرنامج في موضع المؤشر المحدد. لإبعاد mov rax, -1 سيكون المكافئ هو asssembler.mov(operands::rax, operands::Imm(-1));
يقوم فئة المسلسل بتسلسل عقد البرنامج إلى ثنائي ويخزن الحالة الناتجة. بعد التسلسل الناجح ، يمكن للمستخدم الاستعلام عن الكود الثنائي الناتج والبيانات مثل عنوان التسميات ومعلومات النقل وبيانات القسم وما إلى ذلك.
تدلل البيانات الثنائية في كائن التعليمات والتي يمكن استخدامها أو تخزينها مباشرة في البرنامج.
يوفر المشروع بعض الأمثلة الأساسية التي يمكن العثور عليها هنا. هناك أيضًا اختبارات مختلفة لكل ما يوفره كل من Zasm ، إذا كان هناك شيء مفقود في الاختبارات أولاً ، فهي توفر أيضًا أمثلة جيدة. إذا كان لا يزال لديك أسئلة ، فيمكنك الاتصال بنا عبر Discord.