Организация и функционирование ЭВМ\Лекции по организации и функционированию IBM PC - 2004\Быстрое введение в процессор типа IBM PC\
Быстрое введение в процессор типа IBM PC

Быстрое введение в процессор типа IBM PC

Назначение и структура ЭВМ

НАЗНАЧЕНИЕ : СТРУКТУРА :

Первый взгляд внутрь процессора IBM PC


Регистры IBM PC


Постановка задачи "Условное вычисление выражений"

                /  Y - ( X/A9 + B7 )       , если X*Y <  0                    
         RES = <                                                              
                \  ( Y + A9 )^2 / X*Y - B7 , если X*Y >= 0                    
                                                                              
                                                                              
         Вычислить RES для следующих наборов значений переменных              
                                                                              
                                                                              
                   X*Y < 0                    X*Y > 0                         
                                                                              
                 X   = -10                  X   =  10                         
                                                                              
                 Y   =  15                  Y   =  15                         
                                                                              
                 A9  =   9                  A9  =   9                         
                                                                              
                 B7  =   7                  B7  =   7                         
                ________________________________________       
                 RES =   9                  RES =  -4                         

Тест ассемблерной программы для IBM PC

  X     DW   -10    ; отвести в ОП слово ( 2 байта ) под переменную X = -10   
  Y     DW   15     ; отвести в ОП слово под переменную Y и занести туда 15   
  A9    DW   9      ; отвести в ОП слово под переменную A9 и занести туда  9  
  B7    DB   7      ; отвести в ОП полуслово ( 1 байт  ) под переменную B7=7  
  RES   DW   0      ; зарезервировать в ОП слово под результат и занести туд  
        MOV  AX,X   ; загрузить X в регистр AX                                
        IMUL Y      ; умножить AX на Y  результат в AX                        
        CMP  AX,0   ; сравнить AX c 0                                         
        JGE  MET    ; перейти по НЕ МЕНЬШЕ ( БОЛЬШЕ ИЛИ РАВНО ) на метку MET  
        MOV  AX,X   ; загрузить X в регистр AX                                
        CWD         ; распространение знака из AX в DX                        
        IDIV A9     ; делить DX,AX на A9 , частное - в AX , остаток - в DX    
        MOV  CX,AX  ; спрятать AX в CX                                        
        MOV  AL,B7  ; загрузить байт B7 в AL                                  
        CBW         ; распространение знака из AL в AH                        
        ADD  CX,AX  ; сложить  CX + AX результат занести в CX                 
        MOV  BX,Y   ; загрузить Y в регистр BX                                
        SUB  BX,CX  ; вычесть CX из BX  , результат занести в BX              
        JMP  FIN    ; перейти безусловно на метку FIN                         
  MET:  MOV  BX,AX  ; переслать AX в BX                                      
        MOV  AX,Y   ; загрузить Y в регистр AX                               
        ADD  AX,A9  ; сложить AX c A9 ,  результат занести в AX              
        IMUL AX     ; умножить AX на AX , результат в DX,AX                  
        IDIV BX     ; делить DX,AX на BX , частное - в AX , остаток - в BX   
        MOV  BX,AX  ; переслать AX в BX                                      
        MOV  AL,B7  ; загрузить байт B7 в AL                                 
        CBW         ; распространение знака из AL в AH                       
        SUB  BX,AX  ; вычесть полуслово B7 из регистра BX , результат  в BX  
  FIN:  MOV  RES,BX ; сохранить содержимое регистра BX в ОП по адресу RES    

Особенности умножения в IBM PC

      MOV  AX,X   загрузить X в регистр AX                                    
      IMUL Y      умножить AX на Y  результат в AX                            

При умножении, все сомножители должны быть одинаковой длины!                                                                              
      При умножении результат в общем случае требует для своего размещения    
      приемника удвоенной длины:                                              
            байт * байт       -  2 байта ( слово )                            
           слово * слово      -  4 байта ( два слова, двойное слово )         
                                                                              
      В команде IMUL операнд МОЖЕТ быть байтом ,при этом                      
           а) в качестве множителей берутся он сам и AL                       
           б) результат умножения заносится в AX                              
                                                                              
                                                                              
      ПРИМЕРЫ : IMUL B7        AL*B7 -> AX                                   
                                                                              
                IMUL DH        AL*DH -> AX                                   

     В команде IMUL операнд МОЖЕТ быть словом ,при этом                       
          а) в качестве множителей берутся он сам и AX                        
          б) результат умножения заносится в DX,AX                            
                старшая часть - в DX                                          
                младшая часть - в AX                                          
                                                                              
     ПРИМЕРЫ : IMUL Y         AX*Y  -> DX,AX                                 
                                                                              
               IMUL BX        AX*BX -> DX,AX                                 
                                                                              
   Команда IMUL НЕ устанавливает признаки результата  ( в отличие от СМ ЭВМ ) 
                поэтому НЕ допустимо сразу после IMUL использовать            
                команды условного перехода                                    
                                                                              
    ПРИМЕР :                                                                  
       MOV  AX,X   загрузить X в регистр AX                                   
       IMUL Y      умножить AX на Y  результат в AX                           
       CMP  AX,0   сравнить AX c 0                                            
       JGE  MET    перейти по НЕ МЕНЬШЕ ( БОЛЬШЕ ИЛИ РАВНО ) на метку MET     

Особенности деления в IBM PC

  MOV  AX,X   загрузить X в регистр AX                                        
  CWD         распространение знака из AX в DX                                
  IDIV A9     делить DX,AX на A9 , частное - в AX , остаток - в DX            
                                                                              
  Делимое в общем случае должно быть в 2 раза длиннее делителя                
  деление целочисленное и дает 2 результата : частное и остаток               
                                                                              
  Размножение знака перед делением ( удвоение длины делимого )       
                                                                              


  MOV  AL,DL  загрузить DL в регистр AX                                       
  CBW         распространение знака из AL в AH                                
  IDIV BH     делить    AX на BH , частное - в AL , остаток - в AH            
                                                                              
  Делимое в общем случае должно быть в 2 раза длиннее делителя                
  деление целочисленное и дает 2 результата : частное и остаток               
                                                                              
  Размножение знака перед делением ( удвоение длины делимого )                
                                                                              
     

        В команде IDIV операнд МОЖЕТ быть байтом при этом                     
                                                                              
             а) в качестве делимого  берется регистр AX                       
                                                                              
             б) результат деления заносится в AX                              
                   частное       - в AL                                       
                   остаток       - в AH                                       
                                                                              
                                                                              
       ПРИМЕРЫ :                                                              
                                                                              
             IDIV  CL        AX / CL  частное в AL,остаток в AH               
                                                                              
             IDIV  B7        AX / B7  частное в AL,остаток в AH               


        В команде IDIV операнд МОЖЕТ быть словом при этом                     
                                                                              
             а) в качестве делимого  берется пара регистров DX,AX             
                                                                              
             б) результат деления заносится в AX и DX                         
                   частное       - в AX                                       
                   остаток       - в DX                                       
                                                                              
                                                                              
       ПРИМЕРЫ :                                                              
                                                                              
             IDIV  CX     DX,AX / CX  частное в AX,остаток в DX               
                                                                              
             IDIV  Y      DX,AX / Y   частное в AX,остаток в DX               

Постановка задачи "Простейшая обработка символьных строк"

             Выполнить обратную перестановку символьной строки.               
                                                                              
             Признаком конца строки считать символ  #.                         
                                                                              

                                                                              
             ПРИМЕР                                                           
                                                                              
                   Исходная       строка   :   ABCDE#                         
                                                                              
                   Результирующая строка   :   EDCBA                          

Иллюстрация алгоритма

  НАЧАЛО:      IN = A B C D E #     - исходная строка                         
               OUT=                 - результирующая строка                   
               CX = 0               - счетчик букв в строке                   
               BX = ?               - адрес текущего символа в строке IN      
                                                                              
  ПОСЛЕ        CX = 5                                                         
  ПОДСЧЕТА     BX = ? + 5                                                     
  ДЛИНЫ        DI = ??              - адрес текущего символа в строке OUT     
                                                                              
               CX           BX       DI                                       
                            │        │                                        
               5    A B C D E #                                               
                                                                              
  ПОСЛЕ           BX                           DI                             
  ЗАВЕРШЕНИЯ      │                            │                              
  ПЕРЕНОСА     0    A B C D E #      E D C B A                                



      CX           BX       DI                            DEC CX              
                   │        │                             DEC BX              
      5    A B C D E #                                    LEA DI,OUT          
                                                    CIKL: MOV AL,[BX]         
                 BX           DI                          MOV [DI],AL         
                 │            │                           DEC BX              
      4    A B C D E #      E                             INC DI              
                                                          LOOP CIKL           
               BX               DI                                            
               │                │                                             
      3    A B C D E #      E D                                               
                                                                              
             BX                   DI                                          
             │                    │                                           
      2    A B C D E #      E D C                                             
                                                                              
           BX                       DI     CX BX                           DI 
           │                        │         │                            │  
      1    A B C D E #      E D C B        0    A B C D E #      E D C B A    

Тест ассемблерной программы для IBM PC

IN    DB  'ABCDE#'   ; отвести в ОП 6 байтов и занести туда символы ABCDE#    
OUT   DB  10 DUP (?) ; отвести в ОП 10 байтов и ничего не заносить туда       
* Подсчет длины строки                                                        
      LEA BX,IN      ; загрузить в регистр BX адрес начала строки IN          
      MOV CX,0       ; обнулить регистр CX - кол-во букв в строке             
      DEC BX         ; сместить указатель адреса в строке IN на 1 байт назад  
      MOV AL,'#'                                                              
LEN:  INC BX         ; сместить указатель адреса в строке IN на 1 байт вперед 
      INC CX         ; увеличить на 1 количество букв,обнаруженных в строке   
      CMP AL,[BX]    ; сравнить текущую букву с признаком конца #             
      JNE LEN        ; перейти по НЕ РАВНО на метку LEN                       
* Перенос символов в обратном порядке                                         
      DEC CX         ; уменьшить на 1 количество букв,обнаруженных в строке   
      DEC BX         ; сместить указатель адреса в строке IN на 1 байт назад  
      LEA DI,OUT     ; загрузить в регистр DI адрес начала строки OUT         
CIKL: MOV AL,[BX]    ; переслать 1 байт из ОП по адресу в BX в регистр AL     
      MOV [DI],AL    ; переслать 1 байт из регистра AL в ОП по адресу в BX    
      DEC BX         ; сместить указатель адреса в строке IN на 1 байт назад  
      INC DI         ; сместить указатель адреса в строке OUT на 1 байт вперед
      LOOP CIKL      ; перейти по счетчику в регистре 2 на метку CIKL