Помогите разобраться с описанием структур

Тема в разделе "WASM.BEGINNERS", создана пользователем Bukvoed, 10 мар 2010.

  1. Bukvoed

    Bukvoed New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2010
    Сообщения:
    3
    Вопрос вызван изучением файла kern.inc из книги Пирогова "Ассемблер для Windows" (3-е изд). В этом файле при описании шаблонов структур в полях вместо значения инициализации или знака ? стоят символьные имена, которые до того нигде не были у него определены. Например, в приведенном ниже тексте IO_TYPE_DEVICE нигде неописано.
    Трансляции данного текста MASM'ом (ml/c /coff cons.asm) , без создания файла листинга проходит нормально. При попытке транслировать с генерацией листинга (ml/c /coff /Fl cons.asm) выдается ошибка error A20006 - неизвестный символ IO_TYPE_DEVICE.
    При трансляции TASM'ом (tasm32/ml cons.asm) в любом случае (создается файл листинга или нет) выдается ошибка о недопустимой опережающей ссылке.

    Вопрос заключается в следующем - почему без генерации файла листинга MASM не замечает, что используемое символьное имя нигде до того не определено?

    .586P
    .MODEL FLAT, stdcall
    EXTERN ExitProcess@4: near
    includelib D:\MASM32\LIB\user32.lib
    includelib D:\MASM32\LIB\kernel32.lib

    _DATA SEGMENT
    pvoid typedef ptr

    my_struc STRUCT
    fwType word IO_TYPE_DEVICE
    a pvoid ?
    b dw 0
    my_struc ENDS

    my_struc1 my_struc <?>

    _DATA ENDS

    _TEXT SEGMENT
    Start:
    mov eax, 0ffffeeeeh
    mov ebx, 0ddddcccch
    mov my_struc1.fwType,bx

    mov my_struc1.b, ax
    mov my_struc1.a, eax

    push 0
    call ExitProcess@4
    _TEXT ENDS
    END Start
     
  2. Bukvoed

    Bukvoed New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2010
    Сообщения:
    3
    Разобрался с тем почему не получал сообщение об ошибке. Сам же перекрыл эту переменную при задании структуры my_struc1 my_struc <?> и не заметил этого. Теперь возник другой вопрос. Как я понимаю директива typedef предназначена для описания новых типов данных. Т.е. после записи
    Код (Text):
    1. pvoid typedef ptr
    pvoid будет эквивалентен оператору ptr. При таком описании шаблона структуры

    Первый вариант:
    Код (Text):
    1. my_struc    STRUCT
    2.     fwType word IO_TYPE_DEVICE
    3.     a ptr ?; здесь получаю сообщение об ошибке
    4.     b dw 0
    5. my_struc ENDS
    А во втором варианте

    Второй вариант:

    Код (Text):
    1. pvoid typedef ptr
    2. my_struc    STRUCT
    3.     fwType word IO_TYPE_DEVICE
    4.     a pvoid ?; трансляции проходит нормально
    5.     b dw 0
    6. my_struc ENDS
    Почему тогда во втором варианте запись
    Код (Text):
    1. a pvoid ?
    преобразуется не к строке вида
    Код (Text):
    1. a ptr ?
    , а к строке вида
    Код (Text):
    1. a dd ?
    ?
     
  3. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Это очепятка, во втором правильно a pvoid ?

    Это указатель, а директива компилятора
    Код (Text):
    1. pvoid typedef ptr
    , которая расчитывается
    во время компиляции программы, а что IO_TYPE_DEVICE так упущение автора
     
  4. Bukvoed

    Bukvoed New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2010
    Сообщения:
    3
    Тогдя я плохо представляю как работает директива typedef в MASM (TASM) (:. В Юрове (в справочнике) указано что эта директива определяет новый тип имя, которй эквивалентен типу :

    имя typedef тип
    Т.е. как я понял из этого описания, теперь вместо старого типа данных тип, можно пользоваться его новым синонимом имя. В поиске по Инету насчет описания действий директивы typedef в MASM(TASM) выдается либо та же информация, либо просто приводятся примеры с ее использованием.

    Кто-нибудь может пояснить как работаетдиректива typedef или дать ссылку где содержится описание работы этой директивы для MASM(TASM)?
     
  5. TriX

    TriX Member

    Публикаций:
    0
    Регистрация:
    7 мар 2008
    Сообщения:
    68
    \masm32\help\masm32.chm