مساعدة في API Win32 في التجميع
سؤال
لماذا تصريحات الهيكل في التجميع تختلف عن تلك الموجودة في وثائق API Win32. (أنا قادم من C ++ وأحاول يدي في لغة التجميع)
على سبيل المثال ، حصلت على هذه النموذج الأولي من دروس IceZelion (Tutorial3)
WNDCLASSEX STRUCT DWORD
cbSize DWORD ?
style DWORD ?
lpfnWndProc DWORD ?
cbClsExtra DWORD ?
cbWndExtra DWORD ?
hInstance DWORD ?
hIcon DWORD ?
hCursor DWORD ?
hbrBackground DWORD ?
lpszMenuName DWORD ?
lpszClassName DWORD ?
hIconSm DWORD ?
WNDCLASSEX ENDS
مرحبًا ، انتظر ... أعلم أن هيكل "WNDClassex" ، في الإصدار غير المتصل بالإنترنت من وثائق API Win32 ، تم إعلانها باسم ....
typedef struct _WNDCLASSEX { // wc
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX;
لماذا يستخدم إصدار ASM DWORD فقط على عكس ما هو في وثائق API WIN32؟
هل أستخدم المستندات الخاطئة أم ماذا؟ وإذا كان بإمكان شخص ما نشره لي رابط تنزيل لوثائق API Win32 مخصصة لمبرمجي ASM؟
مساعدة ، أنا مرتبك.
تحرير: هنا رابط البرنامج التعليمي الذي كنت أشير إليه:
المحلول
Dwords عبارة عن نوع 32 بت على النوافذ 32 بت ، وكذلك جميع الأنواع في الإصدار C من الهيكل. وبالتالي فإن الاثنين متوافقان.
نصائح أخرى
لغة التجميع لا تحتوي على طباعة - DWORD والكلمات الرئيسية الأخرى تشير فقط إلى عدد البايتات التي يجب حجزها لكيان معين. في الواقع ، نظرًا لأن DWORD وأبناء عمومها لا يمثلون الرموز المفرطة/mnemonics ، فهي حقًا ميزات للمعالج المسبق الكلي.
أنواع C/C ++ ، مثل تلك الموجودة في اللغات الأخرى ، مقيدة بموجب قواعد مثل Endian-Ness ، حيث تسير بتات الإشارة ، وما هي القوالب والمحولات والواجبات الممكنة ، وما إلى ذلك. نسخة لغة التجميع ، لكنها متوافقة.
حجم كل هذه أنواع C المختلفة هو DWORD. لا يتم كتابة التجميع بقوة - كل ما يعرفه عن كل متغير هو عدد البايتات.
في وقت واحد (نوافذ 16 بت) كانت لهذه الأنواع أحجام مختلفة. أثناء الترحيل إلى Win32 ، انتهى بهم المطاف كأنواع بيانات 32 بت. على هذا النحو ، أ DWORD
متوافق معهم جميعًا ، إلى حد ما على الأقل.
على عكس الاعتقاد الشائع ، فإن لغة التجميع (أو على الأقل يمكن) لها أنواع وحتى سلامة من النوع العادل. على سبيل المثال فقط ، فكر في ما يحدث عندما تفعل شيئًا مثل:
mov lpszMenuName[ecx], 0
مع lpszMenuName
تم تعريفها على أنها أ DWORD
, ، لن يقبل المجمع هذا ، لأن "0" يمكن أن يكون byte
, ، أ word
, ، أ dword
أو (في عالم 64 بت) أ qword
. لجعلها تعمل ، يجب عليك إضافة (بشكل أساسي) من النوع:
mov byte ptr lpszMenuName[ecx], 0
لذلك يعرف المجمع أنك تريد كتابة بايت واحد. بدلاً من ذلك ، يمكنك تحديد lpszMenuName
كما:
lpszMenuName ptr byte
في هذه الحالة ، سيعرف المجمع أنه يجب أن يعامله على أنه يشير إلى بايت دون أن يذكر صراحة أنه في كل مرة.
يتم تعريف wndproc ، uint ، وما إلى ذلك ، في رؤوس C ، لذلك لا يوجد أي exmivilent مباشرة. كلها كميات بحجم DWORD على أنظمة 32 بت ، وهذا هو السبب في أن هذا البرنامج التعليمي ينتج رمز العمل.
في التجميع ، بغض النظر عما إذا كان للهيكل ذي المستوى العالي مؤشرات أو ints ، فإن الواقع هو أن أنواع البيانات ذات المستوى العالي المرتبطة بها هي من البايت والكلمة والمواد الدائرية ، في حالتك ، هي البنية كلها 32 بت وبالتالي dword (الكلمة هي 16bit ، Dword هو 32bits). لا تتضلل إلى التفكير في أن الهيكل في التجميع يختلف عن الهيكل في C ، فهو نفسه إلى حد كبير. يحتوي Assembler على أنواع بيانات بدائية ، بغض النظر عن المؤشرات والهياكل وما إلى ذلك ، ما يميزها عن بعضها هو كيفية تحميله في سجل (اعتمادًا على بناء الجملة):
mov eax, dword ptr [bx]
عينة التجميع هذه عبارة عن دليل على تحميل eax
سجل مع القيمة التي أشار إليها bx
تسجيل ، نفس الشيء بشكل فعال مثل
int bx = 5; int *eax; ptr = &bx;
أتمنى أن يساعد هذا ، مع أطيب التحيات ، توم.
في الواقع ، يدعم Masm 6+ شكلاً من أشكال الكتابة ، لذلك يمكن أن يكون لديك هيكلك في MASM مما يشبه تلك التي لديك في C. ولكن يجب عليك إعادة إنشاء التسلسل الهرمي أولاً ، وستلاحظ قريبًا أن فوائد من الكتابة مع Masm محدودة بطريقة ما (كانت هناك ، القيام بذلك). أقترح عليك Google The Masm 6 Programmer PDF ملف PDF: إنه يشرح بوضوح الأشياء الجيدة "HLL" في MASM ، بما في ذلك الكتابة ، ويتضمن عددًا من الأمثلة. يبدو أن نسخة واحدة متوفرة في الرابط أدناه ، ولكن هناك آخرون يطفوون حولها.
http://www.microlab.teipat.gr/upload/arxeshy/microsoft_masm_programmers_guide_v6.zip