помощь по win32 api в сборке - PullRequest
       6

помощь по win32 api в сборке

4 голосов
/ 29 января 2010

почему объявления структур в ассемблере отличаются от описаний в документации API Win32 (я работаю с c ++ и пробую свои силы в языке ассемблера)

например, я получил этот прототип функции из учебников Айзелиона (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" в моей автономной версии документации win32 api объявлена ​​как ....

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 только вопреки тому, что есть в документации по win32 api?
Я использую неправильные документы или что? и если я могу кто-нибудь опубликовать мне ссылку для скачивания документации по WIN32 API, предназначенной для программистов asm?
Помогите, запутался.

Отредактировано : Вот ссылка на учебник, к которому я обращался:

Учебник aszelion по win32 asm 3

Ответы [ 7 ]

7 голосов
/ 29 января 2010

DWORDS - это 32-битный тип в 32-битных окнах, как и все типы в C-версии структуры. Поэтому они совместимы.

5 голосов
/ 29 января 2010

Язык ассемблера не имеет типов - DWORD и другие ключевые слова просто указывают количество байтов, которые должны быть зарезервированы для конкретной сущности. Фактически, поскольку DWORD и его двоюродные братья не представляют коды операций / мнемонику, они действительно являются особенностями макропроцессора.

Типы C / C ++, как и типы других языков, ограничены такими правилами, как endian-ness, куда идет символьный бит, что возможно приведение, преобразование и присвоение и т. Д. Предоставленная вами версия структуры C более конкретна, чем версия на ассемблере, но совместима.

4 голосов
/ 29 января 2010

Размер всех этих различных типов C - DWORD. Сборка НЕ ​​является строго типизированной - все, что она знает о каждой переменной, это количество байтов.

2 голосов
/ 29 января 2010

В одно время (16-битные Windows) эти типы имели разные размеры.Во время перехода на 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

В этом случае ассемблер будет знать, что он должен обрабатывать его как указывающий на байт без явного указания этого каждый раз.

1 голос
/ 31 января 2010

Фактически, MASM 6+ поддерживает форму ввода, так что вы можете иметь свою структуру в MASM аналогичную той, которая есть в C. Но сначала вам придется воссоздать иерархию типов, и вы скоро заметите Преимущества печатания с помощью MASM так или иначе ограничены (уже там, сделали это). Я предлагаю вам Google PDF-файл справочного руководства для программиста MASM 6: в нем довольно четко объясняются полезности «HLL» в MASM, включая набор текста, и приводится ряд примеров. Одна копия, кажется, доступна по ссылке ниже, но есть и другие, плавающие вокруг.

http://www.microlab.teipat.gr/upload/arxeshy/Microsoft_MASM_Programmers_Guide_v6.zip

1 голос
/ 30 января 2010

В сборке, независимо от того, имеет ли структура высокого уровня указатели или целые числа, реальность такова, что связанные с ними типы данных высокого уровня имеют BYTE, WORD и DWORD, в вашем случае все структуры 32-битные, следовательно, DWORD ( СЛОВО 16 бит, DWORD 32 бит). Не вводите в заблуждение, думая, что структура в сборке отличается от структуры в C, она очень похожа. Ассемблер имеет примитивные типы данных, независимо от указателей, структур и т. Д., Что отличает их от способа загрузки в регистр (в зависимости от синтаксиса):

mov eax, dword ptr [bx]

Этот пример на ассемблере демонстрирует загрузку регистра eax со значением, на которое указывает регистр bx, фактически то же самое, что и

int bx = 5;
int *eax;
ptr = &bx;

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

1 голос
/ 29 января 2010

WNDPROC, UINT и т. Д. Определены в заголовках C, поэтому прямой эквивалент ASM отсутствует. Все они имеют размеры DWORD в 32-битных системах, поэтому в этом учебном пособии создается рабочий код.

...