Bukvoed
Интересующийся
Offline
|
|
« : 11-03-2010 13:21 » |
|
Вопрос вызван изучением файла 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 не замечает, что используемое символьное имя нигде до того не определено?
Вроде как в книгах по Ассемблеру (Юров, Зубков) при описании директив резервирования и инициализации памяти (db, dw и т.д.) говорится, что в правой части может стоять либо значение инициализации, либо знак '?' (просто резервируется память), либо может стоять символьное имя, но оно должно где-то быть определено в программе.
.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
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #1 : 11-03-2010 13:29 » |
|
Гугль говорит, что тебе нужен ntddk.inc.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Bukvoed
Интересующийся
Offline
|
|
« Ответ #2 : 11-03-2010 13:42 » |
|
Вопрос заключался немного не в этом. Я понимаю, что Пирогов свой файл kern.inc создавал на основе ntddk.inc или ему подобных. хотелось бы разобраться с синтаксисом определений данных в этих файлах. Т.е. в приведенном мной тексте программы смущает строчка: fwType word IO_TYPE_DEVICE IO_TYPE_DEVICE - это имя в программе нигде не определено, другие файлы *.inc нигде не подключаются, в то же время MASM без генерации файла листинга спокойно транслирует этот файл. Почему? Вроде бы должен выдать ошибку, что не определено символьное имя (что кстати и делает, но только в том случае если попросить сгенерировать файл листинга)
|
|
|
Записан
|
|
|
|
baldr
|
|
« Ответ #3 : 11-03-2010 13:54 » |
|
Эх, давненько не трогал я ассемблер... Насколько я помню, транслятор просто генерирует ссылку для неизвестного идентификатора, а ругаться должен уже потом линкер, поскольку нигде не найдет это имя.
|
|
|
Записан
|
Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
|
|
|
RXL
|
|
« Ответ #4 : 11-03-2010 13:59 » |
|
Bukvoed, попробуй сгенерить карту символов. С masm не работал - только с tasm - параметры подсказать не смогу.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Bukvoed
Интересующийся
Offline
|
|
« Ответ #5 : 11-03-2010 15:14 » |
|
Эх, давненько не трогал я ассемблер... Насколько я помню, транслятор просто генерирует ссылку для неизвестного идентификатора, а ругаться должен уже потом линкер, поскольку нигде не найдет это имя.
В том-то и дело что и линкер дальше не ругается не (link/SUBSYSTEM:CONSOLE cons.obj). Создается нормальный *.exe файл.
|
|
|
Записан
|
|
|
|
Bukvoed
Интересующийся
Offline
|
|
« Ответ #6 : 11-03-2010 15:35 » |
|
Bukvoed, попробуй сгенерить карту символов. С masm не работал - только с tasm - параметры подсказать не смогу.
Полробовал создать (ml/c /coff /Fm cons.asm). В результате - исходник оттранслировался в *.obj и создался файл *.lst (в котором как я понимаю Microsoft совместила и файл листинга (*.lst в TASM) и файл карты (*.map)). Но в этом файле (*.lst созданным MASM'ом) указано что имеется ошибка error A2006 - неизвестный символ. Ничего не понимаю, если ошибка то как он может сгенерить *.obj. Я, кстати, тоже с TASM в основном работал. TASM на эту программу четко ругается (без разницы генерируешь ли с объектным файлом какие-то еще или нет). Всегда выдает сообщение что нелегальная опережающая ссылка
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #7 : 11-03-2010 16:31 » |
|
Возможно есть параметр для вывода больше количества ошибок.
Собственно, программа то все равно не соберется.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Bukvoed
Интересующийся
Offline
|
|
« Ответ #8 : 11-03-2010 18:18 » |
|
Возможно есть параметр для вывода больше количества ошибок.
Собственно, программа то все равно не соберется.
Что значит не соберется? Еще раз - после того как создан *.obj (несмотря на упоминавшуюся в *.lst ошибку), компоновщик из этого *.obj генерит *.exe не выдавая никаких собщений об ошибках
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #9 : 11-03-2010 20:19 » |
|
Забавно. Интересно, какое значение подставляется...
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Bukvoed
Интересующийся
Offline
|
|
« Ответ #10 : 12-03-2010 06:05 » |
|
Ну судя по отладчику OllyDbg в это поле структуры (my_struc1.fwType) изначально подставляется 0. И что это дает?
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #11 : 12-03-2010 13:03 » |
|
Думаю, что должна быть какая-то опция, чтобы задать более жесткое поведение линкера.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Bukvoed
Интересующийся
Offline
|
|
« Ответ #12 : 13-03-2010 11:31 » |
|
Ура! Разобрался. Что называется глаз замылился (: Написав в тексте my_struc1 my_struc <?> перекрыл поле (если так можно применительно к ассемблеру выражаться) fwType с неизвестным символьным именем из шаблона. Но в этом случае возникает риторический вопрос зачем мелкомягкие дали возможность в шаблоне структур в качестве значения инициализации писать что ни поподя, надеясь на их дальнейшее перекрытие. Какое преимущество можно из этого извлечь?
|
|
|
Записан
|
|
|
|
Bukvoed
Интересующийся
Offline
|
|
« Ответ #13 : 14-03-2010 14:15 » |
|
У меня по описанию структуры был еще один вопрос. Как я понимаю директива typedef вводит просто синоним для какого-либо оператора или директивы. Т.е. после записи pvoid typedef ptr pvoid должен соответствовать оператору ptr. А запись в программе a pvoid ? вроде как должна соответсвовать записи a ptr ?, что с точки зрения синтаксиса ассемблера неверно. Т.е. если подставить прямо такую запись будет получено сообщение об ошибке. В то же время если подставить псевдоним pvoid, то программа транслируется. Почему так происходит?
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #14 : 15-03-2010 04:30 » |
|
Bukvoed, прочти свой пост и попробуй понять, что в нем написано.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Bukvoed
Интересующийся
Offline
|
|
« Ответ #15 : 15-03-2010 05:54 » |
|
Давай попробую переформулировать.
Первый вариант: my_struc STRUCT fwType word IO_TYPE_DEVICE a ptr ? - здесь получаю сообщение об ошибке b dw 0 my_struc ENDS
Второй вариант pvoid typedef ptr my_struc STRUCT fwType word IO_TYPE_DEVICE a pvoid ? - трансляции проходит нормально b dw 0 my_struc ENDS
Вроде бы во втором варианте просто через typedef определили синоним для ptr. Почему тогда в случае второго варианта трансляции происходит нормально?
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #16 : 15-03-2010 06:44 » |
|
Bukvoed, попробуй просто: a dw ?ptr - это ключевое слово для разрешения синтаксических конфликтов в довольно корявом masm-формате. Намного более логичный и однозначный синтаксис ideal. Tasm его поддерживает, а насчет masm - не знаю. Нужно это слово для разрешения таких вот конструкций: mov eax, varname mov eax, dword ptr varname
Хотя было бы логичнее соответсвенно: mov eax, [varname] mov eax, varname
|
|
« Последнее редактирование: 15-03-2010 07:44 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Bukvoed
Интересующийся
Offline
|
|
« Ответ #17 : 15-03-2010 07:34 » |
|
Ну эквивалент a pvoid ? будет не a dw ?а a dd ?MASM разумеется режим IDEAL не поддерживает. Но вопрос был вызван изучением все того же файла kern.inc из книги Пирогова. В этом файле вводятся новые типы через директиву typedef, в том числе и pvoid typedef ptr. Насколько я помню синтаксис оператора ptr, то слева от него может находится только одно из следующих значений (тип данных к которому он приводит) - byte, word, dword, qword, tbyte, near, far. Так что запись mov eax, ptr varname не корректна с точки зрения синтаксиса. Правильней mov eax, dword ptr varname Точно также некорректна запись a ptr ? О чем любезно и сообщается во время траснялции программы В то же время когда используется псевдоним pvoid введенный через директиву typedef: a pvoid ? трансляции проходит нормально. Хотя вроде бы должен выдать ошибку при трансляции (по крайней мере на мой взгляд). Почему так происходит?
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #18 : 15-03-2010 07:43 » |
|
Bukvoed, да, с dw я опечатался. Посуди сам: с точки зрения процессора, mov - это операция, а dd - ничто - это конструкция языка, не имеющая аналога в исполняемом коде. Если означает - считать dd по адресу varname и записать в eax, то может значить только - поместить при компиляции в данное место значение символа varname. Кстати, мы забыли - просто ptr не используется - нужно еще одно пояснительное слово: varname dd ? a dd offset varname
mov eax, varname mov eax, dword ptr varname
Жуткий синтаксис... Забывать стал по маленьку...
|
|
« Последнее редактирование: 15-03-2010 07:46 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Bukvoed
Интересующийся
Offline
|
|
« Ответ #19 : 15-03-2010 09:23 » |
|
Что-то я торможу (:. Со всеми твоими рассуждениями в предыдущем посте согласен. Но какое они имеют отношение к заданному вопросу. Давай по шагам. Правильна ли с точки зрения синтаксиса языка следующая конструкция помещенная в сегменте данных: a ptr ? ; переменная a до того нигде не определялась
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #20 : 15-03-2010 09:55 » |
|
Bukvoed, я о том, что в объявлении данных ptr не нужен. Или это какой-то нестандартный тип у masm?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Bukvoed
Интересующийся
Offline
|
|
« Ответ #21 : 15-03-2010 11:51 » |
|
Я бы тоже объявлял данные через директивы резервирования и инциализации (db, dw, dd и т.д.). Мой вопрос вызван просто желанием разобраться с определениями данных в файле kern.inc из книги Пирогова. В котором эти данные он исхитряется определить через оператор ptr. Хотелось бы понять логику определения, так как, наверняка, таким же образом даются определения данных и в файле ntddk.inc (и им подобных). Возвращаюсь к своему вопросу, следующее определение переменной в сегменте: a ptr ? с моей точки зрения (и транслятора)выглядит неверным. В то же время, когда мы вводим следующий тип данных через директиву typedef pvoid typedef ptr то запись a pvoid ?становится верной Почему a pvoid ? преобразуется сейчас в a dd ? , а не в a ptr ? Вот этого я не понимаю
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #22 : 15-03-2010 11:57 » |
|
Bukvoed, наверное,
a pvoid ?
==
a ptr ?
будет означать резервирование места под указатель - 4 байта на 32битной платформе
|
|
|
Записан
|
|
|
|
Bukvoed
Интересующийся
Offline
|
|
« Ответ #23 : 15-03-2010 17:06 » |
|
Bukvoed, наверное,
a pvoid ?
==
a ptr ?
будет означать резервирование места под указатель - 4 байта на 32битной платформе
Судя по результатам трансляции так оно и есть. Но хотелось бы понять логику работы транслятора. Т.е. почему все-таки он конструирует директиву вида: a dd ? Хотя вроде бы должен был создать конструкцию: a ptr ? Или я неправильно представляю как работает директивы typedef. Кто-нибудь знает как работает директива typedef ?
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #24 : 15-03-2010 19:09 » |
|
Bukvoed, думаю, что тебе нужна другая литература по этому делу, где будет детально описан сам masm.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Bukvoed
Интересующийся
Offline
|
|
« Ответ #25 : 15-03-2010 19:44 » |
|
Можешь посоветовать какие конкретно книги по masm'у можно почитать?
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #26 : 15-03-2010 21:26 » |
|
|
|
« Последнее редактирование: 15-03-2010 21:34 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|
|