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

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

Печать 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
Все страницы
                                                                                
     - регистры SI и DI могут часто использоваться аналогично  регист-          
       рам общего назначения.  Кроме того, их используют как индексные          
       регистры.  В Турбо Си их также используют как регистровые пере-          
       менные;                                                                  
                                                                                
                                                                                
     - регистр SP указывает на текущую вершину стека и является смеще-          
       нием относительно стекового сегмента;                                    
                                                                                
     - регистр BP является вторичным указателем стека,  обычно исполь-          
       зуется для индексирования при поиске параметров, передаваемых в          
       стеке.                                                                   
                                                                                
          Базовый индексный регистр (BP) используется  в  функциях  Си          
     как базовый адрес для аргументов и автоматических переменных. Па-          
     раметры имеют положительные смещения относительно BP, которые су-          
     щественно зависят от модели памяти и числа регистров, сохраняемых          
     при вызове функциий. BP всегда указывает на сохраненную ранее ве-          
     личину BP. Функции, которые не имеют параметров и не имеют в объ-          
     явлении  аргументов,  не должны вообще использовать или сохранять          
     BP.                                                                        
                                                                                
          Автоматические переменные имеют  отрицательное  смещение  от          
     BP, первая такая переменная имеет наибольшее отрицательное смеще-          
     ние.                                                                       
                                                                                
                                                                                
                                                                                

                         - 319,320 -
                                                                                
               Сегментация памяти.                                              
     ----------------------------------------------------------------           
                                                                                
          Микропроцессор 8086 имеет сегментированную архитектуру памя-          
     ти. Он  обеспечивает общее адресное пространство величиной 1  Мб,          
     однако может прямо адресовать только 64К.  Логическую единицу па-          
     мяти размером 64К называют сегментом,  отсюда и название "сегмен-          
     тированная архитектура памяти".                                            
                                                                                
          Теперь возникают  вопросы:   сколько различных сегментов су-          
     ществует, где они располагаются и как 8086 понимает, где они рас-          
     положены?                                                                  
                                                                                
          -  8086  работает  с 4 различными сегментами: кода, данных,           
     стека и дополнительных данных.Кодовый сегмент содержит  машинную           
     программу; сегмент данных - данные; стековый сегмент - стек; до-           
     полнительный  сегмент  обычно используют для дополнительных дан-           
     ных;                                                                       
                                                                                
          - 8086 имеет 4 16-битных сегментных регистра, называемых CS,          
     DS,  SS и ES; они указывают на сегменты кода, данных, стека и до-          
     полнительных данных соответственно;                                        
                                                                                
                                                                                
          - сегмент может быть расположен  в  любом  месте  памяти.По           
     причине, которая будет рассмотрена далее, сегмент всегда начина-           
     ется с адреса, кратного 16 (в десятичной системе).                         
                                                                                
                                                                                
                                                                                
               Вычисление адреса                                                
     -----------------------------------------------------------------          
                                                                                
          Итак, каким же образом 8086 использует эти сегментные регис-          
     тры для вычисления адреса? Полный  адрес  8086  получает  из  2-х          
     16-битных  величин:  адреса сегмента и смещения. Предположим, что          
     адрес сегмента данных - величина в DS регистре - 2F84  (HEX-код),          
     и  вы  хотите  вычислить реальный адрес некоторых данных, которые          
     имеют смещение 0532 (HEX-код) от начала сегмента данных. Как  это          
     делается?                                                                  
                                                                                
          Вычисление адреса  происходит  следующим  образом:  величина          
     сегментного регистра сдвигается на 4  бита  (1  разряд  HEX-кода)          
     влево  и затем складывается со смещением. Полученная в результате          
     20-битная величина есть реальный адрес данных,  что  иллюстрирует          

                         - 321,322 -
                                                                                
     следующая запись:                                                          
                                                                                
          DS регистр (сдвинутый) 0010 1111 1000 0100 0000 = 2F840               
          смещение                    0000 0101 0011 0010 = 00532               
          адрес                  0010 1111 1101 0111 0010 = 2FD72               
                                                                                
          Начальный  адрес  сегмента  - всегда 20-битное число, однако          
     сегментный регистр содержит только 16 бит. Т.о., младшие  4  бита          
     всегда  предполагаются равными нулю. Это означает, как мы уже от-          
     мечали, что сегменты могут начинаться только с  адреса,  кратного          
     16-и, т.е. с адреса, в котором младшие 4 бита (младшая HEX-цифра)          
     нулевые.                                                                   
                                                                                
          T.о.,  если   DS-регистр  содержит величину 2F84, то сегмент          
     данных реально начинается с адреса 2F840. Как отмечалось, отрезок          
     памяти из 16 байт называется параграфом, т.е. этот сегмент всегда          
     начинается на границе параграфа.  Стандартно адрес представляется          
=, < и <=) исполь-          
     зуют только смещение.                                                      
                                                                                
          Для операторов == и != необходимы все 32 бита для того, что-          
     бы   можно   было   произвести   сравнение   с   NULL  указателем          
     (0000:0000).В противном случае, если для  проверки  равенства  вы          
     используете только смещение, то любой указатель со смещением 0000          
     будет равен NULL указателю, а это не является тем, что вы хотите.          
                                                                                
                                                                                
          Еще  вам необходимо знать следующее. Если вы прибавляете ве-