سؤال

أتذكر مرة أخرى في اليوم مع مترجم borland DOS القديم، كان بإمكانك القيام بشيء مثل هذا:

asm {
 mov ax,ex
 etc etc...
}

هل هناك طريقة شبه مستقلة للقيام بذلك الآن؟أحتاج إلى إجراء اتصال BIOS، لذا إذا كانت هناك طريقة للقيام بذلك بدون رمز ASM، فسيكون ذلك مفيدًا بنفس القدر بالنسبة لي.

هل كانت مفيدة؟

المحلول

استخدام مجلس التعاون الخليجي

__asm__("movl %edx, %eax\n\t"
        "addl $2, %eax\n\t");

استخدام VC++

__asm {
  mov eax, edx
  add eax, 2
}

نصائح أخرى

وفي دول مجلس التعاون الخليجي، هناك ما هو أكثر من ذلك.في التعليمات، عليك أن تخبر المترجم بما تغير، حتى لا يفشل مُحسِّنه.أنا لست خبيرا، ولكن في بعض الأحيان يبدو الأمر كما يلي:

    asm ("lock; xaddl %0,%2" : "=r" (result) : "0" (1), "m" (*atom) : "memory");

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

ستكون البداية الجيدة هي قراءة هذه المقالة التي تتحدث عن التجميع المضمن في C/C++:

http://www.codeproject.com/KB/cpp/edujini_inline_asm.aspx

مثال من المقال:

#include <stdio.h>


int main() {
    /* Add 10 and 20 and store result into register %eax */
    __asm__ ( "movl $10, %eax;"
                "movl $20, %ebx;"
                "addl %ebx, %eax;"
    );

    /* Subtract 20 from 10 and store result into register %eax */
    __asm__ ( "movl $10, %eax;"
                    "movl $20, %ebx;"
                    "subl %ebx, %eax;"
    );

    /* Multiply 10 and 20 and store result into register %eax */
    __asm__ ( "movl $10, %eax;"
                    "movl $20, %ebx;"
                    "imull %ebx, %eax;"
    );

    return 0 ;
}

لا تدعم برامج التحويل البرمجي التي لا تعمل بنظام x86 من Microsoft التجميع المباشر.يجب عليك تحديد الوظيفة بأكملها في ملف مصدر تجميع منفصل وتمريرها إلى المجمع.

من المستبعد جدًا أن تتمكن من الاتصال بـ BIOS ضمن نظام تشغيل في الوضع المحمي ويجب عليك استخدام أي تسهيلات متوفرة على هذا النظام.حتى لو كنت في وضع kernel، فمن المحتمل أن يكون ذلك غير آمن - فقد لا تتم مزامنة BIOS بشكل صحيح فيما يتعلق بحالة نظام التشغيل إذا قمت بذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top