Турбо С: руководство пользователя. Часть 2

Турбо С: руководство пользователя. Часть 2 - Стр. 47

Печать PDF
Индекс материала
Турбо С: руководство пользователя. Часть 2
Стр. 2
Стр. 3
Стр. 4
Стр. 5
Стр. 6
Стр. 7
Стр. 8
Стр. 9
Стр. 10
Стр. 11
Стр. 12
Стр. 13
Стр. 14
Стр. 15
Стр. 16
Стр. 17
Стр. 18
Стр. 19
Стр. 20
Стр. 21
Стр. 22
Стр. 23
Стр. 24
Стр. 25
Стр. 26
Стр. 27
Стр. 28
Стр. 29
Стр. 30
Стр. 31
Стр. 32
Стр. 33
Стр. 34
Стр. 35
Стр. 36
Стр. 37
Стр. 38
Стр. 39
Стр. 40
Стр. 41
Стр. 42
Стр. 43
Стр. 44
Стр. 45
Стр. 46
Стр. 47
Стр. 48
Стр. 49
Стр. 50
Стр. 51
Стр. 52
Стр. 53
Стр. 54
Стр. 55
Стр. 56
Все страницы
     манду  DW (резервировать слово),  в то время как другие - DD (ре-          
     зервировать двойное слово), что определяет размер результирующего          
     указателя.  Числовые и текстовые константы определяются как обыч-          
     но.                                                                        
                                                                                
          Переменные определяются так же, как константы. Если вы хоти-          
     те получить переменные, которые не инициализированы определенными          
     значениями,  вы можете объявить их в _BSS-сегменте, поставив воп-          
     росительный знак (?) там, куда вы потом поместите переменные.              
                                                                                
                                                                                
                                                                                
                                                                                

                         - 385,386 -
                                                                                
            Определение глобальных и внешних идентификаторов                    
     -----------------------------------------------------------------          
                                                                                
          Создание вами модуля не принесет большого успеха до тех пор,          
     пока ваша программа на Турбо Си не будет знать, какие функции она          
     может вызывать и на какие переменные может ссылаться. Кроме того,          
     вам  может потребоваться возможность вызывать функции Турбо Си из          
     подпрограмм,  написанных на ассемблере или ссылаться на  перемен-          
     ные, объявленные в Турбо Си.                                               
                                                                                
          Чтобы освоить  эти  возможности,  вам  нужно  разобраться  в          
     трансляторе и компоновщике Турбо Си.  Когда вы объявляете внешний          
     идентификатор,  транслятор  автоматически  ставит  перед ним знак          
     подчеркивания (_) до его сохранения в объектном модуле. Это озна-          
     чает,  что  вы  должны  поставить  знак подчеркивания перед любым          
     идентификатором в вашем ассемблеровском модуле, к которому вы хо-          
     тите получить доступ из программы на Си.  К Паскаль-идентификато-          
     рам обращение идет иначе, чем к идентификаторам Си, - они исполь-          
     зуют   только   верхний   регистр   и   не   снабжаются  символом          
     подчеркивания.                                                             
                                                                                
          Знак подчеркивания для идентификаторов Си  необязателен,  он          
                                                                                
     устанавливается  по умолчанию(on). Он может быть отключен (off) с          
     помощью опции командной строки -u-. Однако, если  вы  используете          
     стандартные библиотеки Турбо Си, то столкнетесь с проблемами, ес-          
     ли  только  вы  не переделали эти библиотеки. (Чтобы сделать это,          
     вам понадобится другой продукт Турбо Си - исходный текст программ          
     для  библиотек  поддержки;   контактируйте   с   фирмой   Borland          
     International для получения более подробной информации.)                   
                                                                                
          Если любая asm-программа в исходном файле ссылается на любой          
     Си-идентификатор  (данные  или  функции), то такие идентификаторы          
     должны начинаться со знака подчеркивания.                                  
                                                                                
          Турбо Ассемблер  (TASM) не чувствителен к регистру,  другими          
     словами,  когда вы транслируете программу с языка ассемблера,  то          
     все  идентификаторы сохраняются только в заглавных символах.  Ис-          
     пользование в TASM опции /mx переводит его в режим  "чувствитель-          
     ности регистра" для внешних указателей.  Компоновщик Турбо Си де-          
     лает то же  самое  с  помощью  идентификатора  extern,  т.о.  эти          
     моменты хорошо совпадают.  Вы можете заметить, что в наших приме-          
     рах ключевые слова и директивы записаны в верхнем регистре, а все          
     другие  идентификаторы и коды команд - в нижнем (строчными симво-          
     лами);  это совпадает со стилем,  предлагаемым в  руководстве  по          

                         - 387,388 -
                                                                                
     TASM. Однако, вы вольны использовать все заглавные (или строчные)          
     или любые смешанные идентификаторы, как вам удобно.                        
                                                                                
          Для того чтобы сделать идентификаторы (имена  подпрограмм  и          
     переменных) видимыми извне вашего ассемблерного модуля, вам нужно          
     объявить их как PUBLIC.                                                    
                                                                                
          Так, например,  если вы написали модуль, имеющий целые функ-          
     ции  max  и  min и целые переменные MAXINT,lastmax и lastmin,  вы          
     должны вставить в него оператор                                            
                                                                                
          PUBLIC _max,_min                                                      
                                                                                
     в ваш программный сегмент, а операторы                                     
                                                                                
          PUBLIC  _MAXINT, _lastmax, _lastmin                                   
          _MAXINT  DW 32767                                                     
          _lastmin DW 0                                                         
          _lastmax DW 0                                                         
                                                                                
     в сегмент данных.                                                          
                                                                                
                                                                                
                    Порядок вызова Турбо Си из .ASM                             
     -----------------------------------------------------------------          
                                                                                
          Для того чтобы созданный вами модуль на ассемблере мог обра-          
     щаться к функциям и переменным,  объявленным в программе на Турбо          
     Си, используйте оператор EXTRN.                                            
                                                                                
                                                                                
                        Указатели на функции                                    
     -----------------------------------------------------------------          
  нужно  использовать          
     размер наиболее часто встречающегося в структуре элемента.                 
                                                                                
          Т.о., если ваша Си-программа имела глобальные переменные              
                                                                                
          int i, jarray [10];                                                   
          char ch;                                                              
          long result;                                                          
                                                                                
     то вы  можете сделать их доступными в вашем модуле с помощью сле-          
     дующего оператора:                                                         
                                                                                
          EXTRN _i:WORD,_jarray:WORD,_ch:BYTE,_result:DWORD                     
                                                                                
          И последнее важное замечание. Если вы используете модель па-          
     мяти  huge,  то операторы EXTRN должны появляться вне любого сег-          

                         - 391,392 -
                                                                                
                                                                                
     мента. Это применимо как к процедурам, так и к переменным.                 
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                  Создание подпрограмм на ассемблере                            
     -----------------------------------------------------------------          
                                                                                
          Теперь вы знаете,  каким образом все должно быть определено,          
     и настало время ознакомиться,  как вообще записываются функции на          
     ассемблере.  Здесь необходимо рассмотреть несколько важных момен-          
     тов:  передача параметров,  возвращаемые значения и соглашения по          
     регистрам.                                                                 
                                                                                
          Предположим, вы хотите написать функцию min, которая, как вы          
     полагаете, имеет следующий прототип в Си:                                  
                                                                                
          int extern min(int v1, int v2);                                       
                                                                                
          Вы хотите, чтобы функция min вернула минимальную из двух пе-          
     реданных ей величин. В общем виде запись функции min будет: