Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите разобраться с описанием структур  (Прочитано 25488 раз)
0 Пользователей и 16 Гостей смотрят эту тему.
Bukvoed
Интересующийся

ru
Offline 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
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 11-03-2010 13:29 » 

Гугль говорит, что тебе нужен ntddk.inc.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Bukvoed
Интересующийся

ru
Offline Offline

« Ответ #2 : 11-03-2010 13:42 » 

Вопрос заключался немного не в этом. Я понимаю, что Пирогов свой файл kern.inc создавал  на основе ntddk.inc или ему подобных. хотелось бы разобраться с синтаксисом определений данных в этих файлах. Т.е.  в приведенном мной тексте программы смущает строчка: 
        fwType word IO_TYPE_DEVICE
IO_TYPE_DEVICE -  это имя в программе нигде не определено, другие файлы *.inc нигде не подключаются, в то же время MASM без генерации файла листинга спокойно транслирует этот файл.
Почему? Вроде бы должен выдать ошибку, что не определено символьное имя (что кстати и делает, но только в том случае если попросить сгенерировать файл листинга)
Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #3 : 11-03-2010 13:54 » 

Эх, давненько не трогал я ассемблер...
Насколько я помню, транслятор просто генерирует ссылку для неизвестного идентификатора, а ругаться должен уже потом линкер, поскольку нигде не найдет это имя.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 11-03-2010 13:59 » 

Bukvoed, попробуй сгенерить карту символов. С masm не работал - только с tasm - параметры подсказать не смогу.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Bukvoed
Интересующийся

ru
Offline Offline

« Ответ #5 : 11-03-2010 15:14 » 

Эх, давненько не трогал я ассемблер...
Насколько я помню, транслятор просто генерирует ссылку для неизвестного идентификатора, а ругаться должен уже потом линкер, поскольку нигде не найдет это имя.
В том-то и дело что и линкер дальше не ругается не  (link/SUBSYSTEM:CONSOLE cons.obj). Создается нормальный *.exe файл.
Записан
Bukvoed
Интересующийся

ru
Offline 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
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 11-03-2010 16:31 » 

Возможно есть параметр для вывода больше количества ошибок.

Собственно, программа то все равно не соберется.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Bukvoed
Интересующийся

ru
Offline Offline

« Ответ #8 : 11-03-2010 18:18 » new

Возможно есть параметр для вывода больше количества ошибок.

Собственно, программа то все равно не соберется.
Что значит не соберется?
Еще раз - после того как создан *.obj (несмотря на упоминавшуюся в *.lst ошибку), компоновщик из этого *.obj генерит *.exe не выдавая никаких собщений об ошибках 
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 11-03-2010 20:19 » 

Забавно. Интересно, какое значение подставляется...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Bukvoed
Интересующийся

ru
Offline Offline

« Ответ #10 : 12-03-2010 06:05 » 

Ну судя по отладчику OllyDbg в это поле структуры (my_struc1.fwType) изначально подставляется 0. И что это дает?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 12-03-2010 13:03 » 

Думаю, что должна быть какая-то опция, чтобы задать более жесткое поведение линкера.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Bukvoed
Интересующийся

ru
Offline Offline

« Ответ #12 : 13-03-2010 11:31 » 

Ура! Разобрался. Что называется глаз замылился (:
Написав в тексте my_struc1 my_struc <?> перекрыл поле (если так можно применительно к ассемблеру выражаться) fwType с неизвестным символьным именем из шаблона.
Но в этом случае возникает риторический вопрос зачем мелкомягкие дали возможность в шаблоне структур в качестве значения инициализации писать что ни поподя, надеясь на их дальнейшее перекрытие. Какое преимущество можно из этого извлечь? 
Записан
Bukvoed
Интересующийся

ru
Offline Offline

« Ответ #13 : 14-03-2010 14:15 » 

У меня по описанию структуры был еще один вопрос. Как я понимаю директива typedef вводит просто синоним для какого-либо оператора или директивы.
Т.е. после записи
   pvoid typedef ptr
 pvoid должен соответствовать оператору ptr.
 А запись в программе a pvoid ? вроде как должна соответсвовать записи
a ptr ?, что с точки зрения синтаксиса ассемблера неверно. Т.е. если подставить прямо такую запись будет получено сообщение об ошибке. В то же время если подставить псевдоним pvoid, то программа транслируется. Почему так происходит?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 15-03-2010 04:30 » 

Bukvoed, прочти свой пост и попробуй понять, что в нем написано. Улыбаюсь
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Bukvoed
Интересующийся

ru
Offline 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
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Интересующийся

ru
Offline 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
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #18 : 15-03-2010 07:43 » 

Bukvoed, да, с dw я опечатался.

Посуди сам: с точки зрения процессора, mov - это операция, а dd - ничто - это конструкция языка, не имеющая аналога в исполняемом коде. Если

Код:
mov eax, varname

означает - считать dd по адресу varname и записать в eax, то

Код:
a dd varname

может значить только - поместить при компиляции в данное место значение символа varname.
Кстати, мы забыли - просто ptr не используется - нужно еще одно пояснительное слово:

Код:
varname dd ?
a dd offset varname

mov eax, varname
mov eax, dword ptr varname

Жуткий синтаксис...  Какая гадасть - эта ваша заливная рыба!

Забывать стал по маленьку...
« Последнее редактирование: 15-03-2010 07:46 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Bukvoed
Интересующийся

ru
Offline Offline

« Ответ #19 : 15-03-2010 09:23 » 

Что-то я торможу (:. Со всеми твоими рассуждениями в предыдущем посте согласен. Но какое они имеют отношение к заданному вопросу. Давай по шагам. Правильна ли с точки зрения синтаксиса языка следующая конструкция помещенная в сегменте данных:
 a ptr ? ; переменная a до того нигде не определялась
 
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #20 : 15-03-2010 09:55 » 

Bukvoed, я о том, что в объявлении данных ptr не нужен.
Или это какой-то нестандартный тип у masm?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Bukvoed
Интересующийся

ru
Offline 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 ?
Вот этого я не понимаю
   
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #22 : 15-03-2010 11:57 » 

Bukvoed, наверное,

a pvoid ?

==

a ptr ?



будет означать резервирование места под указатель - 4 байта на 32битной платформе
Записан

Bukvoed
Интересующийся

ru
Offline Offline

« Ответ #23 : 15-03-2010 17:06 » 

Bukvoed, наверное,

a pvoid ?

==

a ptr ?



будет означать резервирование места под указатель - 4 байта на 32битной платформе

Судя по результатам трансляции так оно и есть. Но хотелось бы понять логику работы транслятора. Т.е. почему все-таки он конструирует директиву вида:
          a dd ?
Хотя вроде бы должен был создать конструкцию:
           a ptr ?
Или я неправильно представляю как работает директивы typedef. Кто-нибудь знает как работает директива typedef ?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #24 : 15-03-2010 19:09 » 

Bukvoed, думаю, что тебе нужна другая литература по этому делу, где будет детально описан сам masm.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Bukvoed
Интересующийся

ru
Offline Offline

« Ответ #25 : 15-03-2010 19:44 » 

Можешь посоветовать какие конкретно книги по masm'у можно почитать?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #26 : 15-03-2010 21:26 » 

http://rutracker.org/forum/search.php
http://www.google.ru/search?source=ig&hl=ru&rlz=&=&q=%D0%BA%D0%BD%D0%B8%D0%B3%D0%B8+masm&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&meta=lr%3D&aq=f&oq=

http://www.google.com/search?client=opera&rls=ru&q=masm+programmers+guide&sourceid=opera&ie=utf-8&oe=utf-8
« Последнее редактирование: 15-03-2010 21:34 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Bukvoed
Интересующийся

ru
Offline Offline

« Ответ #27 : 16-03-2010 07:17 » 

Ладно, будем искать дальше Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines