سؤال

لماذا تصريحات الهيكل في التجميع تختلف عن تلك الموجودة في وثائق 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؟
مساعدة ، أنا مرتبك.

تحرير: هنا رابط البرنامج التعليمي الذي كنت أشير إليه:

iczelion's Win32 ASM Tutorial 3

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

المحلول

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

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