مشكلة التحويل: __asm__ __volatile__
-
21-09-2019 - |
سؤال
لقد كنت أتعامل مع 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 ، إليك بعض الأشياء التي يجب تذكرها:
- تقوم التعليمات "Outb" بإخراج بايت واحد ، والذي سيكون مكافئًا لكتابة "char" أو "char غير الموقعة" في C/C ++. لإخراج كلمة 16 بت (نظرًا لأنك تستخدم كلمة "غير موقعة قصيرة") ، يحتاج المرء إلى استخدام "Outw"
- بعد قولي هذا ، يوصى به Intel (ويتطلب من VS) أن تستخدم تعليمات ذاكري "Out" ويتم التعرف على حجم المنفذ من حجم المعامل. على سبيل المثال "خارج DX ، فأس"سيكون مكافئًا لـ" Outw "، بينما" Out DX ، آل"هو مكافئ لـ" Outb "
- في x86 ، تتطلب تعليمات "OUT" المنفذ ووضع قيمة الإخراج في (E) DX و {eax/ax/al} على التوالي. على الرغم من أن NASM قد يفعل ذلك من أجلك (ليس لدي المترجم في متناول يدي ، لذلك لا يمكنني تأكيد ذلك) ، في VS يجب عليك القيام بذلك بالطريقة التي يتم بها على مستوى وحدة المعالجة المركزية.
- لا يوجد سبب لتحديد الكلمة الرئيسية "المتقلبة" مع __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;
}
لا تنتمي إلى StackOverflow