zloi7777
							
								Постоялец 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 «  : 21-04-2010 09:35 »   | 
								
								 | 
							  
							 
							Как в Си задать аналог ассемблернной строчки: ASM: call [pword _test] ... public _test	 _test	label	 proc	    _test_off	dd	0			;32-bit offset    _test_seg	dw	0140h			;16-bit selector Си: ? Для 32-х битного адреса все просто ASM: call [dword _test] ... public _test	 _test	label	 proc	    _test_off	dd	0			;32-bit offset Си: extern "C" void (*test)(void); ... test(); Но как сишному компилятору сказать что функция test имеет 48-ми битный адрес???  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Dimka
							
								Деятель 
								Команда клуба
								
								 
								  Offline
								Пол:   
								
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #1 : 21-04-2010 10:41 »   | 
								
								 | 
							  
							 
							Какой компилятор, какая целевая процессорная платформа? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел) 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							zloi7777
							
								Постоялец 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #2 : 21-04-2010 11:31 »   | 
								
								 | 
							  
							 
							Borland (CodeGear) bcc32 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Антон (LogRus)
							
						 | 
						
							
								  | 
								
									
									 « Ответ #3 : 22-04-2010 03:03 »   | 
								
								 | 
							  
							 
							1. какая-то неувязочка Borland (CodeGear) bcc32
  и Но как сишному компилятору сказать что функция test имеет 48-ми битный адрес???
  2. как данные public _test     _test   label    proc       _test_off    dd      0                       ;32-bit offset    _test_seg    dw      0140h                   ;16-bit selector связаны с вызовом  call [dword _test] или call [pword _test] 3. и моё самое любимое:)  Зачем? Что ты с этого получишь и зачем пытаться перехитрить компилятор? PS: не долгое гугление привело нас сюда  http://www.codenet.ru/progr/cpp/4/r77_1.phpвсё подробно расписано (поищи в тексте фразу "Объявление ближних или дальних функций ") да и вообще всё это для старого доброго доса и реального режима, как это связано с защищённым режимом не понятно  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 22-04-2010 03:56 от Алексей1153++ »
								 | 
								
									 
									Записан
								 | 
							  
							 
							Странно всё это.... 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Алексей++
							
								глобальный и пушистый 
								Глобальный модератор
								
								 
								  Offline
								
								Сообщений: 13
								
								
								
								
								
							  
						 | 
						
							
								  | 
								
									
									 « Ответ #4 : 22-04-2010 03:57 »   | 
								
								 | 
							  
							 
							LogRus, с форматированием был косячок - я поправил 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							zloi7777
							
								Постоялец 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #5 : 22-04-2010 04:48 »   | 
								
								 | 
							  
							 
							3. и моё самое любимое:)  Зачем? Что ты с этого получишь и зачем пытаться перехитрить компилятор? PS: не долгое гугление привело нас сюда  http://www.codenet.ru/progr/cpp/4/r77_1.phpвсё подробно расписано (поищи в тексте фразу "Объявление ближних или дальних функций ") да и вообще всё это для старого доброго доса и реального режима, как это связано с защищённым режимом не понятно    Я как раз и использую защищенный режим, и 48-ми битная адресация функции нужна для межсигментного вызова в защищенном режиме. 2. как данные Цитата: zloi7777 от Вчера в 08:35 Код: (asm) public _test	 _test	label	proc	    _test_off	dd	0			;32-bit offset    _test_seg	dw	0140h			;16-bit selector связаны с вызовом  call [dword _test] или call [pword _test] В данных описан адрес функции. 1. какая-то неувязочка в чем? компилятор Borland Builder C++.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							resource
							
								Молодой специалист 
								
								 
								  Offline
								Пол:   
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #6 : 22-04-2010 06:23 »   | 
								
								 | 
							  
							 
							А где про такое написано? Можно ссылку (или название книги)? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Антон (LogRus)
							
						 | 
						
							
								  | 
								
									
									 « Ответ #7 : 22-04-2010 06:37 »   | 
								
								 | 
							  
							 
							я про программировании защищенного режима 0, так что пара вопросов В данных описан адрес функции.
  т.е. функция на этапе кодирования знает свой адрес? не всё ли ей равно, как её вызывают (говорим про stdcall, не fastcall), дёрнул ret и был таков? Алексей1153++, спасибо.    
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Странно всё это.... 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							zloi7777
							
								Постоялец 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #8 : 22-04-2010 06:52 »   | 
								
								 | 
							  
							 
							т.е. функция на этапе кодирования знает свой адрес? не всё ли ей равно, как её вызывают (говорим про stdcall, не fastcall), дёрнул ret и был таков? Это указатель на функцию. Я в первом посте про это написал.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Антон (LogRus)
							
						 | 
						
							
								  | 
								
									
									 « Ответ #9 : 22-04-2010 07:10 »   | 
								
								 | 
							  
							 
							ах, вот оно что. так вот в C++ указатели всегда одного размера 32 бита (на x86), этого вполне достаточно для покрытия всего адресного пространства и дополнительных 16 бит тут не нужно.
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Странно всё это.... 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							zloi7777
							
								Постоялец 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #10 : 22-04-2010 07:19 »   | 
								
								 | 
							  
							 
							ах, вот оно что. так вот в C++ указатели всегда одного размера 32 бита (на x86), этого вполне достаточно для покрытия всего адресного пространства и дополнительных 16 бит тут не нужно. Его достаточно для работы в пределах одного сегмента ( короткий переход ), для вызова функции из другого сегмента надо 48 бит: 32 (как при коротком переходе ) это смещение и 16 селектор сегмента.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							resource
							
								Молодой специалист 
								
								 
								  Offline
								Пол:   
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #11 : 22-04-2010 07:23 »   | 
								
								 | 
							  
							 
							Ну походу никак такое не сделаешь. Напиши inline функцию или максрос и всё 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Антон (LogRus)
							
						 | 
						
							
								  | 
								
									
									 « Ответ #12 : 22-04-2010 07:29 »   | 
								
								 | 
							  
							 
							быыырррр
  ладно вернём к главному вопросу, какая цель иметь длинные переходы, какую задачу ты решаешь?
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Странно всё это.... 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							zloi7777
							
								Постоялец 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #13 : 22-04-2010 07:35 »   | 
								
								 | 
							  
							 
							Ну походу никак такое не сделаешь. Напиши inline функцию или максрос и всё енто понятно и написано    , но выглядин не так красиво....  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							resource
							
								Молодой специалист 
								
								 
								  Offline
								Пол:   
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #14 : 22-04-2010 07:36 »   | 
								
								 | 
							  
							 
							LogRus, он видимо хочет переключить задачу в защищенном режиме
  zloi7777, нормально выглядит. Если пишешь такие вещи, то без ассемблера полюбому не обойтись. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 22-04-2010 07:37 от resource »
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							zloi7777
							
								Постоялец 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #15 : 22-04-2010 07:44 »   | 
								
								 | 
							  
							 
							ладно вернём к главному вопросу, какая цель иметь длинные переходы, какую задачу ты решаешь? шлюз вызова, сегмент задачи ( прога под свою ос)  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							resource
							
								Молодой специалист 
								
								 
								  Offline
								Пол:   
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #16 : 22-04-2010 07:51 »   | 
								
								 | 
							  
							 
							zloi7777, какой формат исполняемых файлов в "своей" ОС ? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 22-04-2010 07:54 от resource »
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							zloi7777
							
								Постоялец 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #17 : 22-04-2010 07:59 »   | 
								
								 | 
							  
							 
							 Если пишешь такие вещи, то без ассемблера полюбому не обойтись. ясен пень    все написано и работает, осдалось оформить хедер файл для кончного пользования, которы будит писать свои проги на Си используя указатели на мои функции..., и тут встала затыка в указателях на 48бит.   понятно что можно написать: #define test_cpp() asm { call [PWORD PTR test_asm] }   с параметрами чуть страшнее. Или написать функция на ассемблере, но это лишнии операции и размер.   
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							zloi7777
							
								Постоялец 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #18 : 22-04-2010 08:00 »   | 
								
								 | 
							  
							 
							 какой формат исполняемых файлов в "своей" ОС ? exe (PE)  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							resource
							
								Молодой специалист 
								
								 
								  Offline
								Пол:   
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #19 : 22-04-2010 08:05 »   | 
								
								 | 
							  
							 
							Переключать задачи должна только ОС. Программам это не нужно (нельзя) делать. PE ? Что PE лодер написал? Уже целую ОС наверное сделал... ну что-то PE уж какой-то чисто виндовый формат. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							zloi7777
							
								Постоялец 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #20 : 22-04-2010 08:15 »   | 
								
								 | 
							  
							 
							Переключать задачи должна только ОС. Программам это не нужно (нельзя) делать. PE ? Что PE лодер написал? Уже целую ОС наверное сделал... ну что-то PE уж какой-то чисто виндовый формат. шлюзы вызова, вызова функций ядра из ring0. a PE,там с бесяток полей нужны, а дальше простое копирование. а bcc32 - компилятор тоже виндовый  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							resource
							
								Молодой специалист 
								
								 
								  Offline
								Пол:   
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									«  Ответ #21 : 22-04-2010 08:43 »    | 
								
								 | 
							  
							 
							Обрывками фраз разговаривать это как-то некрасиво, и что самое главное - не понятно. И оверквотинг всё таки нехорошее дело 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Serg79
							
						 | 
						
							
								  | 
								
									
									 « Ответ #22 : 22-04-2010 15:32 »   | 
								
								 | 
							  
							 
							Я как раз и использую защищенный режим, и 48-ми битная адресация функции нужна для межсигментного вызова в защищенном режиме.
  Ты правильно сказал что для дальнего вызова требуется помимо смещения указать селектор нового сегмента. В твоих примерах на ассемблере я не увидел и намека на присутствие селекторов в вызовах подпрограмм. Если ты делаешь вид что разбираешься в данной теме и говоришь что реализовал основной функционал ядра, то должен знать что на данный момент нет актуальных компиляторов языка 'C' которые поддерживали бы создание программы для защищенного режима с использованием нескольких сегментов как кода так и данных. Скажу больше, не один современный и актуальный компилятор языка 'C' даже не пытается оперировать, если конечно не прибегать к помощи ассемблерных вставок, сегментными регистрами микропроцессора. Это все о x86 архитектуре.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Serg79
							
						 | 
						
							
								  | 
								
									
									 « Ответ #23 : 22-04-2010 15:33 »   | 
								
								 | 
							  
							 
							ИМХО, тему лучше перенести в "Ассемблер", здесь мало что к "С" относиться. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							sss
							
								Специалист 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #24 : 23-04-2010 00:26 »   | 
								
								 | 
							  
							 
							Скажу больше, не один современный и актуальный компилятор языка 'C' даже не пытается оперировать, если конечно не прибегать к помощи ассемблерных вставок, сегментными регистрами микропроцессора. 
  Serg79, надо уточнить однако... Он, компилятор, считает что для кода используется селектор cs, для данных ds, стека ss... Если человек создал код ОС создающий и управляющий процессами (!) - я вообще проблемы не вижу. Просто, примерно как в windows, использовать линейную модель при переводе процессора в защищенный режим: настроить GDT так, что все селекторы пусть ссылаются на один и тот же дескриптор и ВСЁ.  Ещё вариант -  межсегментный вызов это обращение к сервисной функции ОС ? Ну тогда вызов через обработчик прерывания ( 0x2E например)... Или "библиотека - заглушка" вызывающая прерывание... P.S.:  zloi7777,  интересно, подкачка страниц тоже реализована? А переключение задач?  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 23-04-2010 01:11 от sss »
								 | 
								
									 
									Записан
								 | 
							  
							 
							 while (8==8)  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							zloi7777
							
								Постоялец 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #25 : 23-04-2010 05:47 »   | 
								
								 | 
							  
							 
							Ещё вариант -  межсегментный вызов это обращение к сервисной функции ОС ? Ну тогда вызов через обработчик прерывания ( 0x2E например)... Или "библиотека - заглушка" вызывающая прерывание... Я какраз и пытался обойтись без "библиотека - заглушка", но как видно несудьба...   интересно, подкачка страниц тоже реализована? А переключение задач? подкачка страниц - нет (из флеш уж больно медленно это все делать    ), переключение задач - да Ты правильно сказал что для дальнего вызова требуется помимо смещения указать селектор нового сегмента. В твоих примерах на ассемблере я не увидел и намека на присутствие селекторов в вызовах подпрограмм. в самом первом посте - _test_seg Если ты делаешь вид что разбираешься в данной теме и говоришь что реализовал основной функционал ядра, то должен знать что на данный момент нет актуальных компиляторов языка 'C' которые поддерживали бы создание программы для защищенного режима с использованием нескольких сегментов как кода так и данных. Скажу больше, не один современный и актуальный компилятор языка 'C' даже не пытается оперировать, если конечно не прибегать к помощи ассемблерных вставок, сегментными регистрами микропроцессора. Это все о x86 архитектуре. Но вот пока несталкнулся с данной проблемой незнал я этого       
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							sss
							
								Специалист 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #26 : 23-04-2010 06:04 »   | 
								
								 | 
							  
							 
							zloi7777, так как с тем, что бы использовать линейную адресацию? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							 while (8==8)  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							zloi7777
							
								Постоялец 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #27 : 23-04-2010 06:18 »   | 
								
								 | 
							  
							 
							zloi7777, так как с тем, что бы использовать линейную адресацию? как раз от нее и пытаюсь отойти, при линейной все просто и быстро, и проблем с сишными компилятовами нет, но защита при этом хромает.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							sss
							
								Специалист 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #28 : 23-04-2010 06:20 »   | 
								
								 | 
							  
							 
							так и подумал... 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							 while (8==8)  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							sss
							
								Специалист 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #29 : 23-04-2010 06:33 »   | 
								
								 | 
							  
							 
							zloi7777, а если заглушка cpp файл, создаваемый разработчиками ОС, внедряемый в каждый проект? Не надо париться с загрузчиком exe... Я так понимаю, адреса функций железно задаются? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 23-04-2010 06:36 от sss »
								 | 
								
									 
									Записан
								 | 
							  
							 
							 while (8==8)  
						 | 
					 
				 
			 |  
		 
	 | 
	 |