Шаг 11.
Оптимизация с помощью ассемблера.
Написание встраиваемого кода BASM. Доступ к членам структуры

    На этом шаге мы рассмотрим доступ к членам структуры.

    Встраиваемые операторы asm могут ссылаться на члены структур по имени. Однако следует быть осторожным и различать, когда инструкциям необходимо значение, а когда адрес (относительное смещение члена структуры).

    Предположим, вы объявили структуру TPoint с двумя целочисленными членами x и y. С помощью typedef (необязательно в C++, но полезно в ANSI C) вы можете объявить структуру следующим образом:

typedef struct  point {
      int x;
      int y;
   } TPoint;

    Затем можно объявить глобальную или локальную переменную с именем cursor типа TPoint:

  TPoint cursor;

    В операторах C и C++ выражения cursor.x и cursor.y ссылаются на члены переменной cursor. В операторах asm можно пользоваться аналогичными выражениями. Например, можно заменить в регистре ax значение члена у переменной cursor следующим образом:

asm mov ax, WORD PTR cursor.y    //Запомнить значение y в ax

    Для ссылки на адресное смещение относительно первого байта структуры следует воспользоваться ключевым словом OFFSET:

asm mov bx, OFFSET cursor.y      //Запомнить значение y в bx

    Можно также адресовать структуру регистрами. Например, можно запомнить в паре регистров ds:di адрес структуры cursor и запомнить значение у в регистре ax следующим образом:

asm{
      mov di, OFFSET cursor             //Запомнить местоположение cursor в di
      mov  ax, [di].y                   //Запомнить значение члена у в ax 
           }

    Регистр ds уже ссылается на глобальный сегмент данных программ. В инициализации нуждается только di. Компилятор распознает у как член структуры cursor типа TPoint. Конечно, могут возникнуть конфликты, если в еще одной структуре будет объявлен член с именем y. Вы можете решить эту проблему, указав явным образом перед членом имя структуры в круглых скобках:

asm{
      mov di, OFFSET cursor        //Запомнить местоположение cursor в di
      mov  ax, [di].(TPoint)y      //Указать какая структура имеется в виду 
           }

    На следующем шаге мы рассмотрим написание внешних модулей на Турбо ассемблере.




Предыдущий шаг Содержание Следующий шаг