سؤال

لقد كنت أتعامل مع NASM على بيئة Linux لبعض الوقت ، وقد نجحت هذه الوظيفة بشكل رائع ... لكنني الآن أتحول إلى بيئة Windows وأريد استخدام Masm (مع VS2008) لا يمكنني الحصول على هذا العمل .. .

void outportb (unsigned short _port, unsigned short _data)
{
  __asm__ __volatile__ ("outb %1, %0" : : "dN" (_port), "a" (_data));
}

عندما أكتب شيئًا كهذا ...

void outportb (unsigned short _port, unsigned short _data)
{
  asm volatile ("outb %1, %0" : : "dN" (_port), "a" (_data));
}

لم يتم التعرف على ASM وألقي خطأ في قول "سلسلة" ، كما حاولت كتابة _asm متقلبة لكنني أحصل على خطأ في قول "خطأ في بناء جملة التجميع في" OpCode "؛ وجدت" نوع البيانات ""

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

المحلول

على افتراض أنك تتحدث عن مجموعة أوامر X86 ، إليك بعض الأشياء التي يجب تذكرها:

  1. تقوم التعليمات "Outb" بإخراج بايت واحد ، والذي سيكون مكافئًا لكتابة "char" أو "char غير الموقعة" في C/C ++. لإخراج كلمة 16 بت (نظرًا لأنك تستخدم كلمة "غير موقعة قصيرة") ، يحتاج المرء إلى استخدام "Outw"
  2. بعد قولي هذا ، يوصى به Intel (ويتطلب من VS) أن تستخدم تعليمات ذاكري "Out" ويتم التعرف على حجم المنفذ من حجم المعامل. على سبيل المثال "خارج DX ، فأس"سيكون مكافئًا لـ" Outw "، بينما" Out DX ، آل"هو مكافئ لـ" Outb "
  3. في x86 ، تتطلب تعليمات "OUT" المنفذ ووضع قيمة الإخراج في (E) DX و {eax/ax/al} على التوالي. على الرغم من أن NASM قد يفعل ذلك من أجلك (ليس لدي المترجم في متناول يدي ، لذلك لا يمكنني تأكيد ذلك) ، في VS يجب عليك القيام بذلك بالطريقة التي يتم بها على مستوى وحدة المعالجة المركزية.
  4. لا يوجد سبب لتحديد الكلمة الرئيسية "المتقلبة" مع __asm. أي تعليمات تجميع مضمنة تتسبب في تعطيل المترجم

فيما يلي الرمز (على افتراض أنك تكتب إلى منفذ 16 بت):

void outportw(unsigned short port, unsigned short data)
{
    __asm  mov ax, data; 
    __asm  mov dx, port; 
    __asm  out dx, ax;
}

في حال كنت تكتب إلى منفذ 8 بت ، يجب أن يبدو الرمز هكذا:

void outportb(unsigned short port, unsigned char data)
{
    __asm  mov al, data; 
    __asm  mov dx, port; 
    __asm  out dx, al;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top