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 »
								 | 
								
									 
									Записан
								 | 
							  
							 
							... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С. 
						 | 
					 
				 
			 |  
		 
	 | 
	| 
		
		
	 | 
	 |