Вопрос вызван изучением файла 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
Разобрался с тем почему не получал сообщение об ошибке. Сам же перекрыл эту переменную при задании структуры my_struc1 my_struc <?> и не заметил этого. Теперь возник другой вопрос. Как я понимаю директива typedef предназначена для описания новых типов данных. Т.е. после записи Код (Text): pvoid typedef ptr pvoid будет эквивалентен оператору ptr. При таком описании шаблона структуры Первый вариант: Код (Text): my_struc STRUCT fwType word IO_TYPE_DEVICE a ptr ?; здесь получаю сообщение об ошибке b dw 0 my_struc ENDS А во втором варианте Второй вариант: Код (Text): pvoid typedef ptr my_struc STRUCT fwType word IO_TYPE_DEVICE a pvoid ?; трансляции проходит нормально b dw 0 my_struc ENDS Почему тогда во втором варианте запись Код (Text): a pvoid ? преобразуется не к строке вида Код (Text): a ptr ? , а к строке вида Код (Text): a dd ? ?
Это очепятка, во втором правильно a pvoid ? Это указатель, а директива компилятора Код (Text): pvoid typedef ptr , которая расчитывается во время компиляции программы, а что IO_TYPE_DEVICE так упущение автора
Тогдя я плохо представляю как работает директива typedef в MASM (TASM) (:. В Юрове (в справочнике) указано что эта директива определяет новый тип имя, которй эквивалентен типу : имя typedef тип Т.е. как я понял из этого описания, теперь вместо старого типа данных тип, можно пользоваться его новым синонимом имя. В поиске по Инету насчет описания действий директивы typedef в MASM(TASM) выдается либо та же информация, либо просто приводятся примеры с ее использованием. Кто-нибудь может пояснить как работаетдиректива typedef или дать ссылку где содержится описание работы этой директивы для MASM(TASM)?