duminică, 17 noiembrie 2013

Прямой доступ к памяти SRAM. Переменные. Операции с переменными.


    Переменная - это объект,который содержит данные,которые могут изменяться.
    Для ASM переменной мы называем часть памяти , занятой этой переменной, доступной по определённому имени. Имя переменной-это метка в сегменте данных, которая представляет собой адрес части памяти, выделенной для переменной. В отличии от языков высокого уровня в ASM не существует типа переменной.  Переменная характеризуется только  именем, меткой и объёмом памяти,выделенном для данной переменной.

    Объявление переменной

    Переменная объявляется в сегменте данных .dseg и представляет собой метку, за которой следует директива предварительной обработки .byte которая предполагает бронирование части памяти для данной переменной. 

  .DSEG   ; переменные декларируются в сегменте данных

  var1 : .BYTE 1   ; декларирование переменной var1 
                   ; и бронирование 
                   ; 1 byte для этой переменной.
  var1 : .BYTE 2   ; декларирование переменной var1 
                   ; и бронирование 
                   ; 2 byte для этой переменной. 
                  
  


Чтобы лучше понять механизм объявления переменных в ASM мы представляем сравнение с объявлением переменных в C + +.

        C++     |     SIZE        |   ASM        
  char ch;     |  8 bit , 1 byte | ch: .BYTE 1
  int a;       | 32 bit , 4 byte |  a: .BYTE 4
  short int b; | 16 bit , 2 byte |  b: .BYTE 2
  long int c;  | 64 bit , 8 byte |  c: .BYTE 8
  float d;     | 32 bit , 4 byte |  d: .BYTE 4
  double e;    | 64 bit , 8 byte |  e: .BYTE 8


Операции передачи данных, при помощи переменных

Передача данных при помощи переменных должна быть исполнена при помощи команд прямого доступа к памяти,таких как:

  • LDS R, k - прямая загрузка значения адреса k из SRAM в РОН. 
  • STS k, R - прямая запись РОН в адрес k в SRAM.

Метка-имя переменной , также адрес первого местонахождения переменной. 

Назначение постоянного значения переменной
Поскольку нет команды передачи данных константы прямо в SRAM , нужно с начало поместить эти данные в РОН, после этого данные передаются прямо по адресу с именем данной переменной.

;EX: var1 = 25;
    .DSEG               ; переменная декларирована в  
                        ; сегменте данных
     var1 : .BYTE 1

    .CSEG               ; программа описывается в сегменте кода
        ldi r16, 25
        sts var1, r16    

Для переменных больше одного байта назначение выполняется для каждого байта отдельно. Метка-имя переменной-это постоянный адрес. Взяв во внимание,что компилятор выполняет операции с константами в фазе прекомпилирования , адрес следующих байт может формироваться при добавлении смещения метки  <nume var>+q,которая в свою очередб тоже является константой. 

;EX: var2 = 2345;
    .DSEG               ; переменная декларирована в  
                        ; сегменте данных
     var2 : .BYTE 2

    .CSEG               ; программа описывается в сегменте кода
        ldi r16,    LOW(2345)
        sts var2,   r16    
        ldi r16,    HIGH(2345)
        sts var2+1, r16